• 【HDOJ6638】Snowy Smile(线段树)


    题意:一个二维平面上有n个点,每个点的坐标是(x[i],y[i]),权值是w[i]

    求一个矩形使得其中所有点的权值和最大,输出权值和

    n<=2e3,x[i],y[i],w[i]的绝对值<=1e9

    思路:

      1 #include<bits/stdc++.h>
      2 using namespace std;
      3 typedef long long ll;
      4 typedef unsigned int uint;
      5 typedef unsigned long long ull;
      6 typedef pair<int,int> PII;
      7 typedef pair<ll,ll> Pll;
      8 typedef vector<int> VI;
      9 typedef vector<PII> VII;
     10 #define N  110000
     11 #define M  4100000
     12 #define fi first
     13 #define se second
     14 #define MP make_pair
     15 #define pi acos(-1)
     16 #define mem(a,b) memset(a,b,sizeof(a))
     17 #define rep(i,a,b) for(int i=(int)a;i<=(int)b;i++)
     18 #define per(i,a,b) for(int i=(int)a;i>=(int)b;i--)
     19 #define lowbit(x) x&(-x)
     20 #define Rand (rand()*(1<<16)+rand())
     21 #define id(x) ((x)<=B?(x):m-n/(x)+1)
     22 #define ls p<<1
     23 #define rs p<<1|1
     24 
     25 const ll MOD=998244353,inv2=(MOD+1)/2;
     26       double eps=1e-6;
     27       int INF=1e9;
     28 
     29 ll t1[N<<2],t2[N<<2],t3[N<<2],t4[N<<1];
     30 int x[N],y[N],w[N],X[N],Y[N];
     31 VII V[N];
     32 
     33 int read()
     34 {
     35    int v=0,f=1;
     36    char c=getchar();
     37    while(c<48||57<c) {if(c=='-') f=-1; c=getchar();}
     38    while(48<=c&&c<=57) v=(v<<3)+v+v+c-48,c=getchar();
     39    return v*f;
     40 }
     41 
     42 void clear(int l,int r,int p)
     43 {
     44     t1[p]=t2[p]=t3[p]=t4[p]=0;
     45     if(l==r) return;
     46     int mid=(l+r)>>1;
     47     clear(l,mid,ls);
     48     clear(mid+1,r,rs);
     49 }
     50 
     51 void pushup(int p)
     52 {
     53     t1[p]=t1[ls]+t1[rs];
     54     t2[p]=max(t2[ls],t1[ls]+t2[rs]);
     55     t3[p]=max(t3[rs],t1[rs]+t3[ls]);
     56     t4[p]=max(max(t4[ls],t4[rs]),t3[ls]+t2[rs]);
     57 }
     58 
     59 void update(int l,int r,int x,int v,int p)
     60 {
     61     if(l==r)
     62     {
     63         t1[p]+=v;
     64         t2[p]=t3[p]=t4[p]=max(t1[p],0ll);
     65         return;
     66     }
     67     int mid=(l+r)>>1;
     68     if(x<=mid) update(l,mid,x,v,ls);
     69      else update(mid+1,r,x,v,rs);
     70     pushup(p);
     71 }
     72 
     73 int main()
     74 {
     75     //freopen("1.in","r",stdin);
     76     int cas=read();
     77     while(cas--)
     78     {
     79         int n=read();
     80         X[0]=Y[0]=0;
     81         rep(i,1,n)
     82         {
     83             x[i]=read(),y[i]=read(),w[i]=read();
     84             X[++X[0]]=x[i];
     85             Y[++Y[0]]=y[i];
     86         }
     87         sort(X+1,X+X[0]+1);
     88         sort(Y+1,Y+Y[0]+1);
     89         X[0]=unique(X+1,X+X[0]+1)-X-1;
     90         Y[0]=unique(Y+1,Y+Y[0]+1)-Y-1;
     91         rep(i,1,n)
     92         {
     93             x[i]=lower_bound(X+1,X+X[0]+1,x[i])-X;
     94             y[i]=lower_bound(Y+1,Y+Y[0]+1,y[i])-Y;
     95         }
     96         rep(i,1,X[0]) VII().swap(V[i]);
     97         rep(i,1,n) V[x[i]].push_back(MP(y[i],w[i]));
     98         //printf("isok
    ");
     99         ll ans=0;
    100         rep(i,1,X[0])
    101         {
    102             clear(1,Y[0],1);
    103             rep(j,i,X[0])
    104             {
    105                 for(int k=0;k<V[j].size();k++) update(1,Y[0],V[j][k].fi,V[j][k].se,1);
    106                 ans=max(ans,t4[1]);
    107             }
    108         }
    109         printf("%I64d
    ",ans);
    110     }
    111 
    112     return 0;
    113 }
  • 相关阅读:
    Windows XP上可以安装的SQL Server 2008版本
  • 原文地址:https://www.cnblogs.com/myx12345/p/11650497.html
Copyright © 2020-2023  润新知