Problem C: [noip2016十连测第三场]序列

Time Limit: 10 Sec  Memory Limit: 256 MB
Submit: 78  Solved: 32
[Submit][Status][Web Board]

Description

小A把自己之前得到的序列展示给了小B,不过这一次,他并不要求小B模仿他之前的行为。他给了小B一些询问,每个询问都是lrx的形式,要求小B数出在序列的第l个到第r个元素中有多少是不小于x的。小B很快就算出来了。小A很不甘心,于是要求动态修改这个序列……这样,他只要求每次修改后求出所有询问答案的和即可。然而小B还是很快就算出来了,小A很生气,于是把问题抛给了你。

Input

由于一些原因,本题采取一定的方式加密了修改操作。第一行三个整数nmq,分别表示序列长度、询问个数和修改次数。第二行n个正整数描述序列。接下来m行每行三个数lrx,表示一次询问。最后q行每行两个数pv,表示把p^lastans这个位置上的数修改成v^lastans(其中lastans指上次修改之后的答案,初始即为没有修改过的原序列的询问答案,^为异或符号,C/C++中为^,pascal中为xor)。
【 数据范围与约定】
对于 20%的数据, n,m,q≤100
对于 40%的数据, n,m,q≤1000
对于 100%的数据, n,m,q≤100000, 序列中的数( 包括修改后的)
均为正数且不超过 n, 保证数据合法。

Output

q+1行每行一个整数,第一行表示原序列的所有询问答案之和,后面q行表示每次修改之后的序列的所有询问答案之和。

Sample Input

4 2 2
1 4 2 3
2 4 3
1 3 2
6 6
2 7

Sample Output

4
3
4

HINT

【题解】【静态主席树+前缀和维护】
【NOIP考主席树。。。hehehe】
【先建一棵主席树,外层以每个位置为根的标号建树,内层权值线段树,首次询问时在[root[l] - root[r] ]里查询[x,n]】
【然后重新建树,外层以每次询问的x为根的标号建树,内层维护有多少个包含当前点的区间,前缀和维护,查询时,如果原数小于当前要更改为的元素,那么要加上中间这一段的答案;反之,要减去中间差的这一段的答案】
#include<cstdio>
#include<cstring>
#include<algorithm>
#define ll long long
using namespace std;
struct node{int Left,Right;ll num;
}tree[5000010];
struct question{int qL,qR,k;
}que[100010];
ll ans;
int a[100010],root[100010];
int n,m,q,sz;int tmp(question a,question b)
{return a.k<b.k;
}void build(int &now,int l,int r,int x)
{tree[++sz]=tree[now]; now=sz;tree[now].num++;if(l==r) return;int mid=(l+r)>>1;if(x<=mid) build(tree[now].Left,l,mid,x);if(x>mid) build(tree[now].Right,mid+1,r,x);
}
ll ask(int x,int y,int l,int r,int al,int ar)
{if(al<=l&&r<=ar) return tree[y].num-tree[x].num;int mid=(l+r)>>1;ll sum=0;if(al<=mid) sum+=ask(tree[x].Left,tree[y].Left,l,mid,al,ar);if(ar>mid) sum+=ask(tree[x].Right,tree[y].Right,mid+1,r,al,ar);return sum;
}void rebuild(int&now,int l,int r,int top,int al,int ar,int opt)
{if(!opt||now<top) tree[++sz]=tree[now],now=sz;if(al<=l&&r<=ar) {tree[now].num++; return;}int mid=(l+r)>>1;if(al<=mid) rebuild(tree[now].Left,l,mid,top,al,ar,opt);if(ar>mid) rebuild(tree[now].Right,mid+1,r,top,al,ar,opt);
}
ll query(int x,int y,int l,int r,int val)
{if(l==r) return tree[y].num-tree[x].num;int mid=(l+r)>>1;ll sum=tree[y].num-tree[x].num;if(val<=mid) sum+=query(tree[x].Left,tree[y].Left,l,mid,val);if(val>mid) sum+=query(tree[x].Right,tree[y].Right,mid+1,r,val);return sum;
}
int main()
{freopen("int.txt","r",stdin);freopen("my.txt","w",stdout);int i,j;scanf("%d%d%d",&n,&m,&q);for(i=1;i<=n;++i){scanf("%d",&a[i]);root[i]=root[i-1];build(root[i],1,n,a[i]);}for(i=1;i<=m;++i){scanf("%d%d%d",&que[i].qL,&que[i].qR,&que[i].k);ans+=ask(root[que[i].qL-1],root[que[i].qR],1,n,que[i].k,n);}printf("%lld\n",ans);sort(que+1,que+m+1,tmp);memset(tree,0,sizeof(tree));int t=1; sz=0;for(i=1;i<=n;++i){root[i]=root[i-1];j=t;if(que[t].k!=i) continue;rebuild(root[i],1,n,0,que[t].qL,que[t].qR,0);while(j<=m&&que[t].k==que[j].k) ++j;for(int l=t+1;l<j;++l) rebuild(root[i],1,n,root[i],que[l].qL,que[l].qR,1);if(j>m) break; t=j;}for(i=que[m].k+1;i<=n;++i) root[i]=root[i-1];for(i=1;i<=q;++i){ll site,val;scanf("%lld%lld",&site,&val);site^=ans; val^=ans;if(a[site]<val) ans+=query(root[a[site]],root[val],1,n,site);if(a[site]>val) ans-=query(root[val],root[a[site]],1,n,site);a[site]=val;printf("%lld\n",ans);}return 0;}

