GDKOI2021 PJ D2 总结

我错惹,现在是总结了QWQ

与 T4 数据搏斗了一晚上终于找到时间写了。

T1 math

我炸了……

我连小学水平都没有。

代码已经钉上耻辱柱了所以没有。

T2 tree

很水,然后我的代码被反复吊起来锤,然后我就只能告诉他们这个东西能跑前提是输入数据必须满足题意。

#include<cstdio>
using namespace std;
int t,n,d[100010][3];
char BuF[1<<26],*InF=BuF;
template<typename T>void read(T &x){
    for(;*InF<33;++InF);
    for(x=0;47<*InF&&*InF<58;x=(x<<3)+(x<<1)+(*InF++^48));
}
int main(){
    freopen("tree.in","r",stdin);
    freopen("tree.out","w",stdout);
    fread(BuF,1,1<<26,stdin);
    for(read(t);t;--t){
        bool ans=1,tmp=1;
        read(n);
        for(int i=0;i<n;++i){
            read(d[i][0]);
        }
        d[0][1]=0;d[0][2]=n+1;
        for(int l=0,r=0;l<=r;++l){
            if(d[l][1]<d[r+1][0]&&d[r+1][0]<d[l][0]){
                ++r;
                d[r][1]=d[l][1];
                d[r][2]=d[l][0];
                tmp^=1;
            }
            if(d[l][2]>d[r+1][0]&&d[r+1][0]>d[l][0]){
                ++r;
                d[r][1]=d[l][0];
                d[r][2]=d[l][2];
                tmp^=1;
            }
            ans&=tmp;
        }
        printf(ans?"YES
":"NO
");
    }
    fclose(stdin);
    fclose(stdout);
    return 0;
}

T3 minecraft

题目有意思,但是很离谱。

是个人都知道地狱的距离在奇怪的地形下并没有屁用,只有长期档才会有地狱交通这种东西。

这就跟100的数据没人写倍增一个道理

然后就是倍增,然后炸了。

然后把转移删去两个就过了。

以下代码正解。

#include<cstdio>
#include<iostream>
#define N 600010
#define ll long long
using namespace std;
int n,q,a[N],b[N<<1][3],dp[N],last,st[N],size,i[N],mx[N];
ll pt[N];
bool vis[N]; 
struct patop{
    ll d[4];
    int p;
    patop(){
        d[0]=d[1]=d[2]=d[3]=p=0;
    }
    patop operator+(patop b){
        patop re;
        re.p=b.p;
        re.d[0]=min(d[0]+b.d[0],d[1]+b.d[2]);
        re.d[1]=min(d[1]+b.d[3],d[0]+b.d[1]);
        re.d[2]=min(d[2]+b.d[0],d[3]+b.d[2]);
        re.d[3]=min(d[3]+b.d[3],d[2]+b.d[1]);
        return(p?re:b);
    }
}s[N][21];
char BuF[1<<26],*InF=BuF;
template<typename T>void read(T &x){
    for(;*InF<33;++InF);
    for(x=0;47<*InF&&*InF<58;x=(x<<3)+(x<<1)+(*InF++^48));
}
void add(int x,int y,int z){
    b[++last][0]=a[x];
    b[a[x]=last][1]=y;
    b[last][2]=z;
}
void dfs(){
    for(st[size=1]=1;size;){
        register int m=st[size],&im=i[st[size]];
        vis[m]=1;
        if(!im){
            dp[m]=dp[s[m][0].p]+1;
            for(mx[x]=1;s[m][mx[x]-1].p;++i){
                s[m][mx[x]]=s[m][mx[x]-1]+s[s[m][mx[x]-1].p][mx[x]-1];
            }
            im=a[m];
        }else{
            im=b[im][0];
        }
        for(;im&&b[im][1]==s[m][0].p;im=b[im][0]);
        if(im){
            s[b[im][1]][0].p=m;
            s[b[im][1]][0].d[0]=b[im][2]<<3;
            s[b[im][1]][0].d[1]=min(pt[b[im][1]]+b[im][2],(b[im][2]<<3)+pt[m]);
            s[b[im][1]][0].d[2]=min(pt[b[im][1]]+(b[im][2]<<3),b[im][2]+pt[m]);
            s[b[im][1]][0].d[3]=b[im][2];
            st[++size]=b[im][1];
        }else{
            size--;
        }
    }
}
ll lca(int x,int y){
    patop a,b;
    if(dp[x]<dp[y]){
        swap(x,y);
    }
    for(register int i=mx[x];dp[x]>dp[y];--i){
        if(dp[s[x][i].p]>=dp[y]){
            a=a+s[x][i];
            x=s[x][i].p;
        }
    }
    for(register int i=mx[x];i>=0;--i){
        if(s[x][i].p!=s[y][i].p){
            a=a+s[x][i];
            x=s[x][i].p;
            b=b+s[y][i];
            y=s[y][i].p;
        }
    }
    if(x!=y){
        a=a+s[x][0];
        b=b+s[y][0];
    }
    return(min(a.d[0]+b.d[0],min(a.d[1]+(b.d[1]?b.d[1]:pt[a.p]),min(a.d[0]+b.d[1],a.d[1]+b.d[0])+pt[a.p])));
}
int main(){
    freopen("minecraft5.in","r",stdin);
    freopen("minecraft.out","w",stdout);
    fread(BuF,1,1<<26,stdin);
    read(n);
    for(register int i=1;i<=n;++i){
        read(pt[i]);
    }
    for(register int i=1,x,y,z;i<n;++i){
        read(x);read(y);read(z);
        add(x,y,z);
        add(y,x,z);
    }
    dfs();
    for(register int i=1;i<=n;i++){
        if(!vis[i]){
            printf("%d
",i);
        }
    }
    read(q);
    for(register int i=1,x,y;i<=q;++i){
        read(x);read(y);
        printf("%lld
",lca(x,y));
    }
    fclose(stdin);
    fclose(stdout);
    return 0;
}

T4 matrix

讲题时点名的那个该不会是我……

反正我是写的网络流。

然后被拉去造民间(?)数据,然后锅了,然后又锅了……

然后一晚上就过了。

这辈子再不想造数据

#include<cstring>
#include<iostream>
#define N 1010
#define TT 2020
#define INF 0x7f7f7f7f
using namespace std;
int n,a[N][N],b[N][N],r[TT+1],cur[TT+1],w[TT+1],d[TT+1];
struct CFS{
    int h[TT+1],b[N*N<<3][3],last;
    CFS(){
        last=-1;
    }
    void add(int x,int y,int z){
        b[++last][0]=h[x];
        b[h[x]=last][1]=y;
        b[last][2]=z;
    }
}h;
bool p[N][N];
char BuF[1<<26],*InF=BuF;
template<typename T>void read(T &x){
    for(;*InF<33;++InF);
    for(x=0;47<*InF&&*InF<58;x=(x<<3)+(x<<1)+(*InF++^48));
}
bool bfs(){
    memset(w,127,sizeof(w));
    w[0]=0;
    for(int l=1,r=1;l<=r;++l){
        cur[d[l]]=h.h[d[l]];
        for(int j=h.h[d[l]];j>=0;j=h.b[j][0]){
            if(h.b[j][2]&&w[h.b[j][1]]==INF){
                w[h.b[j][1]]=w[d[l]]+1;
                d[++r]=h.b[j][1];
            }
        }
    }
    return(w[TT]<INF);
}
int dfs(int x,int flow){
    if(x==TT){
        return(flow);
    }
    int used=0,aflow;
    for(;cur[x]>=0;cur[x]=h.b[cur[x]][0]){
        if(h.b[cur[x]][2]&&w[h.b[cur[x]][1]]==w[x]+1){
            if((aflow=dfs(h.b[cur[x]][1],min(flow-used,h.b[cur[x]][2])))){
                h.b[cur[x]][2]-=aflow;
                h.b[cur[x]^1][2]+=aflow;
                if((used+=aflow)==flow){
                    return(used);
                }
            }else{
                w[h.b[cur[x]][1]]=INF;
            }
        }
    }
    return(used);
}
void dinic(){
    while(bfs()){
        dfs(0,INF);
    }
}
int main(){
    fread(BuF,1,1<<26,stdin);
    memset(h.h,-1,sizeof(h.h));
    read(n);
    for(int i=1;i<=n;++i){
        for(int j=1;j<=n;++j){
            read(a[i][j]);
            b[i][j]=a[i][j]>>1;
            if(a[i][j]&1){
                h.add(i,j+N,1);
                h.add(j+N,i,0);
                ++r[i];
                ++r[j+N];
            }
        }
    }
    for(int i=1;i<=n;++i){
        h.add(0,i,r[i]>>1);
        h.add(i,0,0);
        h.add(i+N,TT,r[i+N]>>1);
        h.add(TT,i+N,0);
    }
    dinic();
    for(int i=1;i<=n;++i){
        for(int j=h.h[i];j>=0;j=h.b[j][0]){
            if(h.b[j][1]>N&&h.b[j][1]!=TT){
                b[i][h.b[j][1]-N]+=h.b[j^1][2];
            }
        }
    }
    for(int i=1;i<=n;++i){
        for(int j=1;j<=n;++j){
            printf("%d ",b[i][j]);
        }
        putchar('
');
    }
    for(int i=1;i<=n;++i){
        for(int j=1;j<=n;++j){
            printf("%d ",a[i][j]-b[i][j]);
        }
        putchar('
');
    }
    fclose(stdin);
    fclose(stdout);
    return 0;
}
原文地址:https://www.cnblogs.com/groundwater/p/14337347.html