清北学堂模拟赛2 T2 ball
题目大意:
多组数据,每组给定n,m,表示将n个小球放进m个箱子,每个小球均有两个箱子(可能相同)可放,求所有小球均放好的方案mod998244353的总数。
思路:
算是我和题解思路肥肠相近的一道题可是还是惨遭爆零
考虑将箱子视为点,小球视为边,每一个小球的合法去向连一条无向边,则问题转化为使给定无向图的每一个点赋上一个与边的编号相同的值,使得每条边都有且只有一个相邻点的值与之相同。
对于不同连通块,ans直接相乘
对于点数小于边数的连通块(也即是自己思路中“环套环”的部分),无法分配,ans直接为0
对于边数等于点数的连通块,可以发现是一个环(基环树),此时除非环的长度为1(自己连自己),ans=1,否则ans=2(有顺时针和逆时针两种分配方式)
对于边数等于点数-1的连通块,可以发现是一棵树,ans=连通块中的点数
证明:对于仅有一个点的树(其实是个孤独的点),显然ans=1.
如果对上述的有k个节点的树(或者是个孤独的点)增加一个点并连一条边,显然可以给新边赋值为新点的权值,ans=k;
也可以给新边赋值给树上点的权值,此时染色方案被唯一确定,ans=1;
故ans=k+1,也为点数,得证。
直接DFS遍历所有连通块即可,一组数据的复杂度为O(n)。
代码:
#include <cstdio>
#include <algorithm>
#include <queue>
#include <cstring>
#define int long long
using namespace std;
const int mod=;
const int maxn=; struct node{
int to,next;
bool vis;
}e[maxn<<];
int head[maxn<<];
int cnt; inline void add(int u,int v) {
e[++cnt].to=v;
e[cnt].next=head[u];
head[u]=cnt;
} int num_p,num_e;
bool isselfcir;
bool vis[maxn];
inline void dfs(int now) {
vis[now]=;
num_p++;
for (int i=head[now];i;i=e[i].next) {
int to=e[i].to;
if (!e[i].vis) e[i].vis=,num_e++;
if (to==now) isselfcir=;
if (vis[to]) continue;
dfs(to);
}
} signed main() {
int T;
scanf("%lld",&T);
while (T--) {
memset(vis,,sizeof(vis));
memset(head,,sizeof(head));
memset(e,,sizeof(e));
cnt=;
int n,m;
scanf("%lld%lld",&m,&n);
for (int i=;i<=m;i++) {
int x,y;
scanf("%lld%lld",&x,&y);
add(x,y),add(y,x);
}
int ans=;
for (int i=;i<=n;i++) {
if (!vis[i]) {
isselfcir=,num_p=,num_e=;
dfs(i);
num_e>>=;
if (num_e>num_p) {
ans=;
break;
}
if (num_e==num_p)
if (!isselfcir) ans*=,ans%=mod;
if (num_e==num_p-)
ans*=num_p,ans%=mod;
}
}
printf("%lld\n",ans);
}
}
清北学堂模拟赛2 T2 ball的更多相关文章
- 清北学堂模拟赛day7 数字碰撞
		/* clj:水题别人都满分你不是你就完了,所以说水题一定要细心一点,有这么几个细节:①前导零的处理,全是零的时候要特判②换行要注意,不要多大一行,剩下就是水水的模拟了 */ #include< ... 
- 清北学堂模拟赛d6t4 数组异或
		分析:直接O(n^3)做是只有50分的,可以加一点小小的优化,就是c[k]可以从c[k-1]得到,但是还是只有60分,从宏观意义上是不能继续优化了.对于这类涉及到位运算的性质的题目,将每个数转化成二进 ... 
- 清北学堂模拟赛d4t1 a
		分析:大模拟,没什么好说的.我在考场上犯了一个超级低级的错误:while (scanf("%s",s + 1)),导致了死循环,血的教训啊,以后要记住了. /* 1.没有发生改变, ... 
- 清北学堂模拟赛day7  错排问题
		/* 考虑一下已经放回m本书的情况,已经有书的格子不要管他,考虑没有书的格子,不考虑错排有(n-m)!种,在逐步考虑有放回原来位置的情况,已经放出去和已经被占好的格子,不用考虑,剩下全都考虑,设t=x ... 
- 清北学堂模拟赛day7 石子合并加强版
		/* 注意到合并三堆需要枚举两个端点,其实可以开一个数组记录合并两堆的结果,标程好像用了一个神奇的优化 */ #include<iostream> #include<cstdio&g ... 
