• COJ 0986 WZJ的数据结构(负十四) 区间动态k大


    题解:哈哈哈我过了!!!主席树+树状数组写起来还真是hentai啊。。。

    在这里必须分享我的一个沙茶错!!!看这段代码:

    void get(int x,int d){
        if(!d)for(lt[ltot=1]=root[x];x;x-=x&-x)if(c[x])lt[++ltot]=c[x];
        else  for(rt[rtot=1]=root[x];x;x-=x&-x)if(c[x])rt[++rtot]=c[x];return;
    }

    似乎挺正常是吧?而且缩进也很优美对不对!!!

    可是!!!!!!!!窝萌发现它是错的!!!!!!!!!!

    因为下面那个else跟上面的if配对了!!!!!!所以这段程序其实是这样的:

    void get(int x,int d){
        if(!d)for(lt[ltot=1]=root[x];x;x-=x&-x){
            if(c[x])lt[++ltot]=c[x];
            else{
                for(rt[rtot=1]=root[x];x;x-=x&-x)
                if(c[x])rt[++rtot]=c[x];
            }
        }return;
    }

    我要疯了!!!!!!!!!!!!!!!!!!!

     1 #include<iostream>
     2 #include<cstdio>
     3 #include<cmath>
     4 #include<algorithm>
     5 #include<queue>
     6 #include<cstring>
     7 #define PAU putchar(' ')
     8 #define ENT putchar('
    ')
     9 #define CH for(int d=0;d<2;d++)if(ch[d])
    10 #define lson ls(x),y->ch[0],L,M
    11 #define rson rs(x),y->ch[1],M+1,R
    12 using namespace std;
    13 const int maxn=100000+10,maxnode=20000000+10,inf=-1u>>1,vl=1,vr=100000;
    14 struct node{
    15     node*ch[2];int siz;node(){siz=0;}
    16 }pol[maxnode],*nodecnt=pol,*root[maxn],*c[maxn],*lt[maxn],*rt[maxn];int ltot,rtot;
    17 node*ls(node*x){return x?x->ch[0]:x;}
    18 node*rs(node*x){return x?x->ch[1]:x;}
    19 int sz(node*x){return x?x->siz:0;}
    20 int n,m,A[maxn],cv;
    21 void build(int v,int pos,node*x,node*&y,int L=vl,int R=vr){
    22     y=nodecnt++;y->siz=sz(x)+v;if(L==R)return;int M=L+R>>1;
    23     if(pos<=M)y->ch[1]=rs(x),build(v,pos,lson);else y->ch[0]=ls(x),build(v,pos,rson);return;
    24 }
    25 void update(int x,int v){
    26     for(int w=x;w<=n;w+=w&-w)build(-1,A[x],c[w],c[w]);
    27     for(int w=x;w<=n;w+=w&-w)build(1,A[x]=v,c[w],c[w]);return;
    28 }
    29 void get(int x,int d){
    30     if(!d){for(lt[ltot=1]=root[x];x;x-=x&-x)if(c[x])lt[++ltot]=c[x];}
    31     else  {for(rt[rtot=1]=root[x];x;x-=x&-x)if(c[x])rt[++rtot]=c[x];}return;
    32 }
    33 inline int read(){
    34     int x=0,sig=1;char ch=getchar();
    35     for(;!isdigit(ch);ch=getchar())if(ch=='-')sig=0;
    36     for(;isdigit(ch);ch=getchar())x=10*x+ch-'0';
    37     return sig?x:-x;
    38 }
    39 inline void write(int x){
    40     if(x==0){putchar('0');return;}if(x<0)putchar('-'),x=-x;
    41     int len=0,buf[15];while(x)buf[len++]=x%10,x/=10;
    42     for(int i=len-1;i>=0;i--)putchar(buf[i]+'0');return;
    43 }
    44 void init(){
    45     n=read();m=read();
    46     for(int i=1;i<=n;i++)build(1,A[i]=read(),root[i-1],root[i]);
    47     return;
    48 }
    49 void work(){
    50     int x,y,v;
    51     while(m--){
    52         if(!read())x=read(),v=read(),update(x,v);
    53         else{x=read();y=read();v=read();
    54             get(x-1,0);get(y,1);int L=vl,R=vr,M,kth;
    55             while(L<R){M=L+R>>1;kth=0;//printf("%d %d %d %d
    ",L,R,ltot,rtot);
    56                 for(int i=1;i<=ltot;i++)kth-=sz(ls(lt[i]));
    57                 for(int i=1;i<=rtot;i++)kth+=sz(ls(rt[i]));
    58                 if(kth>=v){R=M;
    59                     for(int i=1;i<=ltot;i++)lt[i]=ls(lt[i]);
    60                     for(int i=1;i<=rtot;i++)rt[i]=ls(rt[i]);
    61                 }else{L=M+1;v-=kth;
    62                     for(int i=1;i<=ltot;i++)lt[i]=rs(lt[i]);
    63                     for(int i=1;i<=rtot;i++)rt[i]=rs(rt[i]);
    64                 }
    65             }write(L);ENT;
    66         }
    67     }
    68     return;
    69 }
    70 void print(){
    71     return;
    72 }
    73 int main(){init();work();print();return 0;}
  • 相关阅读:
    python-判断
    python-文件读写
    python-数据类型
    python简介
    Charles--简单使用
    【模拟赛】BYVoid魔兽世界模拟赛 解题报告
    【最短路】埃雷萨拉斯寻宝(eldrethalas) 解题报告
    【递推】地铁重组(subway) 解题报告
    【背包型动态规划】灵魂分流药剂(soultap) 解题报告
    【最短路】血色先锋军(scarlet) 解题报告
  • 原文地址:https://www.cnblogs.com/chxer/p/4670137.html
Copyright © 2020-2023  润新知