2019.03.26 bzoj4447: [Scoi2015]小凸解密码(线段树)
传送门
题意简述:咕咕咕
思路:考虑预处理出bbb数组,然后每次改动aaa都只会对第iii和i+1i+1i+1这两个位置产生影响,于是可以用线段树来维护bbb数组。
现在求答案的方法是断环为链,倍增整个数组,然后就可用线段树维护000段的一些信息。
代码:
#include<bits/stdc++.h>
#define ri register int
using namespace std;
inline int read(){
int ans=0;
char ch=getchar();
while(!isdigit(ch))ch=getchar();
while(isdigit(ch))ans=((ans<<2)+ans<<1)+(ch^48),ch=getchar();
return ans;
}
const int N=4e5+5;
int n,m,a[N];
char s[N][2];
namespace sgt{
#define lc (p<<1)
#define rc (p<<1|1)
#define mid (T[p].l+T[p].r>>1)
struct Node{
int l,r,ls,rs,lp,rp,val;
inline void Set(int k){
int tmp=k;
k=(k-1)%n+1;
int v1=a[k],v2=k==1?a[n]:a[k-1];
val=s[k][0]=='+'?(v1+v2)%10:v1*v2%10;
if(!val)lp=rp=tmp,ls=rs=1;
else lp=n*2+1,rp=0,ls=rs=0;
}
inline void set(int k){
int tmp=k;
k=(k-1)%n+1;
val=a[k];
if(!val)lp=rp=tmp,ls=rs=1;
else lp=n*2+1,rp=0,ls=rs=0;
}
friend inline Node operator+(const Node&a,const Node&b){
Node ret;
ret.l=a.l,ret.r=b.r;
ret.ls=a.ls?(a.lp+a.ls-1==a.r&&b.lp==b.l?a.ls+b.ls:a.ls):b.ls;
ret.rs=b.rs?(b.rp-b.rs+1==b.l&&a.rp==a.r?b.rs+a.rs:b.rs):a.rs;
ret.lp=min(a.lp,b.lp),ret.rp=max(b.rp,a.rp);
return ret;
}
}T[N<<2];
inline void pushup(int p){T[p]=T[lc]+T[rc];}
inline void build(int p,int l,int r){
T[p].l=l,T[p].r=r;
if(l==r)return T[p].Set(l);
build(lc,l,mid),build(rc,mid+1,r),pushup(p);
}
inline void update(int p,int k){
if(T[p].l==T[p].r)return T[p].Set(k);
update(k<=mid?lc:rc,k),pushup(p);
}
inline void modify(int p,int k){
if(T[p].l==T[p].r)return T[p].set(k);
modify(k<=mid?lc:rc,k),pushup(p);
}
inline Node query(int p,int ql,int qr){
if(ql>qr)return (Node){T[p].l,T[p].r,0,0,0,0,0};
if(ql<=T[p].l&&T[p].r<=qr)return T[p];
if(qr<=mid)return query(lc,ql,qr);
if(ql>mid)return query(rc,ql,qr);
return query(lc,ql,qr)+query(rc,ql,qr);
}
}
inline int query(int k,int l,int r){
if(k<=l||k>=r)return -1;
int ret=-1;
sgt::Node t=sgt::query(1,k,k),ql=sgt::query(1,l,k-1),qr=sgt::query(1,k+1,r);
if(t.val){
if(ql.ls)ret=max(ret,min(ql.rp-ql.rs+1-l,r-ql.rp));
if(qr.rs)ret=max(ret,min(r-qr.lp-qr.ls+1,qr.lp-l));
return ret;
}
else{
if(ql.rp!=k-1&&qr.lp!=k+1)return min(r-k,k-l);
if(ql.rp==k-1&&qr.lp==k+1)return min(ql.rp-ql.rs+1-l,r-qr.lp-qr.ls+1);
if(ql.rp==k-1)return min(ql.rp-ql.rs+1-l,r-k);
if(qr.lp==k+1)return min(r-qr.lp-qr.ls+1,k-l);
}
}
int main(){
n=read(),m=read();
for(ri i=1;i<=n;++i)a[i]=read(),scanf("%s",s[i]);
sgt::build(1,1,n<<1);
for(ri op,x;m;--m){
op=read(),x=read()+1;
if(op==1){
a[x]=read(),scanf("%s",s[x]);
sgt::update(1,x);
sgt::update(1,x+n);
sgt::update(1,x%n+1);
sgt::update(1,x%n+1+n);
}
else{
sgt::modify(1,x);
sgt::modify(1,x+n);
int ans=-1;
for(ri i=n/2-2;i<=n/2+2;++i)ans=max(ans,query(x+i,x,x+n));
cout<<ans<<'\n';
sgt::update(1,x);
sgt::update(1,x+n);
}
}
return 0;
}
2019.03.26 bzoj4447: [Scoi2015]小凸解密码(线段树)的更多相关文章
- bzoj4447[Scoi2015]小凸解密码
4447: [Scoi2015]小凸解密码 Time Limit: 20 Sec Memory Limit: 128 MBSubmit: 150 Solved: 58[Submit][Status ...
- 2019.03.26 bzoj4446: [Scoi2015]小凸玩密室(树形dp)
传送门 题意简述: 给一棵完全二叉树,有点权aia_iai和边权,每个点有一盏灯,现在要按一定要求点亮: 任意时刻点亮的灯泡必须连通 点亮一个灯泡后必须先点亮其子树 费用计算如下:点第一盏灯不要花费 ...
- bzoj4447 SCOI2015 小凸解密码 password
传送门:bzoj4447 题解: 调试简直恶心,不过调完发现其实还是挺好写的. 用\(\mathrm{set}\)维护一段\(0\)区间的左右端点,每次最多修改两个点,所以很好维护. 查询的时候在\( ...
- [bzoj4447] [loj#2010] [Scoi2015] 小凸解密码
Description 小凸得到了一个密码盘,密码盘被等分成 \(N\) 个扇形,每个扇形上有一个数字(0-9),和一个符号("+"或"*") 密码盘解密的方法 ...
- 「SCOI2015」小凸解密码 解题报告
「SCOI2015」小凸解密码 题意:给一个环,定义一段连续的极长\(0\)串为\(0\)区间,定义一个位置的离一个\(0\)区间的距离为这个位置离这个区间中\(0\)的距离的最小值,每次询问一个位置 ...
- bzoj 4447 小凸解密码
bzoj 4447 小凸解密码 先将原始状态的 \(B\) 处理出来,可以发现,若不修改,则每次指定的起始位置不同,对这个环 \(B\) 带来的影响只有 \(B_0\) 不同,即每次 \(B_0=A_ ...
- 2019.03.26 bzoj4448: [Scoi2015]情报传递(归并排序+树链剖分)
传送门 题意简述: 给一棵nnn个点的树,树上每个点表示一个情报员,一共有mmm天,每天会派发以下两种任务中的一个任务: 1.搜集情报:指派T号情报员搜集情报 2.传递情报:将一条情报从X号情报员传递 ...
- 2019.03.26 bzoj4444: [Scoi2015]国旗计划(线段树+倍增)
传送门 题意简述:现在给你一个长度为mmm的环,有nnn条互不包含的线段,问如果强制选第iii条线段至少需要用几条线段覆盖这个环,注意用来的覆盖的线段应该相交,即[1,3],[4,5][1,3],[4 ...
- 【LOJ】#2010. 「SCOI2015」小凸解密码
题解 断环为链,把链复制两份 用set维护一下全是0的区间,然后查找x + n / 2附近的区间,附近各一个过不去,最后弃疗了改为查附近的两个,然后过掉了= = 熟练掌握stl的应用,你值得拥有(雾 ...
随机推荐
- 可视化n次贝塞尔曲线及过程动画演示--大宝剑
起因 研究css中提供了2次.3次bezier,但是没有对n次bezier实现.对n次的实现有很大兴趣,所以就用js的canvas搞一下,顺便把过程动画模拟了一下. 投入真实生产之中,偏少. n次be ...
- dotnet不是内部或外部的命令,也不是可运行的程序或批处理文件
该问题是由于电脑环境变量配置错误所导致.最初在网上查找的方法,是在系统环境变量path中添加以下语句: %SystemRoot%\system32;%SystemRoot%;%SystemRoot%\ ...
- python之字符串及其方法---整理集
字符串方法 1.capitalize方法:字符串首字母大写 举例: test="alex" v=test.capitalize() print(v) 返回结果: Alex 2.ca ...
- Java对象回收流程
一.可回收对象判断 引用计数器算法:为对象放置一个引用计数器,当对象被引用时则计数器加一,如果一个对象的计数器标识为零的时候,则表明该对象可被回收.这种方法比较简单,但无法解决对象之间互相引用的情况. ...
- activemq stomp类
此库用来增强ide,能对stomp类进行自动提示 <?php class Stomp { /** * 构造器 * Stomp constructor. * @param string $brok ...
- MTD的认识
MTD即内存计数设备,是linux中对ROM.NORFLASH.NAND Flash等存储设备抽象出来的一个设备层,它向上提供统一的访问接口:读写.擦除等:屏蔽了底层硬件的操作.各类存储设备的差别. ...
- Hillstone基础上网配置
1.接口配置 1)进入设备管理界面后,点击左边 网络—接口: 2)选择相应的接口,点击编辑: 3)在接口配置界面中,选择接口的安全域类型(三层接口即为三层安全域,二层接口即为二层安全域).安全域名称 ...
- Git那些事儿
Git是目前世界上最先进的分布式版本控制系统,适合多人协作开发的大型项目.我平常也经常使用git,来管理自己的几个小项目.简单说说git的原理和git的特点!(只有知道了一个工具的运行原理,设计思路, ...
- MYSQL后更改ROOT的密码后无法启动服务报错1067
安装MYSQL后更改了ROOT的密码后用 net start mysql 启动时报错1067.使用以下命令:1.进入mysql安装目录的bin目录下:cd C:\Program Files\MySQL ...
- 关于Android UI 优化
之前项目为了同时兼容tv和手机端的UI,使用了百分比布局来动态计算控件的宽高,这种适配方案只关心屏幕的宽高(分辨率),与屏幕的像素密度无关. 在新的项目里也使用了这种方案.但是由于项目的运行硬件计算能 ...