• 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 }
  • 相关阅读:
    python参考手册--第3章类型和对象
    python参考手册--第2章词汇和语法约定
    Kafka 分布式环境搭建
    常用sql语句
    ValueError: Attempted relative import in non-package
    mysql查询缓存
    secureCRT配色
    mysql deadlock处理
    How to Cope with Deadlocks
    ajax同步
  • 原文地址:https://www.cnblogs.com/ccd2333/p/6482358.html
Copyright © 2020-2023  润新知