第十个点好慢a
查看原帖
第十个点好慢a
73847
OYBDOOO楼主2020/4/29 00:18

为啥我咋卡常都TLE

#pragma GCC optimize(2)
#pragma GCC optimize(3)
#pragma GCC optimize("Ofast")
#pragma GCC optimize("inline")
#pragma GCC optimize("-fgcse")
#pragma GCC optimize("-fgcse-lm")
#pragma GCC optimize("-fipa-sra")
#pragma GCC optimize("-ftree-pre")
#pragma GCC optimize("-ftree-vrp")
#pragma GCC optimize("-fpeephole2")
#pragma GCC optimize("-ffast-math")
#pragma GCC optimize("-fsched-spec")
#pragma GCC optimize("unroll-loops")
#pragma GCC optimize("-falign-jumps")
#pragma GCC optimize("-falign-loops")
#pragma GCC optimize("-falign-labels")
#pragma GCC optimize("-fdevirtualize")
#pragma GCC optimize("-fcaller-saves")
#pragma GCC optimize("-fcrossjumping")
#pragma GCC optimize("-fthread-jumps")
#pragma GCC optimize("-funroll-loops")
#pragma GCC optimize("-fwhole-program")
#pragma GCC optimize("-freorder-blocks")
#pragma GCC optimize("-fschedule-insns")
#pragma GCC optimize("inline-functions")
#pragma GCC optimize("-ftree-tail-merge")
#pragma GCC optimize("-fschedule-insns2")
#pragma GCC optimize("-fstrict-aliasing")
#pragma GCC optimize("-fstrict-overflow")
#pragma GCC optimize("-falign-functions")
#pragma GCC optimize("-fcse-skip-blocks")
#pragma GCC optimize("-fcse-follow-jumps")
#pragma GCC optimize("-fsched-interblock")
#pragma GCC optimize("-fpartial-inlining")
#pragma GCC optimize("no-stack-protector")
#pragma GCC optimize("-freorder-functions")
#pragma GCC optimize("-findirect-inlining")
#pragma GCC optimize("-fhoist-adjacent-loads")
#pragma GCC optimize("-frerun-cse-after-loop")
#pragma GCC optimize("inline-small-functions")
#pragma GCC optimize("-finline-small-functions")
#pragma GCC optimize("-ftree-switch-conversion")
#pragma GCC optimize("-foptimize-sibling-calls")
#pragma GCC optimize("-fexpensive-optimizations")
#pragma GCC optimize("-funsafe-loop-optimizations")
#pragma GCC optimize("inline-functions-called-once")
#pragma GCC optimize("-fdelete-null-pointer-checks")
#include<bits/stdc++.h>
#define ll long long
using namespace std;
struct QQQ
{
	int op,x1,y1,x2,y2,v;
	int id;
}q[600100],lq[600100],rq[600100];
vector<int>adj[500010];
int ans[500010];
ll fw[500010];
int req[500010];
int len=0,n,m,qq;
int read()
{
	int x=0;char c;
	while(c<'0'||c>'9')c=getchar();
	while(c>='0'&&c<='9')x=x*10+c-'0',c=getchar();
	return x;
}
int lowbit(int x){return x&(-x);}
void add(int pos,int x)
{
	for(int i=pos;i<=m;i+=lowbit(i))
		fw[i]+=x;
}
ll que(int pos)
{
	ll ret=0;int i;
	for(i=pos;i>0;i-=lowbit(i))
		ret+=fw[i];
	return ret;
}
void sol(int vl,int vr,int ql,int qr)
{
	int i,nl=0,nr=0;
	if(vl>vr||ql>qr)return;
	if(vl==vr)
	{
		for(i=ql;i<=qr;i++)
			if(q[i].op==2)
				ans[q[i].id]=vl;
		return;
	}
	int mid=(vl+vr)/2;
	for(i=ql;i<=qr;i++)
	{
		if(q[i].op==1)
		{
			if(q[i].id<=mid)
			{
				add(q[i].x1,+q[i].v);
				add(q[i].y1+1,-q[i].v);
				if(q[i].x2)
				{
					add(q[i].x2,+q[i].v);
					add(q[i].y2+1,-q[i].v);
				}
				lq[++nl]=q[i];
			}
			else rq[++nr]=q[i];
		}
		else
		{
			int ls=q[i].id;
			ll kkk=0;
			for(int k=0;k<adj[ls].size();k++)
			{
				int x=adj[ls][k];
				kkk+=que(x);
				if(kkk>=req[ls])break;
			}
			if(req[ls]<=kkk)lq[++nl]=q[i];
			else
			{
				req[ls]-=kkk;
				rq[++nr]=q[i];
			}
		}
	}
	for(i=ql;i<=qr;i++)
	{
		if(q[i].op==1)
		{
			if(q[i].id<=mid)
			{
				add(q[i].x1,-q[i].v);
				add(q[i].y1+1,+q[i].v);
				if(q[i].x2)
				{
					add(q[i].x2,-q[i].v);
					add(q[i].y2+1,+q[i].v);
				}
			}
		}
	}
	for(i=1;i<=nl;i++)q[ql+i-1]=lq[i];
	for(i=1;i<=nr;i++)q[ql+i-1+nl]=rq[i];
	sol(vl,mid,ql,ql+nl-1);
	sol(mid+1,vr,ql+nl,qr);
}
int main()
{
	int i,x,l,r;
	n=read();m=read();
	for(i=1;i<=m;i++)
	{
		x=read();
		adj[x].push_back(i);
	}
	for(i=1;i<=n;i++)req[i]=read();
	qq=read();
	for(i=1;i<=qq;i++)
	{
		l=read(),r=read(),x=read();
//		scanf("%d%d%d",&l,&r,&x);
		q[++len].op=1;q[len].id=i;
		q[len].v=x;
		if(l<=r)
			q[len].x1=l,q[len].y1=r;
		else
		{
			q[len].x1=l;q[len].y1=m;
			q[len].x2=1;q[len].y2=r;
		}
	}
	for(i=1;i<=n;i++)
	{
		q[++len].op=2;
		q[len].id=i;
	}
	q[++len].op=1;
	q[len].x1=l;q[len].y1=r;
	q[len].id=qq+1;q[len].v=1e9;
	sol(1,qq+1,1,len);
	for(i=1;i<=n;i++)
	{
		if(ans[i]>qq)printf("NIE\n");
		else printf("%d\n",ans[i]);
	}
	return 0;
}
2020/4/29 00:18
加载中...