社区讨论

为什么洛谷ac,cf上面wa1

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

讨论操作

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

当前回复
1 条
当前快照
1 份
快照标识符
@mi6nzoje
此快照首次捕获于
2025/11/20 07:59
4 个月前
此快照最后确认于
2025/11/20 07:59
4 个月前
查看原帖
CPP
#include<bits/stdc++.h>
#define ll long long
using namespace std;
const int maxn=3e5+10,inf=1e9+10;
struct opt
{
	int l,r,id,type;
	ll v;
	opt(int l=0,int r=0,int id=0,ll v=0,int type=0):l(l),r(r),id(id),v(v),type(type){}
}q[maxn<<1],tl[maxn<<1],tr[maxn<<1];
int ans[maxn],goal[maxn],belong[maxn];
int n,m,k,Q;
vector<int>v[maxn];
ll c[maxn];
inline void modify(int pos,ll val){for(int i=pos;i<maxn;i+=(i&(-i)))c[i]+=val;}
inline ll query(int pos){ll ret=0;for(int i=pos;i;i-=(i&(-i)))ret+=c[i];return ret;}
inline void add(int i,int tp,int f)
{
	if(tp==1)modify(q[i].l,f*q[i].v),modify(q[i].r+1,-f*q[i].v);
	else modify(q[i].l,f*q[i].v),modify(m+1,-f*q[i].v),modify(1,f*q[i].v),modify(q[i].r+1,-f*q[i].v);
}
void solve(int L,int R,int l,int r)
{
	if(L>R)return;
	if(l==r)
	{
		for(int i=L;i<=R;i++)
			if(q[i].type==2)ans[q[i].id]=l;
		return;
	}
	int mid=(l+r)>>1,cntl=0,cntr=0;
	for(int i=L;i<=R;i++)
	{
		if(q[i].type!=2)
		{
			if(q[i].id<=mid)
			{
				add(i,q[i].type,1);
				tl[++cntl]=q[i];
			}
			else tr[++cntr]=q[i];
		}
		else
		{
			ll val=0;int size=v[q[i].id].size();
			for(int j=0;j<size;j++)val+=query(v[q[i].id][j]);
			if(val<q[i].v)
			{
				q[i].v-=val;
				tr[++cntr]=q[i];
			}
			else tl[++cntl]=q[i];
		}
	}
	for(int i=L;i<=R;i++)if(q[i].type!=2&&q[i].id<=mid)add(i,q[i].type,-1);
	int p=L;
	for(int i=1;i<=cntl;i++)q[p++]=tl[i];
	for(int i=1;i<=cntr;i++)q[p++]=tr[i];
	solve(L,L+cntl-1,l,mid);solve(L+cntl,R,mid+1,r);
}
int main()
{
	scanf("%d%d",&n,&m);
	for(int i=1;i<=m;i++)scanf("%d",&belong[i]),v[belong[i]].push_back(i);
	for(int i=1;i<=n;i++)scanf("%d",&goal[i]);
	scanf("%d",&k);
	ll v;
	for(int i=1,l,r;i<=k;i++)
	{
		scanf("%d%d%I64d",&l,&r,&v);
		if(l>r)
		{
			q[++Q]=opt(l,r,i,v,3);
		}
		else q[++Q]=opt(l,r,i,v,1);
	}
	q[++Q]=opt(1,m,k+1,inf,1);
	for(int i=1;i<=n;i++)
		q[++Q]=opt(0,0,i,goal[i],2);
	solve(1,Q,1,k+1);
	for(int i=1;i<=n;i++)
		if(ans[i]==k+1)puts("NIE");
		else printf("%d\n",ans[i]);
}

回复

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

正在加载回复...