当前位置: 首页 > news >正文

[bzoj1901]: Zju2112 Dynamic Rankings

  人生第一道树套树。。(虽然暑假就写了= =)

  这题是树状数组里面套个可持久化线段树。。。一开始想反了然后发现完全不会写TAT

  一般的树状数组操作的时候是直接修改数组里的值的,套上可持久化线段树后就变成在相应的那颗线段树里面修改了。

  修改操作就一个一个改,但查询第k大的时候要先把对应的线段树都存起来,然后一起算。。。

  具体见代码吧= =

 1 #include<cstdio>
 2 #include<iostream>
 3 #include<cstring>
 4 #include<algorithm>
 5 #define rep1()for(register int i=1;i<=len1;i++)
 6 #define rep2()for(register int i=1;i<=len2;i++)
 7 using namespace std;
 8 const int maxn=20233;
 9 int num[maxn*17*17],lc[maxn*17*17],rc[maxn*17*17],rt[maxn];
10 int L[20],R[20];
11 struct zs{
12     int num,id;
13 }a[maxn];
14 struct ask{
15     int l,r,x;
16     bool id;
17 }q[10023];
18 int b[maxn],c[maxn];
19 int i,j,cnt,n,m,tot,len1,len2;
20  
21 int ra;char rx;
22 inline int read(){
23     rx=getchar(),ra=0;
24     while(rx<'0'||rx>'9')rx=getchar();
25     while(rx>='0'&&rx<='9')ra*=10,ra+=rx-48,rx=getchar();return ra;
26 }
27  
28 inline int sum1(){int sum=0;rep1()sum+=num[L[i]];return sum;}
29 inline int sum2(){int sum=0;rep2()sum+=num[R[i]];return sum;}
30  
31 inline void run1(int x){for(len1=0;x;x-=x&(-x))L[++len1]=rt[x];}
32 inline void run2(int x){for(len2=0;x;x-=x&(-x))R[++len2]=rt[x];}
33  
34 void ins(int pre,int &now,int l,int r,int v){
35     now=++tot;num[now]=num[pre]+1;
36     if(l==r)return;int mid=(l+r)>>1;
37     if(v<=mid)rc[now]=rc[pre],ins(lc[pre],lc[now],l,mid,v);
38     else lc[now]=lc[pre],ins(rc[pre],rc[now],mid+1,r,v);
39 }
40 int query(int l,int r,int k){
41     if(l==r)return l;
42     int mid=(l+r)>>1,lsize=0;
43     rep1()lsize-=num[lc[L[i]]];rep2()lsize+=num[lc[R[i]]];
44     if(lsize>=k){
45         rep1()L[i]=lc[L[i]];rep2()R[i]=lc[R[i]];
46         return query(l,mid,k);
47     }else{
48         rep1()L[i]=rc[L[i]];rep2()R[i]=rc[R[i]];
49         return query(mid+1,r,k-lsize);
50     }
51 }
52 void change(int pre,int &now,int l,int r,int v,bool del){
53     now=++tot,num[now]=num[pre]-(del?1:-1);
54     if(l==r)return;int mid=(l+r)>>1;
55     if(v<=mid)rc[now]=rc[pre],change(lc[pre],lc[now],l,mid,v,del);
56     else lc[now]=lc[pre],change(rc[pre],rc[now],mid+1,r,v,del);
57 }
58 void build(int l,int r,int &x){
59     x=++tot;
60     if(l==r)build(l,(l+r)>>1,lc[x]),build(((l+r)>>1)+1,r,rc[x]);
61 }
62 bool cmp(zs a,zs b){return a.num<b.num;}
63 int main(){
64     n=read(),m=read();cnt=n;
65     for(i=1;i<=n;i++)a[i].num=read(),a[i].id=i;char rx;
66     for(i=1;i<=m;i++){
67         for(rx=getchar();rx!='Q'&&rx!='C';rx=getchar());
68         q[i].id=(rx=='Q');
69         if(q[i].id)q[i].l=read(),q[i].r=read(),q[i].x=read();
70             else q[i].l=read(),a[++cnt].num=q[i].x=read(),a[cnt].id=i+n;
71     }
72     sort(a+1,a+1+cnt,cmp);int tmp=cnt;
73      
74     for(i=1,cnt=0;i<=tmp;i++){
75         if(i==1||a[i].num!=a[i-1].num)c[++cnt]=a[i].num;
76         b[a[i].id]=cnt;if(a[i].id>n)q[a[i].id-n].x=cnt;
77     }
78     build(1,cnt,rt[0]);for(i=1;i<=n;i++)rt[i]=rt[0];
79 //  for(i=1;i<=m;i++)if(q[i].id)printf("    %d\n",q[i].x);
80     for(i=1;i<=n;i++)for(j=i;j<=n;j+=j&(-j))ins(rt[j],rt[j],1,cnt,b[i]);
81     for(i=1;i<=m;i++){
82         if(q[i].id){
83             run1(q[i].l-1),run2(q[i].r);
84     //      printf("    %d--%d       %d %d\n",q[i].l,q[i].r,len1,len2);
85     //      for(j=1;j<=len1;j++)printf("  %d",L[j]);puts("!!");for(j=1;j<=len2;j++)printf("  %d",R[j]);puts("");puts("!");
86             printf("%d\n",c[query(1,cnt,q[i].x)]);
87         }
88         else {
89             for(j=q[i].l;j<=n;j+=j&(-j))change(rt[j],rt[j],1,cnt,b[q[i].l],1);
90             for(j=q[i].l;j<=n;j+=j&(-j))change(rt[j],rt[j],1,cnt,q[i].x,0);
91             b[q[i].l]=q[i].x;
92         }
93     }
94     return 0;
95 }
View Code

 

