Educational Codeforces Round 109 (Rated for Div. 2) C. Robot Collisions (栈,模拟)

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;
    }
    
    
上一篇:Vue PT程序页面


下一篇:Small Structures:低载量Pt纳米团簇锚定在石墨烯空心球上用于高效析氢