题意

给定一个序列,两种操作,单点修改,询问区间\([l,r]\)值域在\([x,y]\)范围内的连续段个数。

分析

  • 原数组为\(a\),构造一个新的数组\(b\),\(b[i]=(a[i]==a[i-1])?0:a[i]\),这样将连续段转化为左端点的一个数来表示。
  • 询问就可以转化为维护\(b\)数组,单点修改和询问区间在某个值域内的数的个数,用树状数组套权值线段树。
  • 类似于差分的思想,对于询问\(l,r\),我们要查询的是\(b\)数组的\([l+1,r]\),因此会漏掉\(a[l]\)这个,所以最后要分情况讨论判断\(a[l]\)是否满足值域条件,若是,无论\(a[l+1]\)是否等于\(a[l]\),答案都应该再加1。
  • 计蒜客上C++11能34xx\(ms\)卡过,C++14会T。
  • 树套树学的是这种记录节点,现算现用的方法,貌似用了单独计算累加答案的方法也会T...

代码

  1. #include <bits/stdc++.h>
  2. using namespace std;
  3. const int N=2e5+150;
  4. int n,m,a[N],b[N];
  5. int o,l,r,xi,yi;
  6. int x[N],y[N];
  7. int c1,c2;
  8. int tr[N*150];
  9. struct HJT{
  10. #define mid (l+r)/2
  11. int tot,sum[N*150],ls[N*150],rs[N*150];
  12. void update(int& rt,int l,int r,int v,int add){
  13. //因为b数组有0值,在查询时0不算
  14. if(!v){
  15. return;
  16. }
  17. if(!rt){
  18. rt=++tot;
  19. }
  20. sum[rt]+=add;
  21. if(l<r){
  22. if(v<=mid){
  23. update(ls[rt],l,mid,v,add);
  24. }else{
  25. update(rs[rt],mid+1,r,v,add);
  26. }
  27. }
  28. }
  29. //区间[l,r]值域在[1,k]的个数
  30. int query(int l,int r,int k){
  31. if(k==0){
  32. return 0;
  33. }
  34. if(r<=k){
  35. int ans=0;
  36. for(int i=1;i<=c1;i++){
  37. ans-=sum[x[i]];
  38. }
  39. for(int i=1;i<=c2;i++){
  40. ans+=sum[y[i]];
  41. }
  42. return ans;
  43. }
  44. if(k<=mid){
  45. for(int i=1;i<=c1;i++){
  46. x[i]=ls[x[i]];
  47. }
  48. for(int i=1;i<=c2;i++){
  49. y[i]=ls[y[i]];
  50. }
  51. return query(l,mid,k);
  52. }else{
  53. int ans=0;
  54. for(int i=1;i<=c1;i++){
  55. ans-=sum[ls[x[i]]];
  56. }
  57. for(int i=1;i<=c2;i++){
  58. ans+=sum[ls[y[i]]];
  59. }
  60. for(int i=1;i<=c1;i++){
  61. x[i]=rs[x[i]];
  62. }
  63. for(int i=1;i<=c2;i++){
  64. y[i]=rs[y[i]];
  65. }
  66. return ans+query(mid+1,r,k);
  67. }
  68. }
  69. }ac;
  70. struct BIT{
  71. int lowbit(int x){
  72. return x&(-x);
  73. }
  74. //修改权值线段树的bit前缀和(非连续)
  75. void modify(int i,int x){
  76. int k=b[i];
  77. while(i<=n){
  78. ac.update(tr[i],1,n,k,x);
  79. i+=lowbit(i);
  80. }
  81. }
  82. //预处理权值线段树的查询路径
  83. int query(int l,int r,int xi,int yi){
  84. c1=c2=0;
  85. for(int i=(l-1);i;i-=lowbit(i)){
  86. x[++c1]=tr[i];
  87. }
  88. for(int i=r;i;i-=lowbit(i)){
  89. y[++c2]=tr[i];
  90. }
  91. int R=ac.query(1,n,yi);
  92. c1=c2=0;
  93. for(int i=(l-1);i;i-=lowbit(i)){
  94. x[++c1]=tr[i];
  95. }
  96. for(int i=r;i;i-=lowbit(i)){
  97. y[++c2]=tr[i];
  98. }
  99. int L=ac.query(1,n,xi-1);
  100. return R-L;
  101. }
  102. }bit;
  103. int main(){
  104. // freopen("in.txt","r",stdin);
  105. scanf("%d%d",&n,&m);
  106. for(int i=1;i<=n;i++){
  107. scanf("%d",&a[i]);
  108. b[i]=(a[i]==a[i-1])?0:a[i];
  109. }
  110. for(int i=1;i<=n;i++){
  111. bit.modify(i,1);
  112. }
  113. for(int i=1;i<=m;i++){
  114. scanf("%d%d%d",&o,&l,&r);
  115. if(o==1){
  116. bit.modify(l,-1);
  117. bit.modify(l+1,-1);
  118. a[l]=r;
  119. b[l]=(a[l]==a[l-1])?0:a[l];
  120. b[l+1]=(a[l+1]==a[l])?0:a[l+1];
  121. bit.modify(l,1);
  122. bit.modify(l+1,1);
  123. }else{
  124. scanf("%d%d",&xi,&yi);
  125. int ans=bit.query(l+1,r,xi,yi);
  126. if(a[l]>=xi && a[l]<=yi){
  127. ans++;
  128. }
  129. printf("%d\n",ans);
  130. }
  131. }
  132. return 0;
  133. }

