NOIP2023 游记

· · 个人记录

0.5h 切了前两题。

T3 花了 2.5h 写了 300+ 行。

来不及想 T4 了,写了 \mathrm{O}(km) + 性质 ABC 一共 72 分。

出来说 T4 比 T3 简单,人麻了。

回来测没挂,100+100+100+72=372

SH 有好几个初中生阿克了。绷。

grg:SH 至少有 5 个 AK。

upd:似乎有 7 个。但是只有一个是初中生,3 个是高三。

upd:官方数据 100+100+100+72=372

附 T3 考场代码:

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
#define rep(i,a,b) for(int i=a;i<=b;i++)
#define per(i,a,b) for(int i=a;i>=b;i--)
#define re(i,a,b) for(int i=a;i<b;i++)
char *p1,*p2,buf[1<<21];
#define getchar() (p1==p2&&(p1=buf,p2=buf+fread(buf,1,1<<21,stdin),p1==p2)?EOF:(*p1++))
template<typename T>
void read(T &r){
    r=0;
    char c=getchar();
    bool f=0;
    while((c<'0'||c>'9')&&c!='-')c=getchar();
    if(c=='-')f=1,c=getchar();
    while(c>='0'&&c<='9')r=r*10+c-48,c=getchar();
    if(f)r=-r;
}
void _FILE(string s){
    freopen((s+".in").c_str(),"r",stdin);
    freopen((s+".out").c_str(),"w",stdout);
}
const ll N=500003;
ll id,n,m,q,x[N],y[N],xo[N],yo[N],mx[N],posx[N],mn[N],posn[N];
bool vst1[N],vst2[N];
ll x2[N],y2[N],cnt1=0,cnt2=0;
ll pre1[N],nxt1[N],pre2[N],nxt2[N];
bool solve(){
    if(x[1]<=y[1]||x[n]<=y[m])return 0;
    cnt1=0,cnt2=0;
    fill(vst1+1,vst1+n+1,0);
    fill(vst2+1,vst2+m+1,0);
    rep(i,1,n){
        mx[i]=mx[i-1],posx[i]=posx[i-1];
        if(x[i]>mx[i])mx[i]=x[i],posx[i]=i;
    }
    mn[0]=1000000007;
    rep(i,1,n){
        mn[i]=mn[i-1],posn[i]=posn[i-1];
        if(x[i]<mn[i])mn[i]=x[i],posn[i]=i;
    }
    ll pxmx=posx[n],pxmn=posn[n];
    vst1[pxmx]=1,vst1[pxmn]=1;
    if(pxmx<pxmn){
        ll o=pxmx;
        bool t=1;
        while(o>1){
            if(t)o=posn[o-1];
            else o=posx[o-1];
            vst1[o]=1;
            t=!t;
        }
    }
    else{
        ll o=pxmn;
        bool t=0;
        while(o>1){
            if(t)o=posn[o-1];
            else o=posx[o-1];
            vst1[o]=1;
            t=!t;
        }
    }
    rep(i,1,m){
        mx[i]=mx[i-1],posx[i]=posx[i-1];
        if(y[i]>mx[i])mx[i]=y[i],posx[i]=i;
    }
    mn[0]=1000000007;
    rep(i,1,m){
        mn[i]=mn[i-1],posn[i]=posn[i-1];
        if(y[i]<mn[i])mn[i]=y[i],posn[i]=i;
    }
    ll pymx=posx[m],pymn=posn[m];
    vst2[pymx]=1,vst2[pymn]=1;
    if(pymx<pymn){
        ll o=pymx;
        bool t=1;
        while(o>1){
            if(t)o=posn[o-1];
            else o=posx[o-1];
            vst2[o]=1;
            t=!t;
        }
    }
    else{
        ll o=pymn;
        bool t=0;
        while(o>1){
            if(t)o=posn[o-1];
            else o=posx[o-1];
            vst2[o]=1;
            t=!t;
        }
    }
    if(x[pxmx]<=y[pymx]||x[pxmn]<=y[pymn])return 0;
    if(x[pxmx]==x[pxmn]||y[pymx]==y[pymn])return 1;
    if((pxmn==1||pxmn==n)&&(pymx==1||pymx==m))return 1;
    mx[n+1]=0,posx[n+1]=0;
    per(i,n,1){
        mx[i]=mx[i+1],posx[i]=posx[i+1];
        if(x[i]>mx[i])mx[i]=x[i],posx[i]=i;
    }
    mn[n+1]=1000000007,posn[n+1]=0;
    per(i,n,1){
        mn[i]=mn[i+1],posn[i]=posn[i+1];
        if(x[i]<mn[i])mn[i]=x[i],posn[i]=i;
    }
    if(pxmx<pxmn){
        ll o=pxmn;
        bool t=1;
        while(o!=n){
            if(t)o=posx[o+1];
            else o=posn[o+1];
            vst1[o]=1;
            t=!t;
        }
    }
    else{
        ll o=pxmx;
        bool t=0;
        while(o!=n){
            if(t)o=posx[o+1];
            else o=posn[o+1];
            vst1[o]=1;
            t=!t;
        }
    }
    mx[m+1]=0,posx[m+1]=0;
    per(i,m,1){
        mx[i]=mx[i+1],posx[i]=posx[i+1];
        if(y[i]>mx[i])mx[i]=y[i],posx[i]=i;
    }
    mn[m+1]=1000000007,posn[m+1]=0;
    per(i,m,1){
        mn[i]=mn[i+1],posn[i]=posn[i+1];
        if(y[i]<mn[i])mn[i]=y[i],posn[i]=i;
    }
    if(pymx<pymn){
        ll o=pymn;
        bool t=1;
        while(o!=m){
            if(t)o=posx[o+1];
            else o=posn[o+1];
            vst2[o]=1;
            t=!t;
        }
    }
    else{
        ll o=pymx;
        bool t=0;
        while(o!=m){
            if(t)o=posx[o+1];
            else o=posn[o+1];
            vst2[o]=1;
            t=!t;
        }
    }
    cnt1=0,cnt2=0;
    rep(i,1,n){
        if(vst1[i])x2[++cnt1]=x[i];
        if(i==pxmx)pxmx=cnt1;
        if(i==pxmn)pxmn=cnt1;
    }
    rep(i,1,m){
        if(vst2[i])y2[++cnt2]=y[i];
        if(i==pymx)pymx=cnt2;
        if(i==pymn)pymn=cnt2;
    }
    x2[0]=0,x2[cnt1+1]=0;
    y2[0]=0,y2[cnt2+1]=0;
    ll tpos=pymn;
    for(int i=pxmn;i>0;i-=2){
        while(tpos>0&&y2[tpos]<x2[i])tpos-=2;
        pre1[i]=tpos+2;
    }
    tpos=pymn;
    for(int i=pxmn;i<=cnt1;i+=2){
        while(tpos<=cnt2&&y2[tpos]<x2[i])tpos+=2;
        nxt1[i]=tpos-2;
    }
    tpos=pxmx;
    for(int i=pymx;i>0;i-=2){
        while(tpos>0&&x2[tpos]>y2[i])tpos-=2;
        pre2[i]=tpos+2;
    }
    tpos=pxmx;
    for(int i=pymx;i<=cnt2;i+=2){
        while(tpos<=cnt1&&x2[tpos]>y2[i])tpos+=2;
        nxt2[i]=tpos-2;
    }
    // cout<<cnt1<<' '<<cnt2<<endl;
    // rep(i,1,cnt1)cout<<x2[i]<<' ';cout<<endl;
    // rep(i,1,cnt2)cout<<y2[i]<<' ';cout<<endl;
    bool res=0;
    if(pre2[pymx]<pxmn&&nxt1[pxmn]>pymx){
        bool flag=1;
        ll o=pymx,mn1=cnt1,mn2=pymx;
        bool t=1;
        while(1){
            ll r=0;
            if(t){
                r=pre2[o];
                if(r<mn1)mn1=r;
                else{
                    flag=0;
                    break;
                }
            }
            else{
                r=pre1[o];
                if(r<mn2)mn2=r;
                else{
                    flag=0;
                    break;
                }
            }
            if(r<=2)break;
            o=r-1;
            t=!t;
        }
        ll mx1=pxmn,mx2=0;
        t=1;
        o=pxmn;
        while(1){
            ll r=0;
            if(t){
                r=nxt1[o];
                if(r>mx2)mx2=r;
                else{
                    flag=0;
                    break;
                }
            }
            else{
                r=nxt2[o];
                if(r>mx1)mx1=r;
                else{
                    flag=0;
                    break;
                }
            }
            if((t==1&&r>=cnt2-1)||(t==0&&r>=cnt1-1))break;
            o=r+1;
            t=!t;
        }
        res=res||flag;
    }
    if(nxt2[pymx]>pxmn&&pre1[pxmn]<pymx){
        bool flag=1;
        ll o=pxmn,mn1=pxmn,mn2=cnt2;
        bool t=0;
        while(1){
            ll r=0;
            if(t){
                r=pre2[o];
                if(r<mn1)mn1=r;
                else{
                    flag=0;
                    break;
                }
            }
            else{
                r=pre1[o];
                if(r<mn2)mn2=r;
                else{
                    flag=0;
                    break;
                }
            }
            if(r<=2)break;
            o=r-1;
            t=!t;
        }
        ll mx1=0,mx2=pymx;
        t=0;
        o=pymx;
        while(1){
            ll r=0;
            if(t){
                r=nxt1[o];
                if(r>mx2)mx2=r;
                else{
                    flag=0;
                    break;
                }
            }
            else{
                r=nxt2[o];
                if(r>mx1)mx1=r;
                else{
                    flag=0;
                    break;
                }
            }
            if((t==1&&r>=cnt2-1)||(t==0&&r>=cnt1-1))break;
            o=r+1;
            t=!t;
        }
        res=res||flag;
    }
    return res;
}
bool Solve(){
    bool res1=solve();
    rep(i,1,max(n,m))swap(x[i],y[i]);
    swap(n,m);
    bool res2=solve();
    rep(i,1,max(n,m))swap(x[i],y[i]);
    swap(n,m);
    return res1||res2;
}
int main(){
    _FILE("expand");
    read(id),read(n),read(m),read(q);
    rep(i,1,n)read(x[i]),x[i]++;
    rep(i,1,m)read(y[i]),y[i]++;
    memcpy(xo+1,x+1,n*sizeof(ll));
    memcpy(yo+1,y+1,m*sizeof(ll));
    putchar(Solve()+'0');
    rep(i,1,q){
        memcpy(x+1,xo+1,n*sizeof(ll));
        memcpy(y+1,yo+1,m*sizeof(ll));
        ll k1,k2;
        read(k1),read(k2);
        rep(j,1,k1){
            ll in1,in2;
            read(in1),read(in2);
            x[in1]=in2+1;
        }
        rep(j,1,k2){
            ll in1,in2;
            read(in1),read(in2);
            y[in1]=in2+1;
        }
        putchar(Solve()+'0');
    }
    return 0;
}