I

来源:互联网 发布:中老年交友软件 编辑:程序博客网 时间:2024/05/17 07:38

题意:

给出每个火车的入境时间,现在有如干个开关,以及每个火车需要达到的处境口编号,询问开关的切换时间,以及切换编号

思路:

对于每个火车,前面的火车与后面的火车永远不会相撞(只要让前面的火车一直运动下去)。因此每个节点当前只需要处理当前的火车即可

记录节点的状态 (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);    }}


原创粉丝点击