bzoj 3262: 陌上花开
花形(s)、颜色(c)、气味(m),三维,第一维排序,二三维树套树(树状数组套平衡树就好(都是维护比某个权值小的个数就好))
(2333,语文太虚 bug、、、、)
1 #include<bits/stdc++.h> 2 #define N 100005 3 #define M 5000005 4 #define LL long long 5 #define inf 0x3f3f3f3f 6 #define lowbit(x) x&(-x) 7 using namespace std; 8 inline int ra() 9 { 10 int x=0,f=1; char ch=getchar(); 11 while (ch<'0' || ch>'9') {if (ch=='-') f=-1; ch=getchar();} 12 while (ch>='0' && ch<='9') {x=x*10+ch-'0'; ch=getchar();} 13 return x*f; 14 } 15 int sum[N<<1]; 16 int n,k,sz,tot[N<<1]; 17 struct node{int x,y,z;}a[N<<1]; 18 int c[N<<1],ls[M],rs[M],s[M],w[M],rnd[M],v[M],root[M]; 19 bool cmp(node a, node b) 20 { 21 if (a.x==b.x) 22 { 23 if (a.y==b.y) return a.z<b.z; 24 return a.y<b.y; 25 } 26 return a.x<b.x; 27 } 28 void update(int k){s[k]=s[ls[k]]+s[rs[k]]+w[k];} 29 void rturn(int &k){int t=ls[k]; ls[k]=rs[t]; rs[t]=k; s[t]=s[k]; update(k); k=t;} 30 void lturn(int &k){int t=rs[k]; rs[k]=ls[t]; ls[t]=k; s[t]=s[k]; update(k); k=t;} 31 void insert(int &k, int num) 32 { 33 if (!k){ 34 k=++sz; v[k]=num; w[k]=s[k]=1; rnd[k]=rand(); return; 35 } 36 s[k]++; 37 if (v[k]==num) w[k]++; 38 else if (num<v[k]) {insert(ls[k],num); if (rnd[ls[k]]<rnd[rs[k]]) rturn(k);} 39 else {insert(rs[k],num); if (rnd[rs[k]]<rnd[k]) lturn(k);} 40 } 41 void add(int y, int z) 42 { 43 while (y<=k) 44 { 45 c[y]++; 46 insert(root[y],z); 47 y+=lowbit(y); 48 } 49 } 50 int find(int k, int num) 51 { 52 if (!k) return 0; 53 if (num==v[k]) return s[ls[k]]+w[k]; 54 else if (num<v[k]) return find(ls[k],num); 55 else return s[ls[k]]+w[k]+find(rs[k],num); 56 } 57 int ask(int y, int z) 58 { 59 int toty=0,totz=0; 60 while (y) 61 { 62 toty+=c[y]; //可加可不加2333这是完蛋(为什么加了会快300ms,,,,(雾)) 63 totz+=find(root[y],z); 64 y-=lowbit(y); 65 } 66 return min(toty,totz); 67 } 68 int main() 69 { 70 n=ra(); k=ra(); 71 for (int i=1; i<=n; i++) 72 a[i].x=ra(),a[i].y=ra(),a[i].z=ra(); 73 sort(a+1,a+n+1,cmp); 74 for (int i=1; i<=n; i++) 75 { 76 if (a[i].x==a[i+1].x && a[i].y==a[i+1].y && a[i].z==a[i+1].z && i!=n) //为什么要加这个??!! 77 sum[i+1]+=sum[i]+1; //哦!!!要是不加的话,都相等的情况就不对了,(两个都完全相同的花等级应该是一样的啊)、、、 78 else //感觉好扯淡233,明明说的是大于等于就行,bug啊2333 79 tot[ask(a[i].y,a[i].z)]+=sum[i]+1; 80 add(a[i].y,a[i].z); 81 } 82 for (int i=0; i<n; i++) 83 printf("%d\n",tot[i]); 84 return 0; 85 }