-
题意:在一维坐标轴上有很多小机器人,它们只能一直向左或者向右每次移动一个单位,在\(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; }
相关文章
- 01-19Educational Codeforces Round 74 (Rated for Div. 2) C. Standard Free2play
- 01-19Educational Codeforces Round 63 (Rated for Div. 2) B. Game with Telephone Numbers 博弈思维+模拟+贪心思维
- 01-19Educational Codeforces Round 84 (Rated for Div. 2) B. Princesses and Princes(模拟)
- 01-19Educational Codeforces Round 60 (Rated for Div. 2) C. Magic Ship
- 01-19Educational Codeforces Round 93 (Rated for Div. 2) C. Good Subarrays(前缀和优化技巧)
- 01-19Educational Codeforces Round 109 (Rated for Div. 2) C. Robot Collisions (栈,模拟)
- 01-19Educational Codeforces Round 61 (Rated for Div. 2) G(线段树,单调栈)
- 01-19Educational Codeforces Round 118 (Rated for Div. 2) C. Poisoned Dagger
- 01-19Educational Codeforces Round 106 (Rated for Div. 2) C. Minimum Grid Path
- 01-19Educational Codeforces Round 110 (Rated for Div. 2) D. Playoff Tournament (线段树,模拟)