2019icpc南昌网络赛_I_Yukino With Subinterval的更多相关文章

  1. 线段树+单调栈+前缀和--2019icpc南昌网络赛I

    线段树+单调栈+前缀和--2019icpc南昌网络赛I Alice has a magic array. She suggests that the value of a interval is eq ...

  2. 2019ICPC南昌网络赛总结

    打的很崩的一场比赛.上来签到题我就wa了一发,感觉在梦游.然后我开了H题,队友开B题,f(n)=3f(n-1)+2f(n)傻子都知道矩阵快速幂,但是1e7的强制在线必须把logn优化,然后试图打表寻找 ...

  3. 2019icpc南昌网络赛

    B. Fire-Fighting Hero (dijstra优先队列+bfs) 题意:刚开始看错题了,以为是k次dijkstra,但是wa了,后来队友指正后发现挺水的.求S到其它点的最短路的最大值an ...

  4. 2019ICPC南昌网络赛C Hello 2019

    题意:给出一个字符串,每次询问一个区间[l,r],求使得这个区间含有9102但不含有8102最少要删掉几个字符 首先我们考虑将串反转,这样就变成了含有2019但不含有2018的问题了 我们构建一个状态 ...

  5. ACM-ICPC 2019南昌网络赛I题 Yukino With Subinterval

    ACM-ICPC 2019南昌网络赛I题 Yukino With Subinterval 题目大意:给一个长度为n,值域为[1, n]的序列{a},要求支持m次操作: 单点修改 1 pos val 询 ...

  6. 2019南昌网络赛I:Yukino With Subinterval(CDQ) (树状数组套主席树)

    题意:询问区间有多少个连续的段,而且这段的颜色在[L,R]才算贡献,每段贡献是1. 有单点修改和区间查询. 思路:46min交了第一发树套树,T了. 稍加优化多交几次就过了. 不难想到,除了L这个点, ...

  7. dp--2019南昌网络赛B-Match Stick Game

    dp--2019南昌网络赛B-Match Stick Game Xiao Ming recently indulges in match stick game and he thinks he is ...

  8. ACM-ICPC 2019南昌网络赛F题 Megumi With String

    ACM-ICPC 南昌网络赛F题 Megumi With String 题目描述 给一个长度为\(l\)的字符串\(S\),和关于\(x\)的\(k\)次多项式\(G[x]\).当一个字符串\(str ...

  9. 南昌网络赛C.Angry FFF Party

    南昌网络赛C.Angry FFF Party Describe In ACM labs, there are only few members who have girlfriends. And th ...

随机推荐

  1. 什么?小程序实时语音识别你还在痛苦的对接科大讯飞?百度Ai识别?

    前言 微信小程序,说不上大火,但是需求还是不少的.各大企业都想插一足 于是前端同学就有事情做了. 需求 我需要录音 我边说话边识别,我要同声传译,我要文字转语音,还要萝莉音 我:??? 正文 一开始, ...

  2. JDK、JRE、JVM之间的区别和联系

    JDK : Java Development ToolKit(Java开发工具包).JDK是整个JAVA的核心,包括了Java运行环境(Java Runtime Envirnment),一堆Java工 ...

  3. jQuery插件之路(二)——轮播

    还记得以前刚接触前端的时候,浏览各大网站,很多都少不了的有个轮播的效果,那个时候自己是一个彻彻底底的小白,想着这些图片滚动起来还真是有意思,是什么让这些图片在一个方向上连续的滚动呢.后来慢慢的接触多了 ...

  4. 富文本编辑器TinyMCE的使用(React Vue)

    富文本编辑器TinyMCE的使用(React Vue) 一,需求与介绍 1.1,需求 编辑新闻等富有个性化的文本 1.2,介绍 TinyMCE是一款易用.且功能强大的所见即所得的富文本编辑器. Tin ...

  5. 修改 jupyter notebook的默认文件夹位置

    安装好Anaconda 3以后,就可以使用Jupyter notebook了,但是我们打开Jupyter notebook后,发现界面是一个默认的目录,这个目录在哪里?如果想把自己写的程序文件保存在自 ...

  6. gRPC的简单使用

    目录 前言 gRPC的简单介绍 基本用法 服务的定义 服务端代码编写 客户端代码编写 运行效果 服务治理(注册与发现) .NET Core 2.x 和 .NET Core 3.0的细微区别 扩展阅读 ...

  7. java8(1)--- lambda

    项目马上切java8了,之前对于java8的东西都是东打一棒西打一锤的了解了些.这次搜集整理了下,从lambda到stream相关的API等. 1.Lambda和匿名内部类 Lambda 是一个匿名的 ...

  8. Zookeeeper应用实践(四)

    zk的应用还是非常广泛的. 1. 分布式锁 单机环境下的锁还是很容易去实现的,但是在分布式环境下一切都变得不是那么简单.zk实现分布式锁的原理还简单,因为在分布式环境中的zk节点的变化会被每一台机器w ...

  9. Opengl_入门学习分享和记录_03_渲染管线(二)再谈顶点着色器以及顶点属性以及属性链接

    ---恢复内容开始--- 写在前面的废话:岂可修!感觉最近好忙啊,本来今天还有同学约我出去玩的.(小声bb) 正文开始:之前已经编译好的着色器中还有一些问题,比如 layout(location=0) ...

  10. 利用DoHome APP和音箱控制LED灯实验参考步骤

    准备材料: Arduino Uno 一块 Arduino 扩展板        购买链接 DT-06模块一个       购买链接 安卓手机一个 小度音箱一个 小灯珠一个 杜邦线若干 1.DT-06固 ...