转载于:https://www.cnblogs.com/lris-searching/p/9402909.html

【bzoj 十连测】[noip2016十连测第三场]Problem C: 序列(静态主席树)相关推荐

  1. 测试底妆的软件,倒了半瓶粉底液测了十颗美妆蛋 终于找到最好用的啦

    文章来源:十点种草微信公众号 原标题:倒了半瓶粉底液,测了十颗美妆蛋,终于找到最好用的啦! 作者:蕉妹 有句话是这样说的:工欲善其事,必先利其器.想要把这个妆容学会,首先你得准备好需要的工具,装备齐了 ...

  2. pythonpost四种方式自杀未遂_自测练习十二

     自测练习十二  所属章节  第十二讲 青少年的心理社会问题 / 自测练习  分值  0  截止提交时间  2013.06.15  作业类型  必做作业 第十二讲 练习题 一.概念解 ...

  3. 雷军一往无前的十年(小米十周年公开演讲)附赠《一往无前》电子书籍

    ▲雷军 | 中国企业家俱乐部理事.小米科技董事长 做全球最好的手机,只卖一半的价钱,让每个人都能买得起--如何能够实现这个看上去.听上去都不靠谱的目标? 来源 | 雷军公众号分享 | 雷军 2020年 ...

  4. jdk自带压测工具_jmeter压测工具

    一.目录文件讲解 目录 bin:核心可执行文件,包含配置 mac/linux:使用jmeter启动 windows:使用jmeter.bat启动 jmeter-server:mac/linux分布式压 ...

  5. 视觉 SLAM 十四讲 —— 第十三讲 建图

    视觉 SLAM 十四讲 -- 第十三讲 建图 在前端和后端中,我们重点关注同时估计相机运动轨迹与特征点空间位置的问题.然而,在实际使用 SLAM 时,除了对相机本体进行定位之外,还存在许多其他的需求. ...

  6. 人生,能有多少个十年?| PMCAFF 十年故事

    PMCAFF(www.pmcaff.com):互联网产品社区,是百度,腾讯,阿里等产品经理的学习交流平台.定期出品深度产品观察,互联产品研究首选. 外包大师(www.waibaodashi.com): ...

  7. 八十八、Python | 十大排序算法系列(下篇)

    @Author:Runsen @Date:2020/7/10 人生最重要的不是所站的位置,而是内心所朝的方向.只要我在每篇博文中写得自己体会,修炼身心:在每天的不断重复学习中,耐住寂寞,练就真功,不畏 ...

  8. 如何做好性能压测(一)丨压测环境设计和搭建

    简介:如何做好性能压测(一)丨压测环境设计和搭建 一般来说,保证执行性能压测的环境和生产环境高度一致是执行一次有效性能压测的首要原则.有时候,即便是压测环境和生产环境有很细微的差别,都有可能导致整个压 ...

  9. 秒杀多线程第十六篇 多线程十大经典案例之一 双线程读写队列数据

    本文配套程序下载地址为:http://download.csdn.net/detail/morewindows/5136035 转载请标明出处,原文地址:http://blog.csdn.net/mo ...

最新文章

  1. GNU make manual 翻译(一)
  2. SharePoint 2010 文档库添加文件icon
  3. 官方剧透:1.11 发版前我们偷看了 Flink 中文社区发起人的聊天记录
  4. ROS 常用命令汇总(不定期更新)
  5. Android之使用PopupWindow使用和总结
  6. itchat 道歉_人类的“道歉”
  7. Thinkphp js、css压缩类minify
  8. 01-object类,常用API
  9. Caffe之DataTransformer
  10. MySQL(6)--- 创建数据库
  11. 【随笔】hi3531D 音频
  12. python做积分计算器_PyQt5练习:积分计算器
  13. PSPNet运行及训练
  14. 软考-软件工程师常用公式及知识点
  15. SMART原则助你设定有效目标
  16. pytorch制作数据集
  17. 我是太阳因为自信才会把你照亮—2015许小乖的IT之路
  18. Excel表格视图受保护,无法编辑,怎么解除视图保护?
  19. SpringBoot专栏 | SpringBoot2.x系列教程之花样配置--自定义Banner
  20. locate用主动还是被动_主动形式表被动意义

热门文章

  1. 「 iOS知识小集 」2018 · 第 38 期
  2. Spring Cloud 学习笔记(三) 之服务治理模块Spring Cloud 服务发现与消费
  3. 庖丁解Puppet之操作记实
  4. HTML5使用Div标签来实现表格
  5. linux下ssh/scp无密钥登陆方法
  6. PartyUs 待添加内容(不定期更新)
  7. 你还认为中国没有桌面虚拟化核心技术?
  8. 对象失去焦点时自己动提交数据
  9. Qt的Assistant制作自定义的软件帮助界面(记录)
  10. string字符串数字自增_常见的字符串操作