【玄关】其余不论,为何TLE
  • 板块灌水区
  • 楼主AKorz
  • 当前回复3
  • 已保存回复3
  • 发布时间2024/9/15 15:26
  • 上次更新2024/9/15 18:19:12
查看原帖
【玄关】其余不论,为何TLE
716602
AKorz楼主2024/9/15 15:26
#include<bits/stdc++.h>
using namespace std;
#define INF 0x3f3f3f3f3f3f3f3f
#define ll long long
#define N 100009
#define calc(x) (1<<(x))
ll n,q,x,y,lg[N],lst[N],dep[N],fa[N][20],sum[N][20];
struct node{ll u,v;}a[N];
vector<ll>e[N];
stack<ll>stk;
ll read()
{
	ll res=0,flag=1;char ch=getchar();
	while(ch<'0'||ch>'9') flag*=((ch=='-')?(-1):(1)),ch=getchar();
	while(ch>='0'&&ch<='9') res=res*10+ch-'0',ch=getchar();
	return res*flag;
}
void write(ll res)
{
	if(res<0) putchar('-'),res=-res;
	if(res>9) write(res/10);
	putchar(res%10+'0');
}
void dfs(ll id,ll pos)
{
	fa[id][0]=lst[id],sum[id][0]=a[id].v,dep[id]=pos;
	for(ll i=0;i<e[id].size();i++) dfs(e[id][i],pos+1);
}
ll check(ll id,ll pos,ll key)
{
	ll l=0,r=pos,res=0;
	while(l<=r)
	{
		ll mid=(l+r)>>1;
		if(sum[id][mid]<=key) res=mid,l=mid+1;
		else r=mid-1;
	}
	return res;
}
int main()
{
	n=read(),q=read(),a[n+1]={INF,INF},lst[n+1]=n+1,lg[0]=-1;
	for(ll i=1;i<=n;i++) lg[i]=lg[i>>1]+1;
	for(ll i=1;i<=n;i++) a[i].u=read(),a[i].v=read();
	for(ll i=1;i<=n+1;i++) 
	{
		while(!stk.empty()&&a[stk.top()].u<a[i].u) 
		{
			lst[stk.top()]=i;
			e[i].push_back(stk.top());
			stk.pop();
		}
		stk.push(i);
	}
	dfs(n+1,0);
	for(ll j=1;j<=18;j++)
	for(ll i=1;calc(j)<=dep[i];i++)
	{
		fa[i][j]=fa[fa[i][j-1]][j-1];
		sum[i][j]=sum[i][j-1]+sum[fa[i][j-1]][j-1];
	}
	while(q--)
	{
		x=read(),y=read();
		while(x!=n+1&&y>0)
		{
			ll ans=check(x,lg[dep[x]],y);
			//printf("%d~%d %d\n",0,lg[dep[x]],ans);
			//printf("在%d(%d)预算内%d->%d\n",y,sum[x][ans],x,fa[x][ans]);
			if(sum[x][ans]>=y) y=0;
			else y-=sum[x][ans],x=fa[x][ans];
		}
		write((x==n+1)?(0):(x)),putchar('\n');
	}
	return 0;
}

P7167,TLE 11个点,WA 4个点,就#4的hack数据是对的……按道理来说,这不应该是O(n log n)O(n\ log\ n)的时间复杂度吗,就算WA也不可能T吧……

2024/9/15 15:26
加载中...