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
",tot[i]);
84     return 0;
85 }
原文地址:https://www.cnblogs.com/ccd2333/p/6482358.html