結果
| 問題 |
No.1405 ジグザグロボット
|
| コンテスト | |
| ユーザー |
|
| 提出日時 | 2025-04-22 21:20:29 |
| 言語 | C++17 (gcc 13.3.0 + boost 1.87.0) |
| 結果 |
AC
|
| 実行時間 | 23 ms / 3,153 ms |
| コード長 | 5,124 bytes |
| コンパイル時間 | 3,487 ms |
| コンパイル使用メモリ | 228,716 KB |
| 実行使用メモリ | 60,892 KB |
| 最終ジャッジ日時 | 2025-04-22 21:20:39 |
| 合計ジャッジ時間 | 9,815 ms |
|
ジャッジサーバーID (参考情報) |
judge5 / judge1 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 3 |
| other | AC * 35 |
ソースコード
#include <bits/stdc++.h>
#define INF 1000000000
#define LINF 1000000000000000000
#define MOD 1000000007
#define mod 998244353
#define F first
#define S second
#define ll long long
#define N 300010
#define M ((1<<20)+10)
using namespace std;
struct SegT0{
int lo[M],hi[M],val[M],pd[M];
void build(int x,int l,int r){
lo[x]=l,hi[x]=r,val[x]=pd[x]=0;
if(l==r) return;
int mid=(l+r)>>1,a=x<<1;
build(a,l,mid);
build(a|1,mid+1,r);
return;
}
void pushdown(int x){
int a=x<<1;
val[a]+=pd[x],pd[a]+=pd[x];
val[a|1]+=pd[x],pd[a|1]+=pd[x];
pd[x]=0;
return;
}
void update(int x,int l,int r,int v){
int tl=lo[x],tr=hi[x];
if(l<=tl&&tr<=r){
val[x]+=v,pd[x]+=v;
return;
}
if(pd[x]!=0) pushdown(x);
int mid=(tl+tr)>>1,a=x<<1;
if(mid>=l) update(a,l,r,v);
if(mid<r) update(a|1,l,r,v);
val[x]=min(val[a],val[a|1]);
return;
}
int find(int x){
if(val[x]>0) return -1;
int tl=lo[x],tr=hi[x];
if(tl==tr) return tl;
if(pd[x]!=0) pushdown(x);
int mid=(tl+tr)>>1,a=x<<1;
int ret=find(a);
return ret==-1?find(a|1):ret;
}
}segt0;
struct SegT1{
int lo[M],hi[M];
ll pd[M];
pair<ll,int> val[M];
void build(int x,int l,int r){
lo[x]=l,hi[x]=r,pd[x]=0;
if(l==r){
val[x]=make_pair(-LINF,l);
return;
}
int mid=(l+r)>>1,a=x<<1;
build(a,l,mid);
build(a|1,mid+1,r);
val[x]=max(val[a],val[a|1]);
return;
}
void pushdown(int x){
int a=x<<1;
val[a].F+=pd[x],pd[a]+=pd[x];
val[a|1].F+=pd[x],pd[a|1]+=pd[x];
pd[x]=0;
return;
}
void update(int x,int l,int r,ll v){
int tl=lo[x],tr=hi[x];
if(l<=tl&&tr<=r){
val[x].F+=v,pd[x]+=v;
return;
}
if(pd[x]!=0) pushdown(x);
int mid=(tl+tr)>>1,a=x<<1;
if(mid>=l) update(a,l,r,v);
if(mid<r) update(a|1,l,r,v);
val[x]=max(val[a],val[a|1]);
return;
}
void modify(int x,int l,ll v){
int tl=lo[x],tr=hi[x];
if(tl==tr){
val[x]=make_pair(v,l);
return;
}
if(pd[x]!=0) pushdown(x);
int mid=(tl+tr)>>1,a=x<<1;
if(mid>=l) modify(a,l,v);
else modify(a|1,l,v);
val[x]=max(val[a],val[a|1]);
return;
}
pair<ll,int> query(int x,int l,int r){
int tl=lo[x],tr=hi[x];
if(l<=tl&&tr<=r) return val[x];
if(pd[x]!=0) pushdown(x);
int mid=(tl+tr)>>1,a=x<<1;
pair<ll,int> ret=make_pair(-LINF,-INF);
if(mid>=l) ret=max(ret,query(a,l,r));
if(mid<r) ret=max(ret,query(a|1,l,r));
return ret;
}
}segt1;
int n,m=0,sx,sy,pre[N],g[N],lo[N],hi[N],delta[N];
bool vis[N];
ll f[N];
pair<int,int> seq[N];
vector<pair<int,int> > upds[N];
string s,pth[N];
pair<ll,int> calc(int v){
segt1.build(1,0,m-1);
f[0]=0,g[0]=0,pre[0]=-1;
for(int i=0;i<m;i++){
segt1.modify(1,i,f[i]);
for(auto [x,y]:upds[i]) segt1.update(1,0,x,y);
auto mx=segt1.query(1,0,i);
pre[i+1]=mx.S,f[i+1]=mx.F-v,g[i+1]=g[mx.S]+1;
}
return make_pair(f[m],g[m]);
}
int main(){
ios::sync_with_stdio(false);
cin.tie(0),cout.tie(0);
cin>>n>>sx>>sy>>s;
s+="S";
for(int i=0,lst=0;i<s.size();i++) if(s[i]=='S'){
seq[m++]=make_pair(lst,i-1);
lst=i+1;
}
if(m<=sy){
cout<<"-1\n";
return 0;
}
segt0.build(1,0,m-1);
for(int i=0;i<m;i++){
int v=0;
for(int j=seq[i].F;j<=seq[i].S;j++){
if(s[j]=='L'){
int x=segt0.find(1);
if(x==-1) x=i+1;
if(x>0){
segt0.update(1,0,x-1,-1);
upds[i].push_back(make_pair(x-1,-1));
}
}
else{
segt0.update(1,0,i,1);
v++;
}
}
if(v) upds[i].push_back(make_pair(i,v));
}
int l=0,r=n+1;
while(l<r){
int mid=(l+r)>>1;
if(calc(mid).S>=sy+1) l=mid+1;
else r=mid;
}
l--;
vector<int> p0,p1,pos;
auto v0=calc(l);
for(int i=m;i;i=pre[i]) p0.push_back(pre[i]);
auto v1=calc(l+1);
for(int i=m;i;i=pre[i]) p1.push_back(pre[i]);
ll tot;
if(v0.S==sy+1){
tot=v0.F+1ll*l*v0.S;
pos=p0;
}
else{
tot=((v1.F+1ll*(l+1)*v1.S)-(v0.F+1ll*l*v0.S))*(ll)(sy+1-v0.S)/(ll)(v1.S-v0.S);
tot+=v0.F+1ll*l*v0.S;
pos=p1;
for(auto i:p1) vis[i]=true;
for(auto i:p0) if(pos.size()<=sy&&(!vis[i])) pos.push_back(i);
}
if(tot<sx){
cout<<"-1\n";
return 0;
}
assert((int)pos.size()==sy+1);
sort(pos.begin(),pos.end());
tot-=sx;
for(int i=0,v=0;i<=sy;i++){
pth[i]="";
for(int j=pos[i];j<(i==sy?m:pos[i+1]);j++) for(int k=seq[j].F;k<=seq[j].S;k++) pth[i]+=s[k];
lo[i]=v,hi[i]=v;
for(auto c:pth[i]){
v=max(lo[i],v+(c=='L'?-1:1));
hi[i]=max(hi[i],v);
}
}
for(int i=sy;i>=0&&tot;i--){
int v0=lo[i];
for(auto c:pth[i]) v0=max(lo[i],v0+(c=='L'?-1:1));
int l=lo[i],r=hi[i];
while(l<r){
int mid=(l+r)>>1,v=lo[i];
for(auto c:pth[i]) v=max(lo[i],min(mid,v+(c=='L'?-1:1)));
if(v0-v<=tot) r=mid;
else l=mid+1;
}
hi[i]=l;
int v=lo[i];
for(auto c:pth[i]) v=max(lo[i],min(hi[i],v+(c=='L'?-1:1)));
tot-=v0-v;
delta[i]=v0-v;
}
vector<pair<int,int> > ans;
for(int i=0,s=0;i<=sy;i++){
lo[i]-=s,hi[i]-=s;
s+=delta[i];
ans.push_back(make_pair(lo[i]-1,i));
ans.push_back(make_pair(hi[i]+1,i));
}
for(int i=0;i<=sy;i++) for(int j=lo[i];j<=hi[i];j++){
if(i==sy||j<lo[i+1]||j>hi[i+1]) ans.push_back(make_pair(j,i+1));
}
sort(ans.begin(),ans.end());
ans.erase(unique(ans.begin(),ans.end()),ans.end());
cout<<ans.size()<<'\n';
for(auto [x,y]:ans) cout<<x<<" "<<y<<'\n';
return 0;
}