模拟火车2019中国线路手机版_com.neon.cube2048

模拟火车2019中国线路手机版_com.neon.cube2048jzoj6009. 【THUWC2019模拟2019.1.18】Counting (dp)

大家好,又见面了,我是你们的朋友全栈君。

Description

羽月最近发现,她发动能力的过程是这样的:
构建一个 V 个点的有向图 G,初始为没有任何边,接下来羽月在脑中构建出一个长度为 E 的边的序列,序列中元素两两不同,然后羽月将这些边依次加入图中,每次加入之后计算当前图的强连通分量个数并记下来,最后得到一个长度为E 的序列,这个序列就是能力的效果。
注意到,可能存在边的序列不同而能力效果相同的情况,所以羽月想请你帮她计算能发动的不同能力个数,答案对 998244353 取模。你需要对于1<=E<=V*(V-1)的所有 E 计算答案。

Data Constraint

对于 10%的数据,1<=V<=5
对于 30%的数据,1<=V<=20
对于 60%的数据,1<=V<=50
对于 100%的数据,1<=V<=100

solution

全场切的题目咱连题目都看不懂对咱来说已经是日常了

题解觉得这题太水于是只有一句话于是咱只好对着一份代码理解了半天

考虑一个策略,我们维护一条链\(1\)\(i\),如果连的下一条边需要不减少强连通分量个数,那么就连上\((i,i+1)\),如果需要减少强连通分量个数,那么就在链上选一个点向前连边

不难发现,每一种强连通分量序列的情况,都可以通过这种策略来表示

考虑\(dp\),设\(dp_{i,j,k}\)表示连了\(i\)条边,上面有\(j\)个点已经在强连通分量里了,对于链维护到了\(1\)\(k\),那么枚举下一条边,考虑它是未增加强连通分量个数或者减少的强连通分量个数,转移即可

还有一种尴尬的情况就是点全都连完了,但我们还需要使强连通分量个数不变,这种时候往前连一条没用的边就行了

顺带注意,我们在连环边和无用边的时候可能会有边爆掉的情况,设链上有\(n\)个点,有\(j\)个在环里(即强连通分量),那么链上的每个点可以向后面的所有点连边,环上的每个点可以向前面的所有点连边,就算全部连满,边数也不能超过\(\frac{n(n+1)+j(j+1)}{2}\)

然后就没有然后了,理论上来说时间复杂度\(O(v^5)\),只要用刷表法,判断一下当前状态是否可行就行了

//minamoto
#include<bits/stdc++.h>
#define R register
#define fp(i,a,b) for(R int i=a,I=b+1;i<I;++i)
#define fd(i,a,b) for(R int i=a,I=b-1;i>I;--i)
inline int max(const R int &x,const R int &y){return x>y?x:y;}
inline int min(const R int &x,const R int &y){return x<y?x:y;}
using namespace std;
char buf[1<<21],*p1=buf,*p2=buf;
inline char getc(){return p1==p2&&(p2=(p1=buf)+fread(buf,1,1<<21,stdin),p1==p2)?EOF:*p1++;}
int read(){
    R int res=1,f=1;R char ch;
    while((ch=getc())>'9'||ch<'0')(ch=='-')&&(f=-1);
    for(res=ch-'0';(ch=getc())>='0'&&ch<='9';res=res*10+ch-'0');
    return res*f;
}
char sr[1<<21],z[20];int K=-1,Z=0;
inline void Ot(){fwrite(sr,1,K+1,stdout),K=-1;}
void print(R int x){
    if(K>1<<20)Ot();if(x<0)x=-x,sr[++K]='-';
    while(z[++Z]=x%10+48,x/=10);
    while(sr[++K]=z[Z],--Z);sr[++K]=' ';
}
const int N=105,P=998244353;
inline int add(R int x,R int y){return x+y>=P?x+y-P:x+y;}
inline int dec(R int x,R int y){return x-y<0?x-y+P:x-y;}
inline int mul(R int x,R int y){return 1ll*x*y-1ll*x*y/P*P;}
int ksm(R int x,R int y){
    R int res=1;
    for(;y;y>>=1,x=mul(x,x))if(y&1)res=mul(res,x);
    return res;
}
int dp[N*N][N][N];
int n,res;
int main(){
//  freopen("testdata.in","r",stdin);
    freopen("counting.in","r",stdin);
    freopen("counting.out","w",stdout);
    scanf("%d",&n);
    dp[0][1][1]=1;
    fp(i,0,n*(n-1)-1)fp(j,1,min(n,i+1))fp(k,j,min(n,i+1))
    if(dp[i][j][k]){
        if(i<=k+j-2&&k<n)dp[i+1][j][k+1]=add(dp[i+1][j][k+1],dp[i][j][k]);
        else if(k*(k-1)+j*(j-1)>=(i+1<<1))dp[i+1][j][k]=add(dp[i+1][j][k],dp[i][j][k]);
        fp(l,1,k-j)
        if(k*(k-1)+(j+l)*(j+l-1)>=(i+1<<1))dp[i+1][j+l][k]=add(dp[i+1][j+l][k],dp[i][j][k]);
    }
    fp(i,1,n*(n-1)){
        res=0;
        fp(j,1,min(n,i+1))fp(k,j,min(n,i+1))res=add(res,dp[i][j][k]);
        print(res);
    }
    return Ot(),0;
}

