题解:P15783 [JAG 2025 Summer Camp #3] Ants Collision
Solution
先考虑怎么算碰撞次数。
首先考虑从左往右加入一只蚂蚁,假设前面有
先从左往找到第一个
对于左边连续的位置,如果为奇数一定是
最后模拟一遍,判断是否与给定的相同。
code
#include<bits/stdc++.h>
#define IOS cin.tie(0),cout.tie(0),ios::sync_with_stdio(0)
#define ll long long
#define db double
#define pb push_back
#define eb emplace_back
#define MS(x,y) memset(x,y,sizeof(x))
#define MC(x,y) memcpy(x,y,sizeof(x))
#define PLL pair<ll,ll>
#define PII pair<int,int>
#define Tp template<typename T>
#define Ts template<typename T,typename ...args>
#define lb(x) ((x)&(-x))
using namespace std;
const int N=3e5+20,M=1e5+20;
const ll INF=1ll<<60,mod=998244353;
namespace H_H_READ{
char Buf[1<<23],*P1=Buf,*P2=Buf;
#define gc() (P1==P2&&(P2=(P1=Buf)+fread(Buf,1,1<<23,stdin),P1==P2)?EOF:*P1++)
Tp inline void read(T &o){
bool f=0;o=0;int ch=gc();
while(!isdigit(ch)) f=ch=='-',ch=gc();
while(isdigit(ch)) o=(o<<1)+(o<<3)+(ch^48),ch=gc();
if(f) o=-o;
}
Tp inline void Write(T o){
if(o<0) putchar('-'),o=-o;
if(o>9) Write(o/10);
putchar(o%10+'0');
}
Tp inline void write(T o,char ch='\n'){Write(o);putchar(ch);}
Ts inline void read(T &x,args&... y){read(x),read(y...);}
Ts inline void write(T x,args... y){write(x,' '),write(y...);}
}using H_H_READ::read;using H_H_READ::write;
namespace H_H{
int n,a[N],ans[N],b[N];//0:L,1:R
void solve(){
read(n);
int tot=0;
for(int i=1;i<=n;i++) read(a[i]),tot+=(a[i]&1);
a[n+1]=0;
for(int i=0;i<=n;i++) b[i]=0;
int l=1,r=n;
while(l<=r && !a[r]) ans[r--]=1;
while(l<=r && !a[l]) ans[l++]=0;
if(l>r){
for(int i=1;i<=n;i++) putchar(ans[i]?'R':'L');
puts("");
return ;
}
int pos=0,cnt=0;
for(int i=l;i<=r;i++){
tot-=a[i]&1;
cnt+=(a[i]&1)^1;
if(i-l+1==tot+cnt){
pos=i;
break;
}
}
if(!pos) return puts("No"),void();
for(int i=l;i<=pos;i++) ans[i]=a[i]&1;
for(int i=pos+1;i<=r;i++) ans[i]=(a[i]&1)^1;
int num=0;
for(int i=1;i<=n;i++){
if(ans[i]) num++;
else{
if(num){
b[i-num]++;b[i-num+1]++;
b[i]--;b[i+1]--;
}
}
}
for(int i=1;i<=n;i++){
b[i]+=b[i-1];
if(b[i]^a[i]) return puts("No"),void();
}
for(int i=1;i<=n;i++) putchar(ans[i]?'R':'L');
puts("");
}
int main(){
int T=1;read(T);
while(T--) solve();
return 0;
}
}
int main(){
// freopen("1.in","r",stdin);
// freopen("1.out","w",stdout);
// IOS;
H_H::main();
return 0;
}