WC2018游记

2.3 Day0
来到了长沙。

2.4~2.7
Day1~Day4
各种讲课,各种掉线。我们还是说饭吧,不是说好了应该很辣?为什么我的唯一感觉是很甜???

2.8
Day5
考试日
第一题看上去就暴力分十足,先写了n^2的28分,然后16分的直接求树上直径,然后当时sb的满脑子都是点分治于是写了点分治求树上最长链qaq。还对拍了一下美滋滋。以为拿到44分过去了将近一个半小时赶紧去看T2。
第二题,n好小,无向图欧拉回路,怎么判定来着,满脑子都是要不跑个网络流验证下吧,脑残至极。还好慢慢的想起来联通且度均为0为存在欧拉回路。然后就敲暴力枚举试试大样例嘛!咦,不对诶???开始了怀疑人生的调试qaq调啊调,调到外婆家,旁边大哥开始吃东西,吃得贼香emmm【一脸黑】
时间过去了三个半小时,依旧调不出来的我【再见】,连一开始想好要写状压dp的都忘记了qaq于是转战T3。
第三题,交互题,然而看上去很可搞?好像暴力分又双叒叕很足?心想这次wc分数线怕不是要上天qaq于是乎就假贪心的写了一波,测测样例,跑的很滋磁诶,还想写写随机化,然而还不敢写随机种子gg(别问我为什么不知道自己钦定一个种子就好了),就随便重新表了一下号,假装我随机了【捂脸】。
还有一点时间,跑去接着调T2,怀疑是我误解了欧拉回路的判定方法,于是开始瞎搞,然后在最后一分钟,突然就调过了???突然就和敦敦敦心灵相通了???无比激动,然而把写状压dp的计划彻底忘在了脑后【再见】,估计就算写也写不完了吧x
此时大喇叭响起考试结束。眼见一个黄衣男子wys匆匆跑过,大声呼喊着些什么,大致是些不要结束的话语吧。我还很惊奇,这是咋的了。。

原来,是T2的题目描述有些锅。。。然后广播有些锅。。。嗯,有趣。T1的16分挂掉了,我还一直以为是非要写点分点分写挂了,结果是没*3【再见】,于是乎28+20+70=118Cu滚粗(Ag线120)【再见】

其实T2状压dp还挺简单的?gg。其实暴力分至少有44(+12)+50+70?,暴力打满也够Au了呢,然而太菜无话而说。
大家好像都各种出锅了?哎,希望下次大家都能运气再好一点吧qaq

2.9 Day6
湖南省博物馆。车上人数闹鬼是为何?原因竟是**
下午回来和wrx打通关了森林冰火人,感觉很有成就?【捂脸】

2.10 Day7
返程。

通道

