Educational Codeforces Round 109 (Rated for Div. 2) C. Robot Collisions (栈,模拟)
Posted Accelerator
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Educational Codeforces Round 109 (Rated for Div. 2) C. Robot Collisions (栈,模拟)相关的知识,希望对你有一定的参考价值。
-
题意:在一维坐标轴上有很多小机器人,它们只能一直向左或者向右每次移动一个单位,在\\(x=0\\)和\\(x=m\\)处分别设有一道屏障,小机器人达到屏障后立刻掉头反向移动,如果有两个小机器人移动后在同一个单位,那么它们就会相撞爆炸,在移动的过程中相遇并不会爆炸,问你每个小机器人爆炸的时间,如果不会相撞爆炸,输出\\(-1\\).
-
题解:因为错开了一位,所以偶数位和奇数位的小机器人永远不会相撞.因此我们将奇数位置和偶数位置的小机器人分开来看.先排序,向左跑的小机器人必然会和它前面第一个向右跑的合法机器人相撞,遍历,我们可以将向右跑的机器人入栈,当遍历到向左跑的机器人时,如果栈顶的机器人是向右跑的,算答案,如果栈顶时向左跑的,算答案(可以将栈顶机器人位置移动到0轴的左边),如果栈空或者当前机器人向右跑,将它入栈.最后栈可能大于1个元素,它们都是向右跑的(栈尾可能会有一个向右的),直接算答案即可.
-
代码:
#include <bits/stdc++.h> #define ll long long #define fi first #define se second #define pb push_back #define me memset #define rep(a,b,c) for(int a=b;a<=c;++a) #define per(a,b,c) for(int a=b;a>=c;--a) const int N = 1e6 + 10; const int mod = 1e9 + 7; const int INF = 0x3f3f3f3f; using namespace std; typedef pair<int,int> PII; typedef pair<ll,ll> PLL; ll gcd(ll a,ll b) {return b?gcd(b,a%b):a;} ll lcm(ll a,ll b) {return a/gcd(a,b)*b;} int main() { ios::sync_with_stdio(false);cin.tie(0);cout.tie(0); int _; cin>>_; while(_--){ int n,m; cin>>n>>m; vector<PII> pt(n+1); vector<char> dir(n+1); vector<vector<int>> stk(2); vector<int> ans(n+1,-1); rep(i,1,n){ int pos; cin>>pos; pt[i].fi=pos; pt[i].se=i; } rep(i,1,n) cin>>dir[i]; sort(pt.begin()+1,pt.end()); rep(i,1,n){ int id=pt[i].fi%2; char pt_dir=dir[pt[i].se]; if(pt_dir==\'L\'){ if(stk[id].empty()){ stk[id].pb(i); } else{ int cur=stk[id].back(); stk[id].pop_back(); if(dir[pt[cur].se]==\'L\'){ ans[pt[i].se]=ans[pt[cur].se]=(pt[i].fi+pt[cur].fi)/2; } else{ ans[pt[i].se]=ans[pt[cur].se]=(pt[i].fi-pt[cur].fi)/2; } } } else{ stk[id].pb(i); } } rep(i,0,1){ while((int)stk[i].size()>1){ //R很多的情况 int cur2=stk[i].back(); stk[i].pop_back(); int cur1=stk[i].back(); stk[i].pop_back(); if(dir[pt[cur1].se]==\'L\'){ ans[pt[cur1].se]=ans[pt[cur2].se]=(m+m-pt[cur2].fi+pt[cur1].fi)/2; } else{ ans[pt[cur1].se]=ans[pt[cur2].se]=(m+m-pt[cur2].fi-pt[cur1].fi)/2; } } } rep(i,1,n) cout<<ans[i]<<\' \'; cout<<\'\\n\'; } return 0; }
以上是关于Educational Codeforces Round 109 (Rated for Div. 2) C. Robot Collisions (栈,模拟)的主要内容,如果未能解决你的问题,请参考以下文章
Educational Codeforces Round 7 A
Educational Codeforces Round 7
Educational Codeforces Round 90
Educational Codeforces Round 33