洛谷P4581 [BJOI2014]想法(玄学算法,拓扑排序)

洛谷题目传送门

萝卜大毒瘤

题意可以简化成这样:给一个DAG,求每个点能够从多少个入度为0的点到达(记为k)。

一个随机做法:给每个入度为0的点随机一个权值,在DAG上求出每个点能够返回到的入度为0的点的最小权值,那么这个权值的期望是随机值域k+1。多选几套随机权值(蒟蒻选了一百次),跑出来的平均值即可输出。

实在是太玄学了。

#include<bits/stdc++.h>
#define LL unsigned long long
#define RG register
#define R RG int
#define G if(++ip==ie)if(fread(ip=buf,1,SZ,stdin))
#define F(S) if(freopen(S".in","r",stdin));if(freopen(S".out","w",stdout))
using namespace std;
const int SZ=1<<18,N=1e6+1,S=50,T=2;
char buf[SZ],*ie=buf+SZ,*ip=ie-1;
inline int in(){
    G;while(*ip<'-')G;
    R x=*ip&15;G;
    while(*ip>'-'){x*=10;x+=*ip&15;G;}
    return x;
}
inline int Min(R x,R y){
    return x<y?x:y;
}
int f[N][S],c[N][2];
double ans[N];
int main(){
    srand(20020307);
    R n=in(),m=in();
    for(R i=m+1;i<=n;++i)
        c[i][0]=in(),c[i][1]=in();
    for(R t=T;t;--t){
        for(R i=1;i<=m;++i)
            for(R j=0;j<S;++j)
                f[i][j]=rand();
        for(R i=m+1;i<=n;++i)
            for(R j=0;j<S;++j)
                ans[i]+=f[i][j]=Min(f[c[i][0]][j],f[c[i][1]][j]);
    }
    for(R i=m+1;i<=n;++i)
        printf("%d\n",(int)(RAND_MAX/ans[i]*S*T-0.5));
    return 0;
}
posted @   Flash_Hu  阅读(455)  评论(7编辑  收藏  举报
编辑推荐:
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· 没有源码,如何修改代码逻辑?
· 一个奇形怪状的面试题:Bean中的CHM要不要加volatile?
· [.NET]调用本地 Deepseek 模型
· 一个费力不讨好的项目,让我损失了近一半的绩效!
阅读排行:
· 在鹅厂做java开发是什么体验
· 百万级群聊的设计实践
· WPF到Web的无缝过渡:英雄联盟客户端的OpenSilver迁移实战
· 永远不要相信用户的输入:从 SQL 注入攻防看输入验证的重要性
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
点击右上角即可分享
微信分享提示
哥伦布
-1°
10:09发布
哥伦布
10:09发布
-1°
西南风
2级
空气质量
相对湿度
87%
今天
小雨
-1°/13°
周六
多云
-3°/10°
周日
-4°/2°