原题传送门

前置芝士:珂朵莉树

珂朵莉树的主要功能是区间赋值

这道题还算明显(操作2)

一开始看见这题觉得很毒瘤,但仔细想想发现颜色和数字之间没有什么关系

我们一共要维护三个东西:

1.区间和:树状数组就珂以了

2.区间最大值:写棵线段树

3.颜色:写珂朵莉树

查询的是连续的区间,尺取法就珂以了(尺取法就像单调队列一样)

复杂度:\(O(q\log^2n)\)(q次查询,尺取平均\(\log n\),线段树/树状数组\(\log n\))

  1. #include <bits/stdc++.h>
  2. #define IT set<node>::iterator
  3. #define N 100005
  4. #define inf 0x3f3f3f3f
  5. #define getchar nc
  6. using namespace std;
  7. inline char nc(){
  8. static char buf[100000],*p1=buf,*p2=buf;
  9. return p1==p2&&(p2=(p1=buf)+fread(buf,1,100000,stdin),p1==p2)?EOF:*p1++;
  10. }
  11. inline int read()
  12. {
  13. register int x=0,f=1;register char ch=getchar();
  14. while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
  15. while(ch>='0'&&ch<='9')x=(x<<3)+(x<<1)+ch-'0',ch=getchar();
  16. return x*f;
  17. }
  18. inline void write(register int x)
  19. {
  20. if(!x)putchar('0');if(x<0)x=-x,putchar('-');
  21. static int sta[20];register int tot=0;
  22. while(x)sta[tot++]=x%10,x/=10;
  23. while(tot)putchar(sta[--tot]+48);
  24. }
  25. inline int Max(register int a,register int b)
  26. {
  27. return a>b?a:b;
  28. }
  29. inline int Min(register int a,register int b)
  30. {
  31. return a<b?a:b;
  32. }
  33. int n,m,cs;
  34. int t[N];
  35. inline void update(register int x,register int val)
  36. {
  37. for(register int i=x;i<=n;i+=i&(-i))
  38. t[i]+=val;
  39. }
  40. inline int query(register int x)
  41. {
  42. int res=0;
  43. for(register int i=x;i;i-=i&(-i))
  44. res+=t[i];
  45. return res;
  46. }
  47. inline int ask(register int l,register int r)
  48. {
  49. return query(r)-query(l-1);
  50. }
  51. int tr[N<<3];
  52. inline void pushup(register int x)
  53. {
  54. tr[x]=Max(tr[x<<1],tr[x<<1|1]);
  55. }
  56. inline void updatemaxx(register int x,register int l,register int r,register int pos,register int val)
  57. {
  58. if(l==r)
  59. {
  60. tr[x]=val;
  61. return;
  62. }
  63. int mid=l+r>>1;
  64. if(pos<=mid)
  65. updatemaxx(x<<1,l,mid,pos,val);
  66. else
  67. updatemaxx(x<<1|1,mid+1,r,pos,val);
  68. pushup(x);
  69. }
  70. inline int querymaxx(register int x,register int l,register int r,register int L,register int R)
  71. {
  72. if(L<=l&&r<=R)
  73. return tr[x];
  74. int res=0,mid=l+r>>1;
  75. if(L<=mid)
  76. res=Max(res,querymaxx(x<<1,l,mid,L,R));
  77. if(R>mid)
  78. res=Max(res,querymaxx(x<<1|1,mid+1,r,L,R));
  79. return res;
  80. }
  81. struct node{
  82. int l,r;
  83. mutable int v;
  84. node(int L,int R=-1,int V=0):l(L),r(R),v(V){}
  85. bool operator<(const node& o)const{
  86. return l<o.l;
  87. }
  88. };
  89. set<node> s;
  90. IT split(register int pos)
  91. {
  92. IT it=s.lower_bound(node(pos));
  93. if(it!=s.end()&&it->l==pos)
  94. return it;
  95. --it;
  96. int L=it->l,R=it->r,V=it->v;
  97. s.erase(it);
  98. s.insert(node(L,pos-1,V));
  99. return s.insert(node(pos,R,V)).first;
  100. }
  101. inline void assign_val(register int l,register int r,register int val)
  102. {
  103. IT itr=split(r+1),itl=split(l);
  104. s.erase(itl,itr);
  105. s.insert(node(l,r,val));
  106. }
  107. int tex[N];
  108. inline int query1(register int l,register int r)
  109. {
  110. int ans=inf,left=cs;
  111. memset(tex,0,sizeof(tex));
  112. IT itr=split(r+1),itl=split(l),L,R;
  113. --itl;
  114. L=R=itl;
  115. while(R!=itr)
  116. {
  117. if(L!=itl)
  118. {
  119. if(--tex[L->v]==0)
  120. ++left;
  121. }
  122. ++L;
  123. while(left&&R!=itr)
  124. {
  125. ++R;
  126. if(++tex[R->v]==1)
  127. --left;
  128. }
  129. if(R==itr)
  130. break;
  131. while(!left&&L!=R)
  132. {
  133. if(--tex[L->v]==0)
  134. ++left;
  135. ++L;
  136. }
  137. if(left)
  138. {
  139. --L;
  140. ++tex[L->v];
  141. --left;
  142. }
  143. ans=Min(ans,ask(L->r,R->l));
  144. }
  145. return ans;
  146. }
  147. int p[N];
  148. inline int query2(register int l,register int r)
  149. {
  150. memset(p,0,sizeof(p));
  151. int ans=querymaxx(1,1,n,l,r);
  152. IT itr=split(r+1),itl=split(l),L,R;
  153. R=itl--;
  154. L=itl;
  155. while(R!=itr)
  156. {
  157. if(L!=itl)
  158. p[L->v]=0;
  159. ++L;
  160. p[L->v]=1;
  161. while(R->l<L->r)
  162. ++R;
  163. if(L==R)
  164. ++R;
  165. if(R==itr)
  166. break;
  167. while(!p[R->v]&&R!=itr&&R->l==R->r)
  168. {
  169. p[R->v]=1;
  170. ++R;
  171. }
  172. if(R==itr)
  173. --R;
  174. else if(!p[R->v])
  175. p[R->v]=1;
  176. else
  177. --R;
  178. if(L==R)
  179. continue;
  180. ans=Max(ans,ask(L->r,R->l));
  181. }
  182. return ans;
  183. }
  184. int main()
  185. {
  186. n=read(),m=read(),cs=read();
  187. s.insert(node(0,0,-1)),s.insert(node(n+1,n+1,-1));
  188. for(register int i=1;i<=n;++i)
  189. {
  190. int x=read();
  191. update(i,x);
  192. updatemaxx(1,1,n,i,x);
  193. }
  194. for(register int i=1;i<=n;++i)
  195. {
  196. int x=read();
  197. s.insert(node(i,i,x));
  198. }
  199. int opt,l,r,x;
  200. while(m--)
  201. {
  202. opt=read();
  203. if(opt==1)
  204. {
  205. l=read(),x=read();
  206. update(l,x-ask(l,l));
  207. updatemaxx(1,1,n,l,x);
  208. }
  209. else if(opt==2)
  210. {
  211. l=read(),r=read(),x=read();
  212. assign_val(l,r,x);
  213. }
  214. else if(opt==3)
  215. {
  216. l=read(),r=read();
  217. int ans=query1(l,r);
  218. if(ans==inf)
  219. puts("-1");
  220. else
  221. write(ans),puts("");
  222. }
  223. else
  224. {
  225. l=read(),r=read();
  226. write(query2(l,r)),puts("");
  227. }
  228. }
  229. return 0;
  230. }

