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(‘\n‘)
 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\n",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;}
时间: 2024-07-30 13:30:45

COJ 0986 WZJ的数据结构(负十四) 区间动态k大的相关文章

COJ 1010 WZJ的数据结构(十) 线段树区间操作

传送门:http://oj.cnuschool.org.cn/oj/home/problem.htm?problemID=1001 WZJ的数据结构(十) 难度级别:D: 运行时间限制:3000ms: 运行空间限制:51200KB: 代码长度限制:2000000B 试题描述 请你设计一个数据结构,高效执行以下过程: #include<iostream>using namespace std;const int maxn=100010;int A[maxn];int tp,ql,qr,v;int

COJ 1010 WZJ的数据结构(十) 线段树的地狱

传送门:http://oj.cnuschool.org.cn/oj/home/problem.htm?problemID=1001 WZJ的数据结构(十) 难度级别:D: 运行时间限制:3000ms: 运行空间限制:51200KB: 代码长度限制:2000000B 试题描述 请你设计一个数据结构,高效执行以下过程: #include<iostream>using namespace std;const int maxn=100010;int A[maxn];int tp,ql,qr,v;int

COJ0986:WZJ的数据结构(负十四)

WZJ的数据结构(负十四) 难度级别:D: 运行时间限制:6000ms: 运行空间限制:262144KB: 代码长度限制:2000000B 试题描述 请你设计一个数据结构,完成以下功能: 给定一个大小为N的整数组A,M次操作,操作分两种: 1.1 i j k 每次询问给你i,j,k三个参数,求Ai至Aj中第k小的数. 2.0 x v 每次操作给你x,v两个参数,将A[x]改成v. 输入 第一行为两个正整数N,M.第二行为N个正整数Ai.接下来M行为操作. 输出 对于每个询问输出答案(保证k合法)

14. 蛤蟆的数据结构进阶十四排序实现之简单选择排序

14. 蛤蟆的数据结构进阶十四排序实现之简单选择排序 本篇名言:"即是我们是一支蜡烛也应该 " 蜡烛成灰泪始干 " 即使我们只是一根火柴也要在关键时刻有一次闪耀即使我们死后尸骨都腐烂了解也要变成磷火在荒野中燃烧. -- 艾青" 继续来看什么是简单选择排序. 欢迎转载,转载请标明出处: 1.  简单选择排序 设所排序序列的记录个数为n.i取1,2,-,n-1,从所有n-i+1个记录(Ri,Ri+1,-,Rn)中找出排序码最小的记录,与第i个记录交换.执行n-1趟后就完

数据结构(十四)——二叉树

数据结构(十四)--二叉树 一.二叉树简介 1.二叉树简介 二叉树是由n(n>=0)个结点组成的有序集合,集合或者为空,或者是由一个根节点加上两棵分别称为左子树和右子树的.互不相交的二叉树组成.二叉树的五种形态: 2.二叉树的存储结构模型 树的另一种表示法:孩子兄弟表示法A.每个结点都有一个指向其第一个孩子的指针B.每个结点都有一个指向其第一个右兄弟的指针孩子兄弟表示法的特性:A.能够表示任意的树形结构B.每个结点包含一个数据成员和两个指针成员C.孩子结点指针和兄弟结点指针构成树杈 3.满二叉树

COJ 0970 WZJ的数据结构(负三十)树分治

WZJ的数据结构(负三十) 难度级别:D: 运行时间限制:1000ms: 运行空间限制:262144KB: 代码长度限制:2000000B 试题描述 给你一棵N个点的无根树,点和边上均有权值.请你设计一个数据结构,回答M次操作. 1 x v:对于树上的每一个节点y,如果将x.y在树上的距离记为d,那么将y节点的权值加上d*v. 2 x:询问节点x的权值. 输入 第一行为一个正整数N.第二行到第N行每行三个正整数ui,vi,wi.表示一条树边从ui到vi,距离为wi.第N+1行为一个正整数M.最后

COJ 0981 WZJ的数据结构(负十九)树综合

WZJ的数据结构(负十九) 难度级别:E: 运行时间限制:15000ms: 运行空间限制:262144KB: 代码长度限制:2000000B 试题描述 WZJ的数据结构中有很多都是关于树的.这让很多练习模板的同学还要找来找去很不爽,于是WZJ跟小伙伴们一块商量如何将这些题汇拢到一块去: WZJ:为了大家简单,我规定一开始是一棵有根树. LZJ:那我一定得加上换根操作喽. XJR:链信息修改,链信息增加,链信息翻倍,维护链信息的最大,最小,总和肯定很好做. CHX:子树信息修改,子树信息增加,子树

COJ 0979 WZJ的数据结构(负二十一)

WZJ的数据结构(负二十一) 难度级别:C: 运行时间限制:5000ms: 运行空间限制:262144KB: 代码长度限制:2000000B 试题描述 请你实现一个数据结构,完成这样的功能: 给你一个N个点的图,初始状态无边. 每次加入一条双向边(u,v,w),若加入后没有构成一棵生成树,输出“Not Yet”,否则输出当前最小生成树的权值. 输入 第一行两个正整数N,M.表示有N个点M个操作.接下来M行每行三个正整数u,v,w. 输出 每次加入一条双向边(u,v,w),若加入后没有构成一棵生成

COJ 0995 WZJ的数据结构(负五)区间操作

WZJ的数据结构(负五) 难度级别:C: 运行时间限制:1000ms: 运行空间限制:262144KB: 代码长度限制:2000000B 试题描述 请你设计一个数据结构,完成以下功能: 给定一个大小为N的整数组A,要求你回答执行M次操作.操作分两种: 操作1:每次操作给你l,r,v三个参数,求Al至Ar中值<=v的个数. 操作2:每次操作给你l,r,v三个参数,将Al至Ar中每个数的值+v. 输入 第一行为一个正整数N.第二行为N个整数Ai.第三行为一个正整数M.接下来M行每行4个正整数t,l,