CF257E模拟电梯求调
  • 板块学术版
  • 楼主Hoks
  • 当前回复0
  • 已保存回复0
  • 发布时间2023/8/4 10:16
  • 上次更新2023/11/3 06:01:14
查看原帖
CF257E模拟电梯求调
551100
Hoks楼主2023/8/4 10:16

我是真的看不出来我哪里模拟的有问题了

#include<bits/stdc++.h>
#define int long long
#define ec 114514
#define fi first
#define se second
using namespace std;
struct node
{int t,st,ed,id;}a[ec];
int n,m,t,mq=1,up,down;
int ans[ec];
priority_queue<pair<int,int> > down1,down2;
priority_queue<pair<int,int>,vector<pair<int,int> >,greater<pair<int,int> > > up1,up2;
int read()
{
	char c=getchar();int x=0;
	while(!isdigit(c)) c=getchar();
	while(isdigit(c)) x=(x<<1)+(x<<3)+(c^48),c=getchar();
	return x;
}
bool cmp(node x,node y){return x.t<y.t;}
signed main()
{
	n=read(),m=read();
	for(int i=1;i<=n;i++) a[i].t=read(),a[i].st=read(),a[i].ed=read(),a[i].id=i;
	sort(a+1,a+1+n,cmp);a[n+1].t=1145141919810;
	for(int i=1;i<=n+1;i++)
	{
		int sysj=a[i].t-a[i-1].t;t=a[i-1].t;
		up=up1.size()+up2.size();down=down1.size()+down2.size();
		while(sysj&&up+down>0)
			if(up>=down)
			{
				int xysj=0x3f3f3f3f3f3f3f3f;
				if(!up2.empty()) xysj=min(xysj,up2.top().fi);
				if(!up1.empty()) xysj=min(xysj,up1.top().fi);
				xysj-=mq;
				if(xysj>sysj){mq+=sysj;break;}
				if(!up2.empty()&&mq+xysj==up2.top().fi)
					while(!up2.empty()&&up2.top().fi==mq+xysj)
					{
						int u=up2.top().se;up2.pop();
						if(a[u].ed>mq+xysj) up1.push(make_pair(a[u].ed,a[u].id));
						else down1.push(make_pair(a[u].ed,a[u].id));
					}
				if(!up1.empty()&&mq+xysj==up1.top().fi)
					while(!up1.empty()&&up1.top().fi==mq+xysj)
					{
						int u=up1.top().se;up1.pop();
						ans[u]=t+xysj;
					}
				sysj-=xysj;t+=xysj;mq+=xysj;
			}
			else
			{
				int xysj=-1;
				if(!down2.empty()) xysj=max(xysj,down2.top().fi);
				if(!down1.empty()) xysj=max(xysj,down1.top().fi);
				xysj=mq-xysj;
				if(xysj>sysj){mq-=sysj;break;}
				if(!down2.empty()&&mq-xysj==down2.top().fi)
					while(!down2.empty()&&down2.top().fi==mq-xysj)
					{
						int u=down2.top().se;down2.pop();
						if(a[u].ed>mq-xysj) up1.push(make_pair(a[u].ed,a[u].id));
						else down1.push(make_pair(a[u].ed,a[u].id));
					}
				if(!down1.empty()&&mq-xysj==down1.top().fi)
					while(!down1.empty()&&down1.top().fi==mq-xysj)
					{
						int u=down1.top().se;down1.pop();
						ans[u]=t+xysj;
					}
				sysj-=xysj;t+=xysj;mq-=xysj;
			}
		if(i>n) break;
		if(a[i].st==mq)
		  	if(a[i].ed>mq) up1.push(make_pair(a[i].ed,a[i].id));
			else down1.push(make_pair(a[i].ed,a[i].id));
		else 
		  	if(a[i].st>mq) up2.push(make_pair(a[i].st,i));
		  	else down2.push(make_pair(a[i].st,i)); 
		while(a[i+1].t==a[i].t)
		{
			i++;
			if(a[i].st==mq)
			  	if(a[i].ed>mq) up1.push(make_pair(a[i].ed,a[i].id));
			    else down1.push(make_pair(a[i].ed,a[i].id));
			else 
			  	if(a[i].st>mq) up2.push(make_pair(a[i].st,i));
		  	    else down2.push(make_pair(a[i].st,i)); 
		}
	}
	for(int i=1;i<=n;i++) cout<<ans[i]<<endl;
	return 0;
}
2023/8/4 10:16
加载中...