[校内模拟][思维题] 201017Practice NOIP Day2 T2 Invert

it2025-01-26  11

T2

题意

L L L的环上有 n n n个人,有些正向走,有些逆向走,速度均为 1 1 1个单位 / s /s /s 如果相遇,两人反向 给出时间,求第 i i i个人在环上的位置

正解

注意到这些人的相对位置不变,最后排个序就行了

注意到有人经过分割点(指 0 0 0 L − 1 L-1 L1中间的点) 如果正着走,坐标最小的人编号++,编号为1的人坐标– 反之同理

注意算每一个人时,可能该人多次穿过分割点 注意算起点的时候,%n需要里面-1,外面把1加回来 因为起点不可能为0

#include<bits/stdc++.h> using namespace std; #define in Read() int in{ int i=0;char f=true;char ch=0; while(!isdigit(ch)&&ch!='-') ch=getchar(); if(ch=='-') ch=getchar(),f=false; while(isdigit(ch)) i=(i<<3)+(i<<1)+ch-48,ch=getchar(); return f?i:-i; } const int N=1e5+5; int n,L,T,a[N],b[N],s=1; int main(){ n=in,L=in,T=in; for(int i=1;i<=n;++i){ int x=in,w=in; if(w==1){ a[i]=(x+T)%L; if(T>=L-x) (s-=(T-L+x)/L+1)%=n; }else{ a[i]=((x-T)%L+L)%L; if(T>=x+1) (s+=(T-x-1)/L+1)%=n; } } s=(s%n+n-1)%n+1; sort(a+1,a+n+1); for(int i=1;i<=n;++i) b[(s+i-2)%n+1]=a[i]; for(int i=1;i<=n;++i) printf("%d\n",b[i]); return 0; }

另外T4直接咕了 巨佬都说做不起

最新回复(0)