【题解】Luogu P5251 [LnOI2019]第二代图灵机的更多相关文章

  1. 【洛谷5251】[LnOI2019] 第二代图灵机(线段树+ODT)

    点此看题面 大致题意: 有单点修改数字和区间着色两种修改操作,询问你某段区间内包含所有颜色且数字和最小的子区间的数字和,或某段区间内没有重复颜色且数字和最大的子区间的数字和.数据随机. \(ODT\) ...

  2. hyperv 创建第二代虚拟机

    环境:宿主机windows 8.1,虚拟机:windows 8.1 硬件:笔记本电脑,无线网络,没有有线网络网络配置先不设置 1.安装hyperv,控制面版-->程序和功能-->启用或关闭 ...

  3. GPRS GPRS(General Packet Radio Service)是通用分组无线服务技术的简称,它是GSM移动电话用户可用的一种移动数据业务,属于第二代移动通信中的数据传输技术

    GPRS 锁定 本词条由“科普中国”百科科学词条编写与应用工作项目 审核 . GPRS(General Packet Radio Service)是通用分组无线服务技术的简称,它是GSM移动电话用户可 ...

  4. SAP增强总结-第二代增强(SMOD、CMOD)【转载】

    第二代增强比第二代增强安全性提高了很多,第一代增强毕竟是在原标准程序中修改,大部分传递参数都可以直接使用,第二代增强做了一些封装,对用户可以修改的参数做了限制. 1.增强点查找方法 首先根据事物码找到 ...

  5. 【深度解析】Google第二代深度学习引擎TensorFlow开源

    作者:王嘉俊 王婉婷 TensorFlow 是 Google 第二代深度学习系统,今天宣布完全开源.TensorFlow 是一种编写机器学习算法的界面,也可以编译执行机器学习算法的代码.使用 Tens ...

  6. [转帖]腾讯将使用AMD第二代霄龙处理器打造自研服务器:性能提升35%

    腾讯将使用AMD第二代霄龙处理器打造自研服务器:性能提升35% https://news.cnblogs.com/n/647499/ 我司的服务器是不是要少一块蛋糕了.. 作者:万南 今日,AMD 宣 ...

  7. 第二代网关GateWay搭建流程

    Spring Cloud第二代网关GateWay是由纯Netty开发,底层为Reactor,WebFlux构建,不依赖任何Servlet容器,它不同于Zuul,使用的是异步IO,性能较Zuul提升1. ...

  8. SpringCloud第二代实战系列:一文搞定Nacos实现服务注册与发现

    一.背景:SpringCloud 生态圈 在正式开始本篇文章之前我们先岔开来讲一下SpringCloud的生态圈. SpringCloud大家都比较熟悉了,它制定了分布式系统的标准规范,做了高度抽象和 ...

  9. 【项目】关于TeenCode第二代评测机的技术分析

    晚上睡不着觉,仔细研读了洛谷的第四代评测机技术分析后,突然发现自己写的TeenCode评测机竟然有这么多地方可以改进,这不得不让我诞生了实现第二代TeenCode评测机的想法.[第一代评测机挺可怜的, ...

随机推荐

  1. day 24 二十四、组合、继承、方法重写和重用、super()

    一.组合 1.定义:自定义类的对象作为类的属性 A类的对象具备某一个属性,该属性的值是B类的对象 基于这种方式就把A类与B类组合到一起 对象既能使用A类中的数据与功能,也能使用B类中的数据与功能 2. ...

  2. nginx,maven

    nginx反向代理 负载均衡 keepalive高可用 lvs负载均衡算法 mvn build自定义命令 install安装到本地仓库

  3. Install sublime text for elementary os

    1. download sublime_text_3_build_3176_x86.tar.gz from http://www.sublimetext.com/3 2. extract it to ...

  4. PowerDesigner软件建立新模型。

      打开PowerDesigner软件,选择菜单文件->建立新模型,或者敲击键盘ctrl+N   弹出建立新模型窗口,模型类型选择Object-Oriented Model,图选择Class D ...

  5. mysql--表数据操作

    查询: 简单查询 ####查询的字段必须在表中存在 #### 对查询出来的数据进行修改时,不会修改原来的数据,只是修改了可视化的,我们看到的数据. # 查一个数据 select 字段名 from 表名 ...

  6. VUE-008-通过路由 router.push 传递 query 参数(路由 path 识别,请求链接显示参数传递)

    在前端页面表单列表修改时,经常需要在页面切换的时候,传递需要修改的表单内容,通常可通过路由进行表单参数的传递. 首先,配置页面跳转路由.在 router/index.js 中配置相应的页面跳转路由,如 ...

  7. C语言扫盲及深化学习

    c语言特点: (1)效率高 (2)控制性强 (3)硬件亲和性好 (4)可移植性高 一.关于注释 c语言中注释不能嵌套,因此注释代码时一定要注意源代码中是否已经存在注释.要从逻辑上删除一段代码,利用预编 ...

  8. Python3学习之路~7.2 类的特殊成员方法

    1. __doc__ 表示类的描述信息 class Dog(object): """ 这个类是描述狗这个对象的 """ def func(s ...

  9. 零python基础--爬虫实践总结

    网络爬虫,是一种按照一定的规则,自动地抓取万维网信息的程序或者脚本. 爬虫主要应对的问题:1.http请求 2.解析html源码 3.应对反爬机制. 觉得爬虫挺有意思的,恰好看到知乎有人分享的一个爬虫 ...

  10. 编程填空:第i位替换

    编程填空:第i位替换 OpenJudge 总时间限制:1000ms 内存限制:1024kB 描述:写出函数中缺失的部分,使得函数返回值为一个整数,该整数的第i位和m的第i位相同,其他位和n相同. 请使 ...