为什么RE
查看原帖
为什么RE
805653
Anli_li_father楼主2023/11/27 13:25

提交记录

#include<cstdio>
#include<algorithm>
#include<queue>
using namespace std;
const int N=1e5+1;
queue<int> q[N];
struct SegmentTree
{
	struct Node
	{
		int sum;
		long long minimum;
	};
	Node node[N<<2];
	int len,d;
	void init(int l,int dt);
	void init(int now,int l,int r);
	void add(int id,int t);
	void add(int now,int l,int r,int pos,int val);
	int findpos(int id,int t);
	int findpos(int now,int l,int r,int pos,int t);
	int find(int t);
	int find(int now,int l,int r,int t);
	void pushUp(int now);
	int getSum(int l,int r);
	int getSum(int now,int l,int r,int ql,int qr);
};
void SegmentTree::init(int now,int l,int r)
{
	node[now].minimum=1e18;
	node[now].sum=0;
	if(l==r)
	{
		for(;q[l].size();q[l].pop());
		return;
	}
	int mid=(l+r)>>1;
	init(now<<1,l,mid);
	init(now<<1|1,mid+1,r);
	return;
}
void SegmentTree::init(int l,int dt)
{
	len=l;
	d=dt;
	init(1,1,l);
	return;
}
void SegmentTree::add(int id,int t)
{
	add(1,1,len,id,t);
	return;
}
void SegmentTree::add(int now,int l,int r,int pos,int val)
{
	if(l==r)
	{
		q[l].push(val);
		node[now].minimum=q[l].front();
		node[now].sum=q[l].size();
		return;
	}
	int mid=(l+r)>>1;
	if(pos<=mid)
	{
		add(now<<1,l,mid,pos,val);
	}
	else
	{
		add(now<<1|1,mid+1,r,pos,val);
	}
	pushUp(now);
	return;
}
void SegmentTree::pushUp(int now)
{
	node[now].sum=node[now<<1].sum+node[now<<1|1].sum;
	node[now].minimum=min(node[now<<1].minimum,node[now<<1|1].minimum);
	return;
}
int SegmentTree::findpos(int id,int t)
{
	return findpos(1,1,len,id,t);
}
int SegmentTree::findpos(int now,int l,int r,int pos,int t)
{
	if(l==r)
	{
		if(q[l].size())
		{
			if(q[l].front()+d-t>0)
			{
				return q[l].front()+d-t;
			}
			else
			{
				q[l].pop();
				node[now].sum=q[l].size();
				if(q[l].size())
				{
					node[now].minimum=q[l].front();
				}
				else
				{
					node[now].minimum=1e18;
				}
				return 0;
			}
		}
		return -1;
	}
	int mid=(l+r)>>1;
	int ret=0;
	if(pos<=mid)
	{
		ret=findpos(now<<1,l,mid,pos,t);
	}
	else
	{
		ret=findpos(now<<1,mid+1,r,pos,t);
	}
	pushUp(now);
	return ret;
}
int SegmentTree::find(int t)
{
	return find(1,1,len,t);
}
int SegmentTree::find(int now,int l,int r,int t)
{
	if(node[now].minimum+d-t>0)
	{
		return 0;
	}
	if(l==r)
	{
		q[l].pop();
		node[now].sum=q[l].size();
		if(q[l].size())
		{
			node[now].minimum=q[l].front();
		}
		else
		{
			node[now].minimum=1e18;
		}
		return l;
	}
	int mid=(l+r)>>1;
	int ret=0;
	if(node[now<<1].minimum+d-t<=0)
	{
		ret=find(now<<1,l,mid,t);
	}
	else
	{
		ret=find(now<<1|1,mid+1,r,t);
	}
	pushUp(now);
	return ret;
}
int SegmentTree::getSum(int l,int r)
{
	return getSum(1,1,len,l,r);
}
int SegmentTree::getSum(int now,int l,int r,int ql,int qr)
{
	if(r<ql || l>qr)
	{
		return 0;
	}
	if(ql<=l && r<=qr)
	{
		return node[now].sum;
	}
	int mid=(l+r)>>1;
	return getSum(now<<1,l,mid,ql,qr)+getSum(now<<1|1,mid+1,r,ql,qr);
}
int n,cd[N],mx;
SegmentTree seg;
void work()
{
	int t;
	scanf("%d",&t);
	for(int nowt=1;nowt<=t;nowt++)
	{
		scanf("%d",&n);
		mx=0;
		for(int i=1;i<=n;i++)
		{
			scanf("%d",&cd[i]);
			mx=max(mx,cd[i]);
		}
		seg.init(n,mx);
		int qq;
		scanf("%d",&qq);
		for(int nowq=1;nowq<=qq;nowq++)
		{
			int t,opt;
			scanf("%d%d",&t,&opt);
			if(opt==0)
			{
				int id;
				scanf("%d",&id);
				seg.add(id,t+cd[id]-mx);
			}
			else if(opt==1)
			{
				int res=seg.find(t);
				if(res)
				{
					printf("%d\n",res);
				}
				else
				{
					printf("Yazid is angry.\n");
				}
			}
			else if(opt==2)
			{
				int id;
				scanf("%d",&id);
				int res=seg.findpos(id,t);
				if(res==-1)
				{
					printf("YJQQQAQ is angry.\n");
				}
				else if(res==0)
				{
					printf("Succeeded!\n");
				}
				else
				{
					printf("%d\n",res);
				}
			}
			else if(opt==3)
			{
				int l,r;
				scanf("%d%d",&l,&r);
				printf("%d\n",seg.getSum(l,r));
			}
		}
	}
	return;
}
int main()
{
	freopen("data.txt","r",stdin);
	work();
	return 0;
}
2023/11/27 13:25
加载中...