MLE求助!
查看原帖
MLE求助!
437788
eEfiuys楼主2021/7/6 16:26

1010 个点 MLE 了。

#include<bits/stdc++.h>
#define int long long
using namespace std;
signed n,m,k;
int p[400000],tree[400000],a[550000];
signed o,l[550000],r[550000],ans[400000];
vector<signed>v[1050000];
vector<signed>s[300000];
queue<signed>ql,qr;
inline int lowbit(int x)
{
	return x&-x;
}
inline void add(signed x,int k)
{
	while(x<=m)
	{
		tree[x]+=k;
		x+=lowbit(x);
	}
}
inline void add1(signed x)
{
	if(l[x]==0&&r[x]==0&&a[x]==0)
		return;
	if(l[x]<=r[x])
	{
		add(l[x],a[x]);
		if(r[x]!=m)
			add(r[x]+1,-a[x]);
	}
	else
	{
		add(1,a[x]);
		add(r[x]+1,-a[x]);
		add(l[x],a[x]);
	}
}
inline int find(signed x)
{
	int num=0;
	while(x)
	{
		num+=tree[x];
		x-=lowbit(x);
	}
	return num;
}
inline void check(signed x)
{
	for(signed i=0;i<v[x].size();i++)
	{
		signed vec=v[x][i],num=0;
		for(signed j=0;j<s[vec].size();j++)
		{
			num+=find(s[vec][j]);
			if(num>=p[vec])
			{
				v[2*x].push_back(vec);
				goto a1;
			}
		}			
		v[2*x+1].push_back(vec);
		a1:;
	}
}
inline void bfs()
{
	for(signed i=1;i<=n;i++)
		v[1].push_back(i);
	ql.push(1),qr.push(k);
	signed t=0,now=0;
	while(!ql.empty())
	{
		signed l=ql.front(),r=qr.front();
		ql.pop(),qr.pop();
		t++;
		if(l==r)
		{
			for(signed i=0;i<v[t].size();i++)
				ans[v[t][i]]=l;
			continue;
		}
		signed mid=(r+l-1)>>1;
		if(now>mid)
		{
			memset(tree,0,sizeof(tree));
			now=0;
		}
		while(now<mid)
		{
			now++;
			add1(now);
		}
		check(t);
		v[t].clear();
		ql.push(l),qr.push(mid);
		ql.push(mid+1),qr.push(r);
	}
}
signed main()
{
	//freopen("data.in","r",stdin);
	//freopen("data.out","w",stdout);
	cin>>n>>m;
	for(signed i=1;i<=m;i++)
		scanf("%d",&o),s[o].push_back(i);
	for(signed i=1;i<=n;i++)
		scanf("%lld",&p[i]);
	cin>>k;
	for(signed i=1;i<=k;i++)
		scanf("%d%d%lld",&l[i],&r[i],&a[i]);
	signed k1=k;
	k=(1<<(signed)ceil(log(k+1)/log(2)));
	bfs();
	for(signed i=1;i<=n;i++)
		if(ans[i]>k1)
			cout<<"NIE\n";
		else 
			cout<<ans[i]<<"\n";
	return 0;
}
2021/7/6 16:26
加载中...