Codeforces Round #431 (Div. 1) B. Rooter's Song(模拟)

来源:互联网 发布:linux数据库备份命令 编辑:程序博客网 时间:2024/06/15 05:33

题目链接:http://codeforces.com/contest/848/problem/B


很容易能看出来,相遇的情况只有在 y-t=x-t 的情况下才会成立,然后,按照x的坐标排序,从左向右模拟碰撞的情况即可,本代码用了一个循环队列模拟。


代码:

#include<bits/stdc++.h>#define xx first#define yy second#define mp make_pairusing namespace std;const int MAXN=1e5+5;const int ZERO=2e5+5000;int n,w,h;struct node{int id,x,t;node(){}node(int _id,int _x,int _t):id(_id),x(_x),t(_t){}bool operator < (const node &a)const {return x<a.x;}}X[MAXN];vector<node> Y[MAXN*4];int cnt[MAXN*4];pair<int,int> ans[MAXN];int main(){//freopen("in.txt","r",stdin);//freopen("out.txt","w",stdout);scanf("%d%d%d",&n,&w,&h);int tot=0;for(int i=1;i<=n;i++){int g,p,t;scanf("%d%d%d",&g,&p,&t);if(g==1){X[++tot]=node(i,p,t);}else{Y[p-t+ZERO].push_back(node(i,p,t));}}sort(X+1,X+1+tot);for(int i=0;i<4*MAXN;i++){sort(Y[i].begin(),Y[i].end());}for(int i=1;i<=tot;i++){int pos=X[i].x-X[i].t+ZERO;int sz=Y[pos].size();if(sz){int en=((sz-cnt[pos]-1)%sz+sz)%sz;swap(Y[pos][en].id,X[i].id);cnt[pos]++;}//printf("%d\n",X[i].id);ans[X[i].id]=mp(X[i].x,h);}for(int i=0;i<4*MAXN;i++){int sz=Y[i].size();for(int j=0;j<sz;j++){int pos=(((sz-cnt[i]-1)%sz+sz)%sz+j+1)%sz;ans[Y[i][pos].id]=mp(w,Y[i][j].x);}}for(int i=1;i<=n;i++){printf("%d %d\n",ans[i].xx,ans[i].yy);}return 0;}


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