- 清北学堂模拟赛d6t6 棋盘迷宫
		3.棋盘迷宫(boardgame.pas/c/cpp)(boardgame.in/out)时间限制:5s/空间限制:256M[题目描述]小 A 和小 Z 是非常要好的朋友, 而且他们都对迷宫游戏非常有 ... 
- 清北学堂模拟赛d1t2 火柴棒 (stick)
		题目描述众所周知的是,火柴棒可以拼成各种各样的数字.具体可以看下图: 通过2根火柴棒可以拼出数字“1”,通过5根火柴棒可以拼出数字“2”,以此类推. 现在LYK拥有k根火柴棒,它想将这k根火柴棒恰好用 ... 
- 清北学堂模拟赛d1t1 位运算1(bit)
		题目描述LYK拥有一个十进制的数N.它赋予了N一个新的意义:将N每一位都拆开来后再加起来就是N所拥有的价值.例如数字123拥有6的价值,数字999拥有27的价值.假设数字N的价值是K,LYK想找到一个 ... 
- 清北学堂模拟赛d2t6 分糖果(candy)
		题目描述总共有n颗糖果,有3个小朋友分别叫做L,Y,K.每个小朋友想拿到至少k颗糖果,但这三个小朋友有一个共同的特点:对3反感.也就是说,如果某个小朋友拿到3颗,13颗,31颗,333颗这样数量的糖果 ... 
随机推荐
- nginx的负载介绍
			指定上游服务器的upstream与server指令 指令介绍 Syntax: upstream name { ... } Default: — Context: http Syntax: server ... 
- #5649,list¶llel
			// チケット5649 START // 画面項目.アカウント種別が0.1以外の場合のみ if(!CommonConstants.ACCOUNT_TYPE_SYSTEM_NEXT.equals(for ... 
- 【PAT甲级】1029 Median (25 分)
			题意: 输入一个正整数N(<=2e5),接着输入N个非递减序的长整数. 输入一个正整数N(<=2e5),接着输入N个非递减序的长整数.(重复一次) 输出两组数合并后的中位数.(200ms, ... 
- [转]简单总结一下解决 添加 inline-block 后多出来的空隙
			添加 inline-block 后: 查询.借鉴的原网址:http://www.zhangxinxu.com/wordpress/?p=2357 html 结构: <ul class=" ... 
- Centos7  设置自定义安装nginx的systemctl启动方式
			一.systemctl方式启动设置过程 1.首先创建服务配置文件(名字和路径就是这个) vim /usr/lib/systemd/system/nginx.service 2.添加配置内容 [Unit ... 
- Python简单程序爬取天气信息,定时发邮件给朋友【高薪必学】
			前段时间看到了这个博客.https://blog.csdn.net/weixin_45081575/article/details/102886718.他用了request模块,这不巧了么,正好我刚用 ... 
- 一道快速考察 Python 基础的面试题
			这是前一阵子群友发在群里的一道面试题,利用 Python 字典的特性,可以巧妙地使用精简代码达成完美解. 题目 将 data 转换成 new_data 这种形式,写出转换过程. data = { 'a ... 
- 爬虫(十五):Scrapy框架(二) Selector、Spider、Downloader Middleware
			1. Scrapy框架 1.1 Selector的用法 我们之前介绍了利用Beautiful Soup.正则表达式来提取网页数据,这确实非常方便.而Scrapy还提供了自己的数据提取方法,即Selec ... 
- 使用Thymeleaf时,ajax的url如何设置?
			使用Thymeleaf时,ajax的url如何设置? 最近在做一个论坛项目使用到了Thymeleaf,在使用ajax请求的时候发现无法获取BasePath.在经过一番查阅资料后终于得知如下俩种方法,在 ... 
- A Simple Problem with Integers-POJ3468  区间修改+区间查询
			题意: 给你n个数和2个操作,C操作是将一个区间内的每个数都加上k,Q操作是询问一个区间的和 链接:http://poj.org/problem?id=3468 思路: 线段树区间修改+区间查询 代码 ... 