#include 
#include 
#include 
using namespace std;
#define N 100010
#define ll long long
#define inf 0x3f3f3f3f
inline ll read(){
    ll x=0,f=1;char ch=getchar();
    while(ch<'0'||ch>'9'){if(ch=='-') f=-1;ch=getchar();}
    while(ch>='0'&&ch<='9') x=x*10+ch-'0',ch=getchar();
    return x*f;
}
int n,Log[N<<1];
struct edge{
    int to,next;ll val;
};
struct Data{
    int h[N],num,fa[N],dep[N],mn[N<<1][19],dfn[N],a[N<<1],dfnum,f[N],sz[N],rt,sumsz;ll dis[N],mx,gmx,ans;bool vis[N];
    edge data[N<<1];
    inline void ini(){
        for(int i=1;iint x=read(),y=read();ll val=read();
            data[++num].to=y;data[num].next=h[x];h[x]=num;data[num].val=val;
            data[++num].to=x;data[num].next=h[y];h[y]=num;data[num].val=val;
        }
    }
    void dfs(int x){
        a[++dfnum]=x;dfn[x]=dfnum;mn[dfnum][0]=x;
        for(int i=h[x];i;i=data[i].next){
            int y=data[i].to;if(y==fa[x]) continue;
            dep[y]=dep[x]+1;fa[y]=x;dis[y]=dis[x]+data[i].val;dfs(y);a[++dfnum]=x;mn[dfnum][0]=x;
        }
    }
    inline void pre(){
        dfs(1);
        for(int i=1;i<=Log[2*n-1];++i)
            for(int j=1;j<=2*n-1;++j){
                if(j+(1<1)>2*n-1) break;
                if(dep[mn[j][i-1]]1<1)][i-1]]) mn[j][i]=mn[j][i-1];
                else mn[j][i]=mn[j+(1<1)][i-1];
            }
    }inline int lca(int x,int y){
        x=dfn[x],y=dfn[y];if(x>y) swap(x,y);
        int t=Log[y-x+1];
        if(dep[mn[x][t]]1<1][t]]) return mn[x][t];
        else return mn[y-(1<1][t];
    }inline ll caldis(int x,int y){
        int t=lca(x,y);return dis[x]+dis[y]-2*dis[t];
    }
    void dfs1(int x){
        sz[x]=1;
        for(int i=h[x];i;i=data[i].next){
            int y=data[i].to;if(y==fa[x]||vis[y]) continue;
            fa[y]=x;dis[y]=dis[x]+data[i].val;dfs1(y);sz[x]+=sz[y];
        }
    }void dfs2(int x){
        f[x]=0;
        for(int i=h[x];i;i=data[i].next){
            int y=data[i].to;if(y==fa[x]||vis[y]) continue;
            dfs2(y);f[x]=max(f[x],sz[y]);
        }f[x]=max(f[x],sumsz-sz[x]);if(f[x]void dfs3(int x){
        gmx=max(gmx,dis[x]);
        for(int i=h[x];i;i=data[i].next){
            int y=data[i].to;if(y==fa[x]||vis[y]) continue;dfs3(y);
        }
    }
    void calc(int x){
        mx=0;gmx=0;
        for(int i=h[x];i;i=data[i].next){
            int y=data[i].to;if(vis[y]) continue;
            dfs3(y);ans=max(ans,mx+gmx);mx=max(mx,gmx);gmx=0;
        }
    }
    inline void solve(int x){
        vis[x]=1;fa[x]=0;dis[x]=0;dfs1(x);calc(x);
        for(int i=h[x];i;i=data[i].next){
            int y=data[i].to;if(vis[y]) continue;
            rt=0;sumsz=sz[y];dfs2(y);solve(rt);
        }
    }
    inline void solve1(){
        ans=0;f[0]=inf;rt=0;sumsz=n;dfs1(1);dfs2(1);solve(rt);printf("%lld\n",ans*3);
    }
}A[3];
inline void solve0(){
    ll ans=0;
    for(int i=0;i<3;++i) A[i].pre();
    for(int x=1;x<=n;++x)
        for(int y=x+1;y<=n;++y){
            ll res=0;
            for(int k=0;k<3;++k) res+=A[k].caldis(x,y);
            ans=max(ans,res);
        }printf("%lld\n",ans);
}
int main(){
    freopen("tunnel.in","r",stdin);
    freopen("tunnel.out","w",stdout);
    n=read();Log[0]=-1;
    for(int i=1;i<=2*n;++i) Log[i]=Log[i>>1]+1;
    for(int i=0;i<3;++i) A[i].ini();
    if(n<=3000){solve0();return 0;}
    A[0].solve1();return 0;
}   

州区划分

#include 
#include 
#include 
using namespace std;
#define N 2100010
#define ll long long
#define inf 0x3f3f3f3f
#define mod 998244353
inline int read(){
    ll x=0,f=1;char ch=getchar();
    while(ch<'0'||ch>'9'){if(ch=='-') f=-1;ch=getchar();}
    while(ch>='0'&&ch<='9') x=x*10+ch-'0',ch=getchar();
    return x*f;
}
int n,m,p,h[25],num=0,bin[25],du[25],sum[N],ans=0,summ=0,w[25],inv[3000],fa[25],f[N];
bool ok[N],good[25],in[N];
struct edge{
    int x,y;
}e[5000];
inline int find(int x){return x==fa[x]?x:fa[x]=find(fa[x]);}
inline bool check(int S){
    int tot=0;
    for(int i=0;i0;if((S>>i)&1) good[i]=1,sum[S]+=w[i],++tot;else good[i]=0;fa[i]=i;}
    for(int i=1;i<=m;++i){
        if(!good[e[i].x]||!good[e[i].y]) continue;
        du[e[i].x]++;du[e[i].y]++;int xx=find(e[i].x),yy=find(e[i].y);if(xx!=yy) fa[xx]=yy,--tot;
    }if(tot!=1) return 1;
    for(int i=0;iif(du[i]&1) return 1;return 0;
}
int main(){
//  freopen("walk.in","r",stdin);
//  freopen("walk.out","w",stdout);
    n=read();m=read();p=read();bin[0]=1;inv[1]=1;
    for(int i=1;i<=n;++i) bin[i]=bin[i-1]<<1;
    for(int i=1;i<=m;++i) e[i].x=read()-1,e[i].y=read()-1;
    for(int i=0;ifor(int i=2;i<=2200;++i) inv[i]=(ll)(mod-mod/i)*inv[mod%i]%mod;
    for(int i=1;i<=bin[n]-1;++i) ok[i]=check(i);f[0]=1;
    for(int S=1;S<=bin[n]-1;++S){
        for(int s1=S;s1;s1=(s1-1)&S){
            if(!ok[s1]) continue;int res=(ll)sum[s1]*inv[sum[S]]%mod;
            if(p==0) f[S]+=f[S^s1];
            else if(p==1) f[S]+=(ll)f[S^s1]*res%mod;
            else f[S]+=(ll)f[S^s1]*res%mod*res%mod;f[S]%=mod;
        }
    }printf("%d\n",f[bin[n]-1]);
    return 0;
}

即时战略

#include "rts.h"
#include 
#include 
#define N 300010
bool f[N];
int ed[N],now,a[N];
inline void solve(int x){
    while(x!=a[now]){
        int y=explore(x,a[now]);f[y]=1;x=y;
    }
}
void play(int n, int T, int dataType) {
    a[1]=1;now=1;
    for(int i=2;i<=n;++i){
        a[i]=a[i-1]+7;if(a[i]>n) a[i]=++now;
    }now=n;memset(f,0,sizeof(f));memset(ed,0,sizeof(ed));f[1]=1;
    while(T--){
        while(f[a[now]]) --now;
        if(!now) return;
        int res=explore(1,a[now]);
        if(ed[res]) solve(ed[res]);else f[res]=1,solve(res);ed[res]=a[now];
    }
}

你可能感兴趣的:(比赛,游记)