Codeforces Round #431 (Div. 2) D Rooter's Song

来源:互联网 发布:广州女人街网络批发 编辑:程序博客网 时间:2024/06/05 14:56

这个题和那个蚂蚁爬杆的题目很是相似,刘汝佳白皮书第9页。

从这个题目来说,x+y-t如果相等肯定会相遇。然后横着的和竖着的遇见会转向。先记录下来每个数的id,然后枚举横着的和竖着的x+y-t相同的数,改变方向,就是交换他们的id

我的超时了

#include<bits\stdc++.h>using namespace std;typedef long long ll;#define pb push_backconst int mod=1e9+7;const int maxn=100006;struct node{    int t,id,d,st;}row[maxn],col[maxn];//row代表坐标在x轴,col代表坐标在y轴bool cmp(node a,node b){    if(a.t==b.t)return a.st<b.st;    return a.t<b.t;}bool cmp1(node a,node b){    return a.id<b.id;}int main(){    int n,w,h;scanf("%d%d%d",&n,&w,&h);int t,st,d;int n1=0,n2=0;for(int i=1;i<=n;i++){    scanf("%d%d%d",&d,&st,&t);    t=st-t;    if(d==1)    {        row[n1].st=st;        row[n1].id=i;        row[n1++].t=t;    }    else    {        col[n2].st=st;        col[n2].id=i;        col[n2++].t=t;    }}sort(row,row+n1,cmp);sort(col,col+n2,cmp);//cout<<n1<<" "<<n2<<endl;int j=0;for(int i=0;i<n1;i++){    while(col[j].t<row[i].t&&j<n2)j++;    if(j>=n2)break;    if(col[j].t==row[i].t)    {while(col[j].t==row[i].t&&j<n2)    {      //  cout<<i<<" "<<j<<endl;        t=col[j].id;        col[j].id=row[i].id;        row[i].id=t;        j++;    }    j--;     while(col[j].t==row[i].t&&j>0)j--;}}sort(row,row+n1,cmp1);sort(col,col+n2,cmp1);j=0;int i=0;while(1){    if(i==n1&&j==n2)break;    if(i==n1)    {        printf("%d %d\n",w,col[j].st);        j++;        continue;    }    if(j==n2)    {         printf("%d %d\n",row[i].st,h);        i++;        continue;    }    if(row[i].id<col[j].id)    {        printf("%d %d\n",row[i].st,h);        i++;    }    else    {        printf("%d %d\n",w,col[j].st);        j++;    }}    return 0;}close

大神代码

#include<bits/stdc++.h>using namespace std;const int N=2e5+10;int n,h,w,tp[N],pos[N],t[N],x[N];//只需要考虑相撞后交换id的过程即可 vector<int> vx[N],vy[N];pair<int,int> ans[N];bool cmp(int x,int y){return pos[x]<pos[y];}int main(){scanf("%d%d%d",&n,&w,&h);for (int i=1;i<=n;i++){scanf("%d%d%d",&tp[i],&pos[i],&t[i]);x[i]=pos[i]-t[i]+1e5;if (tp[i]==1) vx[x[i]].push_back(i);else vy[x[i]].push_back(i);}for (int i=1;i<=2e5;i++){int cntx=vx[i].size();int cnty=vy[i].size();sort(vx[i].begin(),vx[i].end(),cmp);sort(vy[i].begin(),vy[i].end(),cmp);for (int j=0;j<cntx;j++){int id=vx[i][j];int right=cntx-j;if (right>cnty) ans[id]=make_pair(pos[vx[i][j+cnty]],h);else ans[id]=make_pair(w,pos[vy[i][right-1]]);}for (int j=0;j<cnty;j++){int id=vy[i][j];int up=cnty-j;if (up>cntx) ans[id]=make_pair(w,pos[vy[i][j+cntx]]);else ans[id]=make_pair(pos[vx[i][up-1]],h);}}for (int i=1;i<=n;i++) printf("%d %d\n",ans[i].first,ans[i].second);return 0;}



阅读全文
0 0
原创粉丝点击