10.29-10.30Test

独自空忆成欢 提交于 2019-12-03 09:27:58

10.29-10.30Test

题目 描述 做法
\(BSOJ5161\) 从小到大放入\(n\)个数,每次他可以覆盖没被覆盖且小于等于自己的数,求每个数覆盖个数 无脑模拟
\(BSOJ5162\) 给出一个有向图,每一轮可以覆盖任意两点不可到达的点集,求最少几轮覆盖完 缩点后\(DAG\)\(DP\)
\(BSOJ5163\) 动态加边,多次询问\(A\rightarrow B\)的最大边最短路径 \(LCA\)+暴力\(or~LCT\)维护\(Mst\)
\(BSOJ5169\) \([L,R]\)中质数和两质数乘积的个数 魔改线性筛
\(BSOJ5170\) 每个点可以得到钥匙,每条边有钥匙限制,求\(1\rightarrow n\)最短路 状压分层+最短路(\(BFS\))
\(BSOJ5171\) 过长 考虑算出子树内\(a\)\(d1,d2,d3,cnt\),算出字数外\(b\)\(u1,u2\),再分类讨论

\(\text{Day1}\)

\(T1\)

无脑模拟

\(T2\)

先缩点,那么块内的点不能同时选

对于\(DAG\),我们考虑答案就是把块当做\(\text{size}\)长的链的最长路

\(\displaystyle{f_x=\max\{f_y\}+\text{size}_x}\)

\(T3\)

径为所有路径中权值最小的路径权。
每次小A先选出两个点m1,m2,然后小B选出两个点b1,b2,计算出它们的最短路径m,b,然后小B会拿出两堆灵魂宝石,一堆有m个,另一堆有b个。然后小A先从一堆中选出若干个灵魂宝石拿走,接下来小B重复同样的操作,如此反复,直到取走最后一颗灵魂宝石,然后取走最后一颗宝石的人获胜。
小B认为这样游戏太简单,于是他会不定期向这张图上加上一些边,以增大游戏难度。
小A具有预知未来的能力,她看到了自己和小B在未来游戏中的选择,以及小B增加的边。现在对于每次游戏,小A想知道自己是否存在必胜的方法。但是预知未来已经消耗了她太多精力,出于疲惫她只好找到了你。

发现这道题\(Add\)操作很少,考虑每次暴力

我们先\(Kruskal\)建出\(Mst\)

每次加入\(A\rightarrow B:V\)这条边,

\(V\ge\)原来树上路径\(A\text{~}B\)上最大值,则不管

\(V<\)原来树上路径\(A\text{~}B\)上最大值,则删去那个最大值,加入这条边

每次重构\(ST\)表,查询就是树上路径\(A\text{~}B\)上最大值比较一下即可

\(Tip:\)\(ST\)表只需从\(A\)\(B\)中深度较小的向下\(dfs\)重构,因为上面的形态不会改变

inline void Findmax(re int x,re int y,re int fa,re int&pos,re int&flag){
    re int i;re ll maxx=-INF;flag=0;
    while(x!=fa){
        for(i=h[x];i;i=e[i].next)if(e[i].to==*dp[x]){if(del[i])continue;if(maxx<e[i].v){maxx=e[i].v;flag=1;pos=i;}}
        x=*dp[x];
    }
    while(y!=fa){
        for(i=h[y];i;i=e[i].next)if(e[i].to==*dp[y]){if(del[i])continue;if(maxx<e[i].v){maxx=e[i].v;flag=2;pos=i;}}
        y=*dp[y];
    }
}

(flag&1)?dfs_ST(y,*dp[y],dep[y]):dfs_ST(x,*dp[x],dep[x]);

\(\color{blue}{\text{Code}}\)

\(\text{Day2}\)

\(T1\)

动一下线性筛就可以了

inline void Prime(void){
    re int i,j;
    for(i=2;i<=maxx;++i){
        if(!vis[i])pri[++*pri]=i;
        for(j=1;j<=*pri;++j){
            if(i*pri[j]>maxx)break;
            vis[i*pri[j]]=(!vis[i])?2:1;
            if(!(i%pri[j]))break; 
        }
    }
    for(i=2;i<=maxx;++i)sum[i]=sum[i-1]+(!(vis[i]&1));
}

\(T2\)

状压钥匙的状态,用状态分层,跑最短路即可

\(T3\)(JZOJ5460)

考虑记录\(6\)个值

\(d1_x/d2_x/d3_x:x\)子树内\(a\)的最大/严格次大/严格第三大

\(man_x\)表示\(x\)子树内最大值唯一否

\(u1_x/u2_x:x\)子树外\(b\)的最大/严格次大

\(ans=\begin{cases}d2_x&u1_x=0\\d1_x&man_x=1\\d1_x&d2_x+u1_x>d1_x\\d2_x+u1_x&d2_x+u1_x<d1_x\\\max\{d2_x+u2_x,d3_x+u1_x\}&d2_x+u1_x=d1_x\end{cases}\)

求这六个量的过程(改\(skr\)人)

inline void dfs(re int x,re int prt){//求d1,d2,d3,man 
    re int i,y;fa[x]=prt;
    d1[x]=a[x];d2[x]=-INF;d3[x]=-INF;dl1[x]=b[x];dl2[x]=-INF;
    cntd[x]=1;
    for(i=h[x];i;i=e[i].next){
        y=e[i].to;if(prt==y)continue;
        dfs(y,x);
        if(d1[x]<d1[y]){
            cntd[x]=cntd[y],d3[x]=d2[x];d2[x]=d1[x];d1[x]=d1[y];//严格次大值/第三大值 
        }
        else if(d1[x]==d1[y])cntd[x]+=cntd[y];
        else if(d2[x]<d1[y]){d3[x]=d2[x];d2[x]=d1[y];}
        else if(d3[x]<d1[y]&&d1[y]!=d2[x])d3[x]=d1[y];
        if(d2[x]<d2[y]&&d2[y]!=d1[x]){d3[x]=d2[x];d2[x]=d2[y];}
        else if(d3[x]<d2[y]&&d2[y]!=d2[x])d3[x]=d2[y];
        if(d3[x]<d3[y]&&d3[y]!=d2[x])d3[x]=d3[y];
        if(dl1[x]<dl2[y]){dl2[x]=dl1[x];dl1[x]=dl2[y];}
        else if(dl2[x]<dl2[y]&&dl2[y]!=dl1[x])dl2[x]=dl2[y];//只求严格次大值
        if(dl1[x]<dl1[y]){dl2[x]=dl1[x];dl1[x]=dl1[y];}
        else if(dl2[x]<dl1[y]&&dl1[y]!=dl1[x])dl2[x]=dl1[y];//只求严格次大值
    }
    if(cntd[x]>1)man[x]=1;
}
inline void Change(re int x){//求u1,u2
    re int i,j,pre=0,y,tim=1;tot=0;d[++tot]=(z){x,u1[x]};d[++tot]=(z){x,u2[x]};
    d[++tot]=(z){x,b[x]};
    for(i=h[x];i;i=e[i].next){
        y=e[i].to;if(fa[x]==y)continue;
        d[++tot]=(z){y,dl1[y]};d[++tot]=(z){y,dl2[y]};
    }
    sort(d+1,d+tot+1);
    for(i=h[x];i;i=e[i].next){
        y=e[i].to;if(fa[x]==y)continue;
        j=1;tim=1;pre=INF;u1[y]=u2[y]=-INF;
        while(tim<=2){
            for(;j<=tot;++j)if(d[j].pos!=y&&d[j].v!=pre)break;
            if(j>tot)break;
            if(tim==1)u1[y]=d[j].v;
            else u2[y]=d[j].v;
            ++tim;pre=d[j].v;
        }
    }
    for(i=h[x];i;i=e[i].next){y=e[i].to;if(fa[x]==y)continue;Change(y);}
}
标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!