线段树40pts求调
  • 板块P4215 踩气球
  • 楼主zzbzwjx
  • 当前回复0
  • 已保存回复0
  • 发布时间2024/9/3 23:37
  • 上次更新2024/9/4 16:19:51
查看原帖
线段树40pts求调
957105
zzbzwjx楼主2024/9/3 23:37

TLE

#include <bits/stdc++.h>
using namespace std;
#define int  long long
#define N 100001
int n,m,a[N],l[N],r[N],q,x,t[6*N],g[6*N],ans,la;
void dtr(int k,int l,int r){
	if(l==r){
		t[k]=a[l];
		return ;
	}int m=(l+r)/2;
	dtr(k*2,l,m);dtr(k*2+1,m+1,r);
	t[k]=t[k*2]+t[k*2+1];
}
void ad(int k,int l,int r,int gg){
	g[k]+=gg;
	t[k]+=(r-l+1)*gg;
}
void pd (int k,int l,int r,int m){
	if(!g[k])return;
	ad(k*2,l,m,g[k]);
	ad(k*2+1,m+1,r,g[k]);
	g[k]=0;
}
void adt(int k,int l,int r,int bg,int ed){
	if(l>=bg&&r<=ed)return ad(k,l,r,-1);
	int m=(l+r)/2;
	pd(k,l,r,m);
	if(bg<=m)adt(k*2,l,m,bg,ed);
	if(m<ed)adt(k*2+1,m+1,r,bg,ed);
	t[k]=t[k*2]+t[k*2+1];
}
int out(int k,int l,int r,int bg,int ed){
	if(bg>r||ed<l)return 0;
	if(bg<=l&&ed>=r)return t[k];
	int m=(l+r)/2;
	pd(k,l,r,m);
	return out(k*2,l,m,bg,ed)+out(k*2+1,m+1,r,bg,ed);
}
signed main() {
	ios::sync_with_stdio(0);
	cin>>n>>m;
	for(int i=1;i<=n;i++)cin>>a[i];
	for(int i=1;i<=m;i++)cin>>l[i]>>r[i];
	cin>>q;
	dtr(1,1,n);
	while(q--){
		cin>>x;
		x=(x+la-1)%n+1;
//		cout<<x<<'!';
		adt(1,1,n,x,x);
		for(int i=1;i<=m;i++)
			if(out(1,1,n,l[i],r[i])==0)ans++;
		cout<<ans<<'\n';
		la=ans;ans=0;
	}
	return 0; //好习惯
}
2024/9/3 23:37
加载中...