Submission #1796041


Source Code Expand

#include <iostream>
#include <cstdio>
#include <cstring>
#include <cassert>
#include <cctype>
#include <vector>
#include <algorithm>
using namespace std;
typedef long long lint;
#define cout cerr
#define ni (next_num<int>())
template<class T>inline T next_num(){
	T i=0;char c;
	while(!isdigit(c=getchar())&&c!='-');
	bool flag=c=='-';
	flag?(c=getchar()):0;
	while(i=i*10-'0'+c,isdigit(c=getchar()));
	return flag?-i:i;
}
const int N=100010;
int pos[N],v[N],lst[N];
vector<int>vec[2];
inline bool pcmp(int a,int b){
	return pos[a]<pos[b];
}
int ans[N];
int main(){
	int n=ni,len=ni;
	lint t=ni;
	for(int i=1;i<=n;i++){
		pos[i]=ni;
		lst[i]=i;
		v[i]=3-(ni<<1);
		vec[v[i]>0].push_back(i);
	}
	if(vec[0].size()==0||vec[1].size()==0){
		for(int i=1;i<=n;i++){
			printf("%lld\n",((pos[i]+v[i]*t)%len+len)%len);
		}
		return 0;
	}
	sort(lst+1,lst+n+1,pcmp);
	sort(vec[1].begin(),vec[1].end(),pcmp);
	reverse(vec[1].begin(),vec[1].end());
	for(int i=0;i<(int)vec[0].size();i++){
		if(pos[vec[0][i]]<pos[vec[1][0]]){
			pos[vec[0][i]]+=len;
		}
	}
	sort(vec[0].begin(),vec[0].end(),pcmp);
	bool latter=false;
	lint finpos;
	{
		lint tmpans;
		{
			lint l=0,r=t;
			while(l<r){
				lint m=(l+r)>>1;
				lint p0=m%vec[0].size();
				lint p1=(m+1)%vec[1].size();
				lint pos0=pos[vec[0][p0]]+m/vec[0].size()*len;
				lint pos1=pos[vec[1][p1]]-(m+1)/vec[1].size()*len;
				if((t<<1)<pos0-pos1){
					r=m;
				}else{
					l=m+1;
				}
			}
			tmpans=l;
		}
		lint p0=tmpans%vec[0].size();
		lint p1=tmpans%vec[1].size();
		lint pos0=pos[vec[0][p0]]+tmpans/vec[0].size()*len;
		lint pos1=pos[vec[1][p1]]-tmpans/vec[1].size()*len;
		if((t<<1)<=pos0-pos1){
			finpos=pos1+t;
		}else{
			finpos=pos0-t;
		}
		finpos=(finpos%len+len)%len;
		if(tmpans){
			lint p11=(tmpans-1)%vec[0].size();
			lint pos11=pos[vec[0][p11]]+(tmpans-1)/vec[0].size()*len;
			if((t<<1)==pos11-pos1){
				latter=true;
			}
		}
	}
	for(int i=1;i<=n;i++){
		pos[i]=((pos[i]+(lint)v[i]*t)%len+len)%len;
	}
	sort(pos+1,pos+n+1);
	int curpos,curlst;
	for(int i=1;i<=n;i++){
		if(pos[i]==finpos){
			if(latter){
				if(pos[i%n+1]==pos[i]){
					curpos=i%n+1;
				}else{
					curpos=i;
				}
			}else{
				if(pos[i==1?n:i-1]==pos[i]){
					curpos=i==1?n:i-1;
				}else{
					curpos=i;
				}
			}
			break;
		}
	}
	for(int i=1;i<=n;i++){
		if(lst[i]==vec[1][0]){
			curlst=i;
			break;
		}
	}
	for(int i=1;i<=n;i++,curpos=curpos%n+1,curlst=curlst%n+1){
		ans[lst[curlst]]=pos[curpos];
	}
	for(int i=1;i<=n;i++){
		printf("%d\n",ans[i]);
	}
	return 0;
}

Submission Info

Submission Time
Task C - Ants on a Circle
User sshockwave
Language C++14 (GCC 5.4.1)
Score 700
Code Size 2634 Byte
Status AC
Exec Time 46 ms
Memory 3276 KB

Judge Result

Set Name Sample All
Score / Max Score 0 / 0 700 / 700
Status
AC × 2
AC × 20
Set Name Test Cases
Sample sample_01.txt, sample_02.txt
All sample_01.txt, sample_02.txt, sample_01.txt, sample_02.txt, subtask_1_01.txt, subtask_1_02.txt, subtask_1_03.txt, subtask_1_04.txt, subtask_1_05.txt, subtask_1_06.txt, subtask_1_07.txt, subtask_1_08.txt, subtask_1_09.txt, subtask_1_10.txt, subtask_1_11.txt, subtask_1_12.txt, subtask_1_13.txt, subtask_1_14.txt, subtask_1_15.txt, subtask_1_16.txt
Case Name Status Exec Time Memory
sample_01.txt AC 1 ms 256 KB
sample_02.txt AC 1 ms 256 KB
subtask_1_01.txt AC 27 ms 2176 KB
subtask_1_02.txt AC 21 ms 1792 KB
subtask_1_03.txt AC 45 ms 3276 KB
subtask_1_04.txt AC 46 ms 3236 KB
subtask_1_05.txt AC 6 ms 768 KB
subtask_1_06.txt AC 9 ms 896 KB
subtask_1_07.txt AC 34 ms 3068 KB
subtask_1_08.txt AC 42 ms 2980 KB
subtask_1_09.txt AC 22 ms 1920 KB
subtask_1_10.txt AC 20 ms 1920 KB
subtask_1_11.txt AC 4 ms 640 KB
subtask_1_12.txt AC 21 ms 2552 KB
subtask_1_13.txt AC 27 ms 2176 KB
subtask_1_14.txt AC 21 ms 2176 KB
subtask_1_15.txt AC 1 ms 256 KB
subtask_1_16.txt AC 1 ms 256 KB