转载于:https://www.cnblogs.com/czllgzmzl/p/5127219.html

相关文章:

  • 好玩的软件 Aura 模拟自然界中的音效,让你置身大自然。
  • Intent基本使用
  • Xcode快捷键
  • 图片去水印工具 Inpaint 3.0
  • FlexSlider是一个非常出色的jQuery滑动切换插件
  • 电脑屏幕旋转工具 躺着看才舒服。
  • UESTC--1265--宝贵资源(简单数学)
  • 删除无法删除的文件
  • 多线程篇-RunLoop
  • 上传图片文件
  • XP仿Windows7主题包 不占内存的。
  • Divide and conquer:Moo University - Financial Aid(POJ 2010)
  • 万能摄像头驱动最新版 还有万能摄像头驱动怎么用的教程
  • HTML5的学习(三)HTML5标签
  • on-tap和on-click
  • [ JavaScript ] 数据结构与算法 —— 链表
  • Angular 响应式表单之下拉框
  • CNN 在图像分割中的简史:从 R-CNN 到 Mask R-CNN
  • ERLANG 网工修炼笔记 ---- UDP
  • javascript 哈希表
  • js
  • JS专题之继承
  • KMP算法及优化
  • mac修复ab及siege安装
  • Making An Indicator With Pure CSS
  • Mybatis初体验
  • Promise面试题,控制异步流程
  • Storybook 5.0正式发布:有史以来变化最大的版本\n
  • ⭐ Unity 开发bug —— 打包后shader失效或者bug (我这里用Shader做两张图片的合并发现了问题)
  • 给自己的博客网站加上酷炫的初音未来音乐游戏?
  • 开源中国专访:Chameleon原理首发,其它跨多端统一框架都是假的?
  • 离散点最小(凸)包围边界查找
  • 思考 CSS 架构
  • 微信公众号开发小记——5.python微信红包
  • 微信小程序开发问题汇总
  • 我感觉这是史上最牛的防sql注入方法类
  • 写代码的正确姿势
  • 一个SAP顾问在美国的这些年
  • 关于Android全面屏虚拟导航栏的适配总结
  • ​​​​​​​​​​​​​​汽车网络信息安全分析方法论
  • ## 1.3.Git命令
  • $.ajax()
  • (4)(4.6) Triducer
  • (7)摄像机和云台
  • (webRTC、RecordRTC):navigator.mediaDevices undefined
  • (补)B+树一些思想
  • (附源码)ssm教师工作量核算统计系统 毕业设计 162307
  • (十二)springboot实战——SSE服务推送事件案例实现
  • (贪心 + 双指针) LeetCode 455. 分发饼干
  • (转)IIS6 ASP 0251超过响应缓冲区限制错误的解决方法
  • (转)linux自定义开机启动服务和chkconfig使用方法
  • .[backups@airmail.cc].faust勒索病毒的最新威胁:如何恢复您的数据?
  • .Net OpenCVSharp生成灰度图和二值图
  • .Net 基于.Net8开发的一个Asp.Net Core Webapi小型易用框架
  • .netcore 如何获取系统中所有session_如何把百度推广中获取的线索(基木鱼,电话,百度商桥等)同步到企业微信或者企业CRM等企业营销系统中...