【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\n"); 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\n",ans); 110 } 111 112 return 0; 113 }
null