蒟蒻求救
查看原帖
蒟蒻求救
114153
Saliеri楼主2020/7/27 11:29

思路和题解是一样的,但是有些答案会莫名其妙多一(darkbzoj上的数据),求救

#include <cstdio>
const int maxn = 1e5+5,maxt = 4e5+5;
inline int min(int a,int b) {
	return a<b?a:b;
}
int n,m,val[maxn],temp[maxn];
int vall[maxt],valr[maxt],cnt[maxt][4],tag[maxt];
/*
val l/r : 区间左右端点的值
cnt 0/1/2/3:
左右端点都不选 选左端点 选右端点 左右都选
*/
inline void pushup(int x) {
	int t = (valr[x<<1]==vall[x<<1|1]);
	vall[x] = vall[x<<1],valr[x] = valr[x<<1|1];
	cnt[x][0] = min(cnt[x<<1][2]+cnt[x<<1|1][1]-t,min(cnt[x<<1][2]+cnt[x<<1|1][0],cnt[x<<1][0]+cnt[x<<1|1][1]));
	cnt[x][1] = min(cnt[x<<1][3]+cnt[x<<1|1][1]-t,min(cnt[x<<1][1]+cnt[x<<1|1][1],cnt[x<<1][3]+cnt[x<<1|1][0]));
	cnt[x][2] = min(cnt[x<<1][2]+cnt[x<<1|1][3]-t,min(cnt[x<<1][2]+cnt[x<<1|1][2],cnt[x<<1][0]+cnt[x<<1|1][3]));
	cnt[x][3] = min(cnt[x<<1][3]+cnt[x<<1|1][3]-t,min(cnt[x<<1][3]+cnt[x<<1|1][2],cnt[x<<1][1]+cnt[x<<1|1][3]));
}
inline void gtag(int x,int v) {
	vall[x] += v,valr[x] += v,tag[x] += v;
}
inline void pushdown(int x) {
	if(tag[x])gtag(x<<1,tag[x]),gtag(x<<1|1,tag[x]),tag[x] = 0;
}
inline void build(int k,int l,int r) {
	if(l == r)return vall[k] = valr[k] = val[l],cnt[k][0] = 0,cnt[k][1] = cnt[k][2] = cnt[k][3] = 1,void();
	int mid = l+r>>1;
	build(k<<1,l,mid),build(k<<1|1,mid+1,r);
	pushup(k);
}
inline void modify(int k,int l,int r,int x,int y,int VAL) {
//	printf("dhfv: %lld %lld %lld %lld %lld\n",k,l,r,x,y);
	if(l>y||r<x)return ;
	if(l>=x&&r<=y)return gtag(k,VAL);
	int mid = l+r>>1;
	pushdown(k);
	modify(k<<1,l,mid,x,y,VAL),modify(k<<1|1,mid+1,r,x,y,VAL);
	pushup(k);
}
struct data {
	int vall,valr,cnt[4]; 
};
inline data query(int k,int l,int r,int x,int y) {
//	printf("d3232v: %d %d %d %d %d\n",k,l,r,x,y);
	if(l>=x&&r<=y)return (data) {vall[k],valr[k],cnt[k][0],cnt[k][1],cnt[k][2],cnt[k][3]};
	int mid = l+r>>1;
	pushdown(k);
	if(y<=mid)return query(k<<1,l,mid,x,y);
	if(x>mid)return query(k<<1|1,mid+1,r,x,y);
	data a=query(k<<1,l,mid,x,y),b=query(k<<1|1,mid+1,r,x,y),c;
	int t = (a.valr==b.vall);
	c.vall = a.vall,c.valr = b.valr;
	c.cnt[0] = min(a.cnt[2]+b.cnt[1]-t,min(a.cnt[2]+b.cnt[0],a.cnt[0]+b.cnt[1]));
	c.cnt[1] = min(a.cnt[3]+b.cnt[1]-t,min(a.cnt[1]+b.cnt[1],a.cnt[3]+b.cnt[0]));
	c.cnt[2] = min(a.cnt[2]+b.cnt[3]-t,min(a.cnt[2]+b.cnt[2],a.cnt[0]+b.cnt[3]));
	c.cnt[3] = min(a.cnt[3]+b.cnt[3]-t,min(a.cnt[3]+b.cnt[2],a.cnt[1]+b.cnt[3]));
	return c;
}
signed main() {
	freopen("7.in","r",stdin);
	freopen("mysol.out","w",stdout);
	scanf("%d",&n);
	for(int i=1; i<=n; ++i)scanf("%d",&val[i]),temp[i] = val[i];
	for(int i=1; i<=n; ++i)val[i] = temp[i]-temp[i-1];
//	printf("\n");
	build(1,1,n);
	scanf("%d",&m);
	for(int i=1,a,b,c,d; i<=m; ++i) {
		char ty[2];
		scanf("%s %d %d",ty,&a,&b);
		if(ty[0] == 'A') {
			scanf("%d %d",&c,&d);
			modify(1,1,n,a,a,c);
			if(a != b)modify(1,1,n,a+1,b,d);
			modify(1,1,n,b+1,b+1,-((b-a)*d+c));
		} else {
			if(a != b)printf("%d\n",query(1,1,n,a,b).cnt[3]);
			else puts("1");
		}
	}
	return 0;
}
2020/7/27 11:29
加载中...