传送门

题意简述:咕咕咕


思路:考虑预处理出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]小凸解密码(线段树)的更多相关文章

  1. bzoj4447[Scoi2015]小凸解密码

    4447: [Scoi2015]小凸解密码 Time Limit: 20 Sec  Memory Limit: 128 MBSubmit: 150  Solved: 58[Submit][Status ...

  2. 2019.03.26 bzoj4446: [Scoi2015]小凸玩密室(树形dp)

    传送门 题意简述: 给一棵完全二叉树,有点权aia_iai​和边权,每个点有一盏灯,现在要按一定要求点亮: 任意时刻点亮的灯泡必须连通 点亮一个灯泡后必须先点亮其子树 费用计算如下:点第一盏灯不要花费 ...

  3. bzoj4447 SCOI2015 小凸解密码 password

    传送门:bzoj4447 题解: 调试简直恶心,不过调完发现其实还是挺好写的. 用\(\mathrm{set}\)维护一段\(0\)区间的左右端点,每次最多修改两个点,所以很好维护. 查询的时候在\( ...

  4. [bzoj4447] [loj#2010] [Scoi2015] 小凸解密码

    Description 小凸得到了一个密码盘,密码盘被等分成 \(N\) 个扇形,每个扇形上有一个数字(0-9),和一个符号("+"或"*") 密码盘解密的方法 ...

  5. 「SCOI2015」小凸解密码 解题报告

    「SCOI2015」小凸解密码 题意:给一个环,定义一段连续的极长\(0\)串为\(0\)区间,定义一个位置的离一个\(0\)区间的距离为这个位置离这个区间中\(0\)的距离的最小值,每次询问一个位置 ...

  6. bzoj 4447 小凸解密码

    bzoj 4447 小凸解密码 先将原始状态的 \(B\) 处理出来,可以发现,若不修改,则每次指定的起始位置不同,对这个环 \(B\) 带来的影响只有 \(B_0\) 不同,即每次 \(B_0=A_ ...

  7. 2019.03.26 bzoj4448: [Scoi2015]情报传递(归并排序+树链剖分)

    传送门 题意简述: 给一棵nnn个点的树,树上每个点表示一个情报员,一共有mmm天,每天会派发以下两种任务中的一个任务: 1.搜集情报:指派T号情报员搜集情报 2.传递情报:将一条情报从X号情报员传递 ...

  8. 2019.03.26 bzoj4444: [Scoi2015]国旗计划(线段树+倍增)

    传送门 题意简述:现在给你一个长度为mmm的环,有nnn条互不包含的线段,问如果强制选第iii条线段至少需要用几条线段覆盖这个环,注意用来的覆盖的线段应该相交,即[1,3],[4,5][1,3],[4 ...

  9. 【LOJ】#2010. 「SCOI2015」小凸解密码

    题解 断环为链,把链复制两份 用set维护一下全是0的区间,然后查找x + n / 2附近的区间,附近各一个过不去,最后弃疗了改为查附近的两个,然后过掉了= = 熟练掌握stl的应用,你值得拥有(雾 ...

随机推荐

  1. H5自定义金额键盘,改良后ios体验效果流畅

    下载的别人的插件改良一下,源码地址:https://github.com/XieTongXue/how-to/tree/master/pay-h5 没有插件,直接来代码 <div class=& ...

  2. Sping4之依赖注入

    Spring的依赖注入可以是我们不需要去管理bean,网上看到一个回答很精辟: 现在你需要买一把锤子: 1.自己做一把,解释成java就是,调用者创建被调用着,也就是自己去创造一个造锤子的方法,然后自 ...

  3. Spring核心之IOC

    IOC是Spring的两大核心之一:IOC的核心就是解耦. 举个例子:有2个班级可以上课,校长指定老师去上课,代码如下 package com.hongcong.test; public class ...

  4. kruskal(拓展)

    kruskal是最小生成树的一种做法,即严格按照贪心思想将边从小到大排序,一个一个枚举能不能加入图中,知道生成一棵树,显然树为最小树. 鄙人觉得kruskal做法远不止如此,那种严格从小到大选边的做法 ...

  5. CodeForces - 864C-Bus-(模拟加油站问题)

    https://vjudge.net/problem/CodeForces-864C 题意:两地之间有个加油站,往返走k个单程,最少加油多少次. 大佬几十行代码就解决,我却要用一百多行的if语句模拟解 ...

  6. freeswitch dialplan 基础

    freeswitch dialplan 基础 一.基础概念 dialplan 拨号方案 context 拨号表(块) extension  拨号去向 action  (拨号后执行的)动作 condit ...

  7. 2018-2019-2 20175126谢文航 实验一《Java开发环境的熟悉》实验报告

    一.实验报告封面 课程:Java程序设计 班级:1751班 姓名:谢文航 学号:20175126 指导教师:娄嘉鹏 实验日期:2019年3月28日 实验时间:--- 实验序号:实验一 实验名称:Jav ...

  8. java_29打印流

    1打印流 PrintStream 和PrintWriter 不负责数据源  只负责数据目的 2.方法 public class Demo {    public static void main(St ...

  9. jquery点击回到顶部

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  10. Linux 内存占用大排查

    用命令 top 查看发现内存使用很高,可用内存很少,导致有些服务无法正常启动. 这时,可以用下面的命令查看占用内存前10的进程,改变 10 的数字,可以调整前几的个数. ps -aux | sort ...