原题传送门

前置芝士:珂朵莉树

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

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

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

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

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

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

3.颜色:写珂朵莉树

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

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

#include <bits/stdc++.h>
#define IT set<node>::iterator
#define N 100005
#define inf 0x3f3f3f3f
#define getchar nc
using namespace std;
inline char nc(){
static char buf[100000],*p1=buf,*p2=buf;
return p1==p2&&(p2=(p1=buf)+fread(buf,1,100000,stdin),p1==p2)?EOF:*p1++;
}
inline int read()
{
register int x=0,f=1;register char ch=getchar();
while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
while(ch>='0'&&ch<='9')x=(x<<3)+(x<<1)+ch-'0',ch=getchar();
return x*f;
}
inline void write(register int x)
{
if(!x)putchar('0');if(x<0)x=-x,putchar('-');
static int sta[20];register int tot=0;
while(x)sta[tot++]=x%10,x/=10;
while(tot)putchar(sta[--tot]+48);
}
inline int Max(register int a,register int b)
{
return a>b?a:b;
}
inline int Min(register int a,register int b)
{
return a<b?a:b;
}
int n,m,cs;
int t[N];
inline void update(register int x,register int val)
{
for(register int i=x;i<=n;i+=i&(-i))
t[i]+=val;
}
inline int query(register int x)
{
int res=0;
for(register int i=x;i;i-=i&(-i))
res+=t[i];
return res;
}
inline int ask(register int l,register int r)
{
return query(r)-query(l-1);
}
int tr[N<<3];
inline void pushup(register int x)
{
tr[x]=Max(tr[x<<1],tr[x<<1|1]);
}
inline void updatemaxx(register int x,register int l,register int r,register int pos,register int val)
{
if(l==r)
{
tr[x]=val;
return;
}
int mid=l+r>>1;
if(pos<=mid)
updatemaxx(x<<1,l,mid,pos,val);
else
updatemaxx(x<<1|1,mid+1,r,pos,val);
pushup(x);
}
inline int querymaxx(register int x,register int l,register int r,register int L,register int R)
{
if(L<=l&&r<=R)
return tr[x];
int res=0,mid=l+r>>1;
if(L<=mid)
res=Max(res,querymaxx(x<<1,l,mid,L,R));
if(R>mid)
res=Max(res,querymaxx(x<<1|1,mid+1,r,L,R));
return res;
}
struct node{
int l,r;
mutable int v;
node(int L,int R=-1,int V=0):l(L),r(R),v(V){}
bool operator<(const node& o)const{
return l<o.l;
}
};
set<node> s;
IT split(register int pos)
{
IT it=s.lower_bound(node(pos));
if(it!=s.end()&&it->l==pos)
return it;
--it;
int L=it->l,R=it->r,V=it->v;
s.erase(it);
s.insert(node(L,pos-1,V));
return s.insert(node(pos,R,V)).first;
}
inline void assign_val(register int l,register int r,register int val)
{
IT itr=split(r+1),itl=split(l);
s.erase(itl,itr);
s.insert(node(l,r,val));
}
int tex[N];
inline int query1(register int l,register int r)
{
int ans=inf,left=cs;
memset(tex,0,sizeof(tex));
IT itr=split(r+1),itl=split(l),L,R;
--itl;
L=R=itl;
while(R!=itr)
{
if(L!=itl)
{
if(--tex[L->v]==0)
++left;
}
++L;
while(left&&R!=itr)
{
++R;
if(++tex[R->v]==1)
--left;
}
if(R==itr)
break;
while(!left&&L!=R)
{
if(--tex[L->v]==0)
++left;
++L;
}
if(left)
{
--L;
++tex[L->v];
--left;
}
ans=Min(ans,ask(L->r,R->l));
}
return ans;
}
int p[N];
inline int query2(register int l,register int r)
{
memset(p,0,sizeof(p));
int ans=querymaxx(1,1,n,l,r);
IT itr=split(r+1),itl=split(l),L,R;
R=itl--;
L=itl;
while(R!=itr)
{
if(L!=itl)
p[L->v]=0;
++L;
p[L->v]=1;
while(R->l<L->r)
++R;
if(L==R)
++R;
if(R==itr)
break;
while(!p[R->v]&&R!=itr&&R->l==R->r)
{
p[R->v]=1;
++R;
}
if(R==itr)
--R;
else if(!p[R->v])
p[R->v]=1;
else
--R;
if(L==R)
continue;
ans=Max(ans,ask(L->r,R->l));
}
return ans;
}
int main()
{
n=read(),m=read(),cs=read();
s.insert(node(0,0,-1)),s.insert(node(n+1,n+1,-1));
for(register int i=1;i<=n;++i)
{
int x=read();
update(i,x);
updatemaxx(1,1,n,i,x);
}
for(register int i=1;i<=n;++i)
{
int x=read();
s.insert(node(i,i,x));
}
int opt,l,r,x;
while(m--)
{
opt=read();
if(opt==1)
{
l=read(),x=read();
update(l,x-ask(l,l));
updatemaxx(1,1,n,l,x);
}
else if(opt==2)
{
l=read(),r=read(),x=read();
assign_val(l,r,x);
}
else if(opt==3)
{
l=read(),r=read();
int ans=query1(l,r);
if(ans==inf)
puts("-1");
else
write(ans),puts("");
}
else
{
l=read(),r=read();
write(query2(l,r)),puts("");
}
}
return 0;
}

【题解】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. php composer windows安装

    2018年6月22日10:40:49 笔记 1.先下载Composer-Setup.exe,下载地址:http://docs.phpcomposer.com/00-intro.html#Install ...

  2. vue学习目录 vue初识 this指向问题 vue组件传值 过滤器 钩子函数 路由 全家桶 脚手架 vuecli element-ui axios bus

    vue学习目录 vue学习目录 Vue学习一之vue初识 Vue学习二之vue结合项目简单使用.this指向问题 Vue学习三之vue组件 Vue学习四之过滤器.钩子函数.路由.全家桶等 Vue学习之 ...

  3. VS2015调试ArcMap Add-in插件提示尝试运行项目时出错,无法启动程序“路径\arcmap.exe”

    如图所示的错误: 打开VS2015→工具→选项→常规→如图标记的两项打钩: 参考: https://gis.stackovernet.com/cn/q/40845 http://www.voidcn. ...

  4. 第一次C语言实验

    [实验感受]第一次实验感觉什么都还没有记住就要写小程序了,有些小着急.现在才发现c语言就是要在实践中掌握的,多敲点代码,多犯错误,就会明白其中的规则. 实验一:输入一个数判断奇数还是偶数,现在想想其实 ...

  5. Autofac之生命周期和事件

    Autofac为注册的类型对象提供了一套生命周期事件,覆盖了一个类型从注册到最后“释放”的一套事件.有了这些事件,我们可以相对方便的在类型对象的各个阶段进行AOP操作. builder.Registe ...

  6. 从手机中提取boot.img

    测试环境:nexus 5,android 6.0 怕出问题可以先用TWRP备份 adb shell su cd /dev/block/platform/msm_sdcc./by-name ls -l ...

  7. jmeter 之变量传递

    最近遇到个问题,一个线程组的变量怎么应用到另一个线程组,试了下,通过提取器设置的变量只能用于当前线程组,不能用于其他线程组,只能试试设置property Parameters,应该还有别的办法这只是其 ...

  8. mint-ui笔记

    1.安装: npm install mint-ui --save npm install babel-plugin-component --save-dev //(只引入部分组件时需要安装) 2.导入 ...

  9. Log4j配置和解释

    Log4j是Apache的一个开源项目,通过使用Log4j,我们可以控制日志信息输送的目的地是控制台.文件.GUI组件,甚至是套接口服务器.NT的事件记录器.UNIX Syslog守护进程等:我们也可 ...

  10. Spring AOP capabilities and goals

    Spring AOP 是用纯JAVA 实现的. 不需借助JAVA代码在编译处理阶段来实现. Spring 是在运行期实现的.AOP的实现可以在编译,加载,运行三个阶段来实现:Spring AOP 也不 ...