結果
問題 |
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; }