Help with WA
查看原帖
Help with WA
352493
mod1004535809楼主2020/7/18 18:48

rt, 0pt

/*
Contest: -
Problem: P5445
Author: tzc_wk
Time: 2020.7.18
*/
#include <bits/stdc++.h>
using namespace std;
#define fi			first
#define se			second
#define fz(i,a,b)	for(int i=a;i<=b;i++)
#define fd(i,a,b)	for(int i=a;i>=b;i--)
#define foreach(it,v) for(__typeof(v.begin()) it=v.begin();it!=v.end();it++)
#define all(a)		a.begin(),a.end()
#define fill0(a)	memset(a,0,sizeof(a))
#define fill1(a)	memset(a,-1,sizeof(a))
#define fillbig(a)	memset(a,0x3f,sizeof(a))
#define fillsmall(a) memset(a,0xcf,sizeof(a))
#define y1			y1010101010101
#define y0			y0101010101010
typedef pair<int,int> pii;
inline int read(){
	int x=0,neg=1;char c=getchar();
	while(!isdigit(c)){
		if(c=='-')	neg=-1;
		c=getchar();
	}
	while(isdigit(c))	x=x*10+c-'0',c=getchar();
	return x*neg;
}
const int INF=0x3f3f3f3f;
int n=read(),T=read(),p=0,ans[1000005],x[1000005];
set<int> unable;
struct event{
	int t,x,y,z;
} q[2000005],tmp[2000005];
void toggle(int x,int t){
	int r=*unable.upper_bound(x),l=*--unable.lower_bound(x);
	if(unable.count(x))	q[++p]={t,x,r,T-t},q[++p]={t,l-1,r,t-T},q[++p]={t,x,x,t-T},q[++p]={t,l-1,x,T-t},unable.erase(unable.find(x));
	else				q[++p]={t,x,r,t-T},q[++p]={t,l-1,r,T-t},q[++p]={t,x,x,T-t},q[++p]={t,l-1,x,t-T},unable.insert(x);
}
struct BIT{
	int bit[2000005];
	inline void add(int x,int v){
		for(int i=x;i<=n+3;i+=(i&(-i)))	bit[i]+=v;
	}
	inline int query(int x){
		int sum=0;
		for(int i=x;i;i-=(i&(-i)))	sum+=bit[i];
		return sum;
	}
} t;
inline void merge(int l,int r,int mid){
	int p1=l,p2=mid+1;
	for(int i=l;i<=r;i++){
		if(p1<=mid&&(p2>r||q[p1].x>q[p2].x))
			tmp[i]=q[p1++];
		else
			tmp[i]=q[p2++];
	}
	for(int i=l;i<=r;i++){
		q[i]=tmp[i];
	}
}
inline void CDQ(int l,int r){
	if(l==r)	return;
	int mid=(l+r)>>1;
	CDQ(l,mid);CDQ(mid+1,r);
	int cur=l;
	fz(i,mid+1,r){
		if(q[i].z!=INF)	continue;
		while(cur<=mid&&q[cur].x>=q[i].x){
			if(q[cur].z!=INF)	t.add(q[cur].y,q[cur].z);
			cur++;
		}
		ans[q[i].t]+=t.query(n+3)-t.query(q[i].y-1);
//		printf("%d\n",t.query(q[i].y));
	}
	fz(i,l,cur-1)	if(q[i].z!=INF)	t.add(q[i].y,-q[i].z);
	merge(l,r,mid);
}
signed main(){
	unable.insert(0);
	unable.insert(n+1);
	fz(i,1,n){
		scanf("%1d",&x[i]);
		unable.insert(i);
	}
	fz(i,1,n)	if(x[i])	toggle(i,0);
	fillbig(ans);
	fz(i,1,T){
		char opt[15];scanf("%s",opt+1);
		if(opt[1]=='q'){
			int l=read(),r=read();
			q[++p]={i,l,r,INF};
			int nxt=*unable.lower_bound(l);
			if(nxt>r)	ans[i]=-(T-i);
			else		ans[i]=0;
		}
		else{
			int x=read();
			toggle(x,i);
		}
	}
//	fz(i,1,p)	printf("%d %d %d %d\n",q[i].t,q[i].x,q[i].y,q[i].z);
	CDQ(1,p);
	fz(i,1,T)	if(ans[i]!=INF)	printf("%d\n",ans[i]);
	return 0;
}
2020/7/18 18:48
加载中...