社区讨论

卡常

P3527[POI 2011] MET-Meteors参与者 2已保存回复 1

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
1 条
当前快照
1 份
快照标识符
@lo2b23lj
此快照首次捕获于
2023/10/23 10:55
2 年前
此快照最后确认于
2023/11/03 11:05
2 年前
查看原帖
CPP
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <vector>
#define ll long long
using namespace std;

int n,m,k;
int ans[300005];
ll t[300005];
struct node{int id;ll w;};
node q[300005];
node q1[300005];
node q2[300005];
bool mp[300005];
struct opt{int l,r;ll w;};
opt g[600005];
vector <int> gg[300005];

inline void in(int &n){
	n=0;
	char c=getchar();
	while(c<'0' || c>'9') c=getchar();
	while(c>='0'&&c<='9') n=n*10+c-'0',c=getchar();
	return ;
}

inline void inl(ll &n){
	n=0;
	char c=getchar();
	while(c<'0' || c>'9') c=getchar();
	while(c>='0'&&c<='9') n=n*10+c-'0',c=getchar();
	return ;
}

inline void add(int x,ll k){while(x<=m) t[x]+=k,x+=x&-x;return ;}
inline ll ask(int x){ll s=0;while(x) s+=t[x],x^=x&-x;return s;}

void ZTEF(int l,int r,int L,int R){
	if(l==r){
		add(g[l<<1].l,g[l<<1].w);
		add(g[l<<1].r+1,-g[l<<1].w);
		if(mp[l<<1]) add(g[l<<1|1].l,g[l<<1|1].w),add(g[l<<1|1].r+1,-g[l<<1|1].w);
		for(int i=L;i<=R;i++){
			int x=q[i].id;
			ll s=0;
			for(int j=0;j<gg[x].size();j++) s+=ask(gg[x][j]);
			if(s>=q[i].w) ans[q[i].id]=l;
			else ans[q[i].id]=-1;
		}
		add(g[l<<1].l,-g[l<<1].w);
		add(g[l<<1].r+1,g[l<<1].w);
		if(mp[l<<1]) add(g[l<<1|1].l,-g[l<<1|1].w),add(g[l<<1|1].r+1,g[l<<1|1].w);
		return ;
	}
	int mid=l+r>>1;
	for(int i=l;i<=mid;i++){
		add(g[i<<1].l,g[i<<1].w);
		add(g[i<<1].r+1,-g[i<<1].w);
		if(mp[i<<1]) add(g[i<<1|1].l,g[i<<1|1].w),add(g[i<<1|1].r+1,-g[i<<1|1].w);
	}
	int t1=0,t2=0;
	for(int i=L;i<=R;i++){
		int x=q[i].id;
		ll s=0;
		for(int j=0;j<gg[x].size();j++) s+=ask(gg[x][j]);
		if(s>=q[i].w) q1[++t1]=q[i];
		else q[i].w-=s,q2[++t2]=q[i];
	}
	for(int i=1;i<=t1;i++) q[i+L-1]=q1[i];
	for(int i=1;i<=t2;i++) q[i+L+t1-1]=q2[i];
	for(int i=l;i<=mid;i++){
		add(g[i<<1].l,-g[i<<1].w);
		add(g[i<<1].r+1,g[i<<1].w);
		if(mp[i<<1]) add(g[i<<1|1].l,-g[i<<1|1].w),add(g[i<<1|1].r+1,g[i<<1|1].w);
	}
	ZTEF(l,mid,L,L+t1-1);
	ZTEF(mid+1,r,L+t1,R);
}

int main(){
	in(n),in(m);
	int x;
	for(int i=1;i<=m;i++)
		in(x),gg[x].push_back(i);
	for(int i=1;i<=n;i++) inl(q[i].w),q[i].id=i;
	opt tmp,tt;
	in(k);
	for(int i=1;i<=k;i++){
		in(tmp.l),in(tmp.r),inl(tmp.w);
		if(tmp.l>tmp.r){
			tt=tmp;
			tt.r=m;
			g[i<<1]=tt;
			tt=tmp;
			tt.l=1;
			g[i<<1|1]=tt;
			mp[i<<1]=1;
		}
		else g[i<<1]=tmp;
	}
	ZTEF(1,k,1,n);
	for(int i=1;i<=n;i++){
		if(ans[i]==-1) printf("NIE\n");
		else printf("%d\n",ans[i]);
	}

	return 0;
}

回复

1 条回复,欢迎继续交流。

正在加载回复...