题意:
给出每个火车的入境时间,现在有如干个开关,以及每个火车需要达到的处境口编号,询问开关的切换时间,以及切换编号
思路:
对于每个火车,前面的火车与后面的火车永远不会相撞(只要让前面的火车一直运动下去)。因此每个节点当前只需要处理当前的火车即可
记录节点的状态 (0,1 表示左侧还是右侧开关状态)
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#include<vector>
#include <map>
#include <queue>
using namespace std;
typedef long long ll;
vector<int>vec[5005];
int place[5005];
int has[3000];
int num[3000];
int cnt=0;
void dfs(int u)
{
if(vec[u].size()>0)
{
int v=vec[u][0];
dfs(v);
}
num[u]=++cnt;
if(vec[u].size()>1)
{
int v=vec[u][1];
dfs(v);
}
}
int ans=0;
struct node
{
int ti,pl;
bool friend operator <(node x, node y)
{
return x.ti<y.ti;
}
} anstmp[50000];
int op[50000];
void solve(int u,int aim,int t)
{
if(aim==num[u])
return ;
int v;
if(aim>num[u])
{
if(op[u]==0)
{
ans++;
anstmp[ans].ti=t;
anstmp[ans].pl=u;
op[u]=1;
}
v=vec[u][1];
solve(v,aim,t+1);
}
else
{
if(op[u]==1)
{
ans++;
anstmp[ans].ti=t;
anstmp[ans].pl=u;
op[u]=0;
}
v=vec[u][0];
solve(v ,aim,t+1);
}
}
struct nodex
{
char k;
int t;
friend bool operator <(nodex x,nodex y)
{
return x.t<y.t;
}
} car[50000];
int main()
{
freopen("instruction.in","r",stdin);
freopen("instruction.out","w",stdout);
int n;
scanf("%d",&n);
for(int i=1; i<=n; i++)
{
char s[5];
scanf("%s",s);
place[i]=(s[0]=='s'?0:1);
if(s[0]=='s')
{
int v;
scanf("%d",&v);
vec[v].push_back(i);
}
else
{
int u;
scanf("%d",&u);
scanf("%s",s);
vec[u].push_back(i);
has[s[0]-'a']=i;
}
}
int m;
dfs(0);
scanf("%d",&m);
for(int i=1; i<=m; i++)
{
scanf("%d",&car[i].t);
char kk[5];
scanf("%s",kk);
car[i].k=kk[0];
}
sort(car+1,car+1+m);
for(int i=1; i<=m; i++)
{
int aim=car[i].k-'a';
aim=has[aim];
solve(0,num[aim],car[i].t);
}
sort(anstmp+1,anstmp+1+ans);
printf("%d\n",ans);
for(int i=1; i<=ans; i++)
{
printf("%d %d\n",anstmp[i].pl,anstmp[i].ti);
}
}