转载于:https://www.cnblogs.com/bztMinamoto/p/10292866.html

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/107045.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 用JavaScript对GridView进行上移下移,保存排序

    用JavaScript对GridView进行上移下移,保存排序

    2021年7月27日
    54
  • 文本挖掘实例[通俗易懂]

    文本挖掘实例[通俗易懂]文本挖掘junjun2016年2月4日文本分析的应用越来越广泛,今天就讲讲关于评论数据的那点事。评论数据的获取:一般通过网络爬虫的方式抓取各大网站的评论数据,本次分析数据就来源于携程网某酒店的评论,成功爬取该酒店的评论数据,于是我开始使用这些数据做相关的分析。(注意:数据分析、挖掘时,这部分工作可以有专门的人员来完成)1、加载数据和包#1)本文使

    2022年6月26日
    29
  • android开发之android:process属性_application中onCreate执行多次「建议收藏」

    应用做的匆忙,很多地方只顾实现功能,没有兼顾好性能,所以停下来重构代码优化性能,结果在打log看启动时间的时候,发现Application的onCreate执行了多次,这样导致重复初始化资源,初始化了3次导致接近1s时间。发现这个是由独立进程引起的。即:process这个属性。android:process        服务所在进程的名字。通常,一个应用的所有组件都运行在系统为这个应用所创建的默

    2022年3月11日
    42
  • 最全的 Charles 抓包工具详解「建议收藏」

    最全的 Charles 抓包工具详解「建议收藏」本文介绍了详细介绍了Charles的HTTP/HTTPS抓包功能,其中包括模拟慢网速、断电功能、Compose功能、重写功能、映射功能、Repeat功能、以及Android7.0抓包问题

    2022年6月14日
    181
  • 面试中常见的计算机网络的问题[通俗易懂]

    面试中常见的计算机网络的问题

    2022年2月12日
    51
  • 环境变量和shell变量

    环境变量和shell变量变量分类变量分为环境变量和shell变量环境变量相当于全局变量,适用于当前SHELL(父进程)和由父进程调用的子进程,如打开编辑器vi、脚本、应用或是再打开一个子shell。shell变量就是当前shell使用的变量了,它只是“本地“有效,相当于本地变量,不适用于其他子进程,只在当前shell生命周期内有效永久变量不管是自定义的变量还是通过export导为环境变量的自定义变量都只是在shell生命周期内有效,这样的变量就是临时变量,如果我想设置一个变量使其永久生效怎么办呢?可以修改两个配置文

    2022年8月9日
    1

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号