Run ID 作者 问题 语言 测评结果 分数 时间 内存 代码长度 提交时间
37541 baka24 【BJ】T2 C++ 解答错误 45 321 MS 2628 KB 5104 2025-04-06 14:11:02

Tests(22/24):


#include<bits/stdc++.h> using namespace std; #define int long long #define lson (t[pos].ls) #define rson (t[pos].rs) #define pii pair<int,int> #define fr first #define sc second #define mk make_pair #define pb push_back #define x1 lylakioi #define y1 gczakioi #define lb(x) (x&(-x)) #define popcnt __builtin_popcount #define inx(u) int I=h[(u)],v=edge[I].v;I;I=edge[I].nx,v=edge[I].v #pragma gcc optimize(2) int read(){int x=0,f=1;char c=getchar();while(c>'9'||c<'0'){if(c=='-')f=-1;c=getchar();}x=c-'0';c=getchar();while(c<='9'&&c>='0'){x*=10;x+=c-'0';c=getchar();}return x*f;} string reads(){string res=".";char c=getchar();while(c<'a'||c>'z')c=getchar();while(c>='a'&&c<='z')res=res+c,c=getchar();return res;} void write(int x){if(x<0){putchar('-');x=-x;}if(x>9) write(x/10);putchar(x%10+'0');} const int MAXN=500010,MAXM=200010,N=30,M=550000,Mod=998244353,inf=1e18,B=300; struct Edge{int v,nx,w;}edge[MAXN<<1];int h[MAXN],CNT;void add_side(int u,int v){edge[++CNT]={v,h[u]};h[u]=CNT;edge[++CNT]={u,h[v]};h[v]=CNT;} int n,m,k,a[MAXN],f[MAXN],g[MAXN]; int f0,f1,f2,g0,g1,g2; bool lf,rf; int now; void Left(){ // cout<<"L:"<<endl; while(!lf){ if(now!=1){ if(g1)g1--,f1++; else if(g2)g2--,f2++; else return; } // cout<<f0<<" "<<f1<<" "<<f2<<" "<<g0<<" "<<g1<<" "<<g2<<endl; if(now&1)f2--,rf|=f2<=0; else f0--,lf|=f0<=0; now++; } // cout<<lf<<" "<<rf<<endl; } void Right(){ // cout<<"R:"<<endl; while(!rf){ if(now!=1){ if(g1)g1--,f1++; else if(g0)g0--,f0++; else return; } // cout<<f0<<" "<<f1<<" "<<f2<<" "<<g0<<" "<<g1<<" "<<g2<<endl; if(now&1)f2--,rf|=f2<=0; else f0--,lf|=f0<=0; now++; } // cout<<lf<<" "<<rf<<endl; } int left(){ // cout<<"left:"<<endl; // if(lf)return 0; // int tur=f0*2,res=0; // if(tur>=0)f2--; // if(g1+g2<tur)return 0; // int tmp=min(tur,g1); // res+=tmp; // f1+=tmp,g1-=tmp; // if(tmp)f2-=(tmp-1)/2+1,f0-=tmp>>1; // tur-=tmp; // // cout<<f0<<" "<<f1<<" "<<f2<<" "<<g0<<" "<<g1<<" "<<g2<<endl; // if(f2<=0)rf=1; // tmp=tur; // res+=tmp; // f2+=tmp,g2-=tmp; // if(tmp)f2-=tmp>>1,f0-=(tmp-1)/2+1; // cout<<f0<<" "<<f1<<" "<<f2<<" "<<g0<<" "<<g1<<" "<<g2<<endl; // lf=1; // return res; } int right(){ // cout<<"right:"<<endl; // if(rf)return 0; // int tur=f2*2-1-bg,res=0; // if(tur>=0)f2--,bg=0; // cout<<g1<<" "<<g0<<" "<<f2<<endl; // if(g1+g0<tur)return 0; // int tmp=min(tur,g1); // res+=tmp; // f1+=tmp,g1-=tmp; // f2-=(tmp-1)/2+1; // f0-=tmp>>1; // tur-=tmp; // // cout<<f0<<" "<<f1<<" "<<f2<<" "<<g0<<" "<<g1<<" "<<g2<<endl; // if(f0<=0)lf=1; // tmp=tur; // res+=tmp; // f0+=tmp,g0-=tmp; // f0-=tmp>>1; // f2-=(tmp-1)/2+1; // cout<<f0<<" "<<f1<<" "<<f2<<" "<<g0<<" "<<g1<<" "<<g2<<endl; // rf=1; // return res; } int ans; int ls[MAXN],nx[MAXN]; int sol(int l,int r){ // cout<<l<<" "<<r<<":::::"<<" "<<ls[l-1]<<" "<<nx[r+1]<<endl; f0=ls[l-1]?f[ls[l-1]]:0, f1=f[nx[r+1]-1]-f[ls[l-1]], f2=f[n]-f[nx[r+1]-1], g0=ls[l-1]?g[ls[l-1]]:0, g1=g[nx[r+1]-1]-g[ls[l-1]], g2=g[n]-g[nx[r+1]-1]; lf=rf=0,now=1; // cout<<"LR"<<endl; // cout<<f0<<" "<<f1<<" "<<f2<<" "<<g0<<" "<<g1<<" "<<g2<<endl; // int L=left(),R=right(); // cout<<lf<<" "<<rf<<" "<<L<<" "<<R<<endl; Left(),Right(); if(lf&&rf)return now; f0=ls[l-1]?f[ls[l-1]]:0, f1=f[nx[r+1]-1]-f[ls[l-1]], f2=f[n]-f[nx[r+1]-1], g0=ls[l-1]?g[ls[l-1]]:0, g1=g[nx[r+1]-1]-g[ls[l-1]], g2=g[n]-g[nx[r+1]-1]; lf=rf=0,now=1; // cout<<"RL"<<endl; // cout<<f0<<" "<<f1<<" "<<f2<<" "<<g0<<" "<<g1<<" "<<g2<<endl; // R=right(),L=left(); // cout<<lf<<" "<<rf<<" "<<L<<" "<<R<<endl; Right(),Left(); if(lf&&rf)return now; // cout<<endl<<endl<<endl; return inf; } void slv(){ n=read(),m=read(); for(int i=1;i<=n;i++){ int x=read(); a[x]=i,f[x]++; } for(int i=1;i<=m;i++)g[read()]++; n+=m; nx[n+1]=n; for(int i=1;i<=n;i++)if(a[i])ls[i]=i;else ls[i]=ls[i-1]; for(int i=n;i>=1;i--)if(a[i])nx[i]=i;else nx[i]=nx[i+1]; // for(int i=1;i<=n;i++)cout<<a[i]<<" ";cout<<endl; // for(int i=1;i<=n;i++)cout<<f[i]<<" ";cout<<endl; // for(int i=1;i<=n;i++)cout<<g[i]<<" ";cout<<endl<<endl<<endl; for(int i=1;i<=n;i++)f[i]+=f[i-1],g[i]+=g[i-1]; ans=inf; for(int i=1;i<=n;i++)if(a[i]){ int r=i+1,lst=a[i]; while(r<=n&&(!a[r]||a[r]>lst))lst=a[r]?a[r]:lst,r++; ans=min(ans,sol(i,r-1)); i=r-1; } printf("%lld",ans==inf?-1:ans-1); } signed main(){ // freopen("1.in","r",stdin);freopen("1.out","w",stdout); // int _=read();while(_--) slv(); // cerr<<clock()*1.0/CLOCKS_PER_SEC<<"s"<<endl; return 0; }


测评信息: