【LOJ】#2524. 「HAOI2018」反色游戏
题解
如果一个联通块是一个树的话,方案数就一种,如果这个联通块还有别的边,那选了一条别的边就会把树上对应路径全部取反,所以方案数是\(2^{m - n + 1}\)
如果联通块数为\(c\)方案数为\(2^{m - m + c}\)
一个联通块有奇数个黑点一定为0
然后就对于每个点判断是不是割点,是的话看看分成的联通块有几个包含奇数个黑点
然后如果不是割点看看删掉这个点后联通块黑点个数的奇偶性改没改变
同时要特判联通块里只有一个点的情况
代码
#include <bits/stdc++.h>
#define fi first
#define se second
#define pii pair<int,int>
#define pdi pair<db,int>
#define mp make_pair
#define pb push_back
#define enter putchar('\n')
#define space putchar(' ')
#define eps 1e-8
#define MAXN 100005
#define mo 974711
//#define ivorysi
using namespace std;
typedef long long int64;
typedef double db;
template<class T>
void read(T &res) {
    res = 0;char c = getchar();T f = 1;
    while(c < '0' || c > '9') {
	if(c == '-') f = -1;
	c = getchar();
    }
    while(c >= '0' && c <= '9') {
	res = res * 10 + c - '0';
	c = getchar();
    }
    res *= f;
}
template<class T>
void out(T x) {
    if(x < 0) {x = -x;putchar('-');}
    if(x >= 10) {
	out(x / 10);
    }
    putchar('0' + x % 10);
}
const int MOD = 1000000007;
int N,M,pw[200005];
char s[MAXN];
struct node {
    int to,next;
}E[MAXN * 2];
int head[MAXN],sumE,conn,deg[MAXN],rec[MAXN],incodd[MAXN],incconn[MAXN];
int dfn[MAXN],low[MAXN],idx,sta[MAXN],top,siz[MAXN],black,odd;
bool cut[MAXN],vis[MAXN],acs[MAXN];
void add(int u,int v) {
    E[++sumE].to = v;
    E[sumE].next = head[u];
    head[u] = sumE;
}
int inc(int a,int b) {
    return a + b >= MOD ? a + b - MOD : a + b;
}
int mul(int a,int b) {
    return 1LL * a * b % MOD;
}
void Tarjan(int u,int fa) {
    int son = 0;
    low[u] = dfn[u] = ++idx;
    sta[++top] = u;
    siz[u] = (s[u] == '1');
    for(int i = head[u] ; i ; i = E[i].next) {
	int v = E[i].to;
	if(v != fa) {
	    if(dfn[v]) low[u] = min(low[u],dfn[v]);
	    else {
		Tarjan(v,u);
		if(low[v] >= dfn[u]) {
		    ++son;
		    if(fa) cut[u] = 1;
		    int t = 0;
		    while(1) {
			int x = sta[top--];
			t += siz[x];
			if(x == v) break;
		    }
		    incodd[u] += (t & 1);
		    incconn[u]++;
		    siz[u] += t;
		}
		low[u] = min(low[v],low[u]);
	    }
	}
    }
    if(!fa && son > 1) cut[u] = 1;
    if(cut[u]) {
	if(fa) incconn[u]++;
	incodd[u] += (black - siz[u] & 1);
	if(odd - (black & 1) + incodd[u] == 0) acs[u] = 1;
    }
    else {
	if(odd - (black & 1) + (black - (s[u] == '1') & 1) == 0) acs[u] = 1;
    }
}
void dfs(int u) {
    vis[u] = 1;
    if(s[u] == '1') ++black;
    for(int i = head[u] ; i ; i = E[i].next) {
	int v = E[i].to;
	if(!vis[v]) dfs(v);
    }
}
void Init() {
    read(N);read(M);
    memset(head,0,sizeof(head));sumE = 0;
    memset(deg,0,sizeof(deg));
    idx = 0;top = 0;conn = 0;
    memset(dfn,0,sizeof(dfn));memset(low,0,sizeof(low));
    memset(siz,0,sizeof(siz));
    memset(cut,0,sizeof(cut));memset(vis,0,sizeof(vis));
    memset(acs,0,sizeof(acs));
    memset(incodd,0,sizeof(incodd));memset(incconn,0,sizeof(incconn));
    int u,v;
    for(int i = 1 ; i <= M ; ++i) {
	read(u);read(v);
	add(u,v);add(v,u);
	deg[u]++;deg[v]++;
    }
    scanf("%s",s + 1);
    odd = 0;
    for(int i = 1 ; i <= N ; ++i) {
	if(!vis[i]) {
	    black = 0;
	    ++conn;
	    dfs(i);
	    rec[i] = black;
	    if(black & 1)++odd;
	}
    }
}
void Solve() {
    if(odd >= 2) {
	for(int i = 1 ; i <= N + 1 ; ++i) {out(0);space;}
	return;
    }
    for(int i = 1 ; i <= N ; ++i) {
	if(!dfn[i]) {
	    top = 0;idx = 0;
	    black = rec[i];
	    Tarjan(i,0);
	    if(!deg[i]) cut[i] = 1;
	}
    }
    if(odd == 0) {
	out(pw[M - N + conn]);space;
    }
    else {
	out(0);space;
    }
    for(int i = 1 ; i <= N ; ++i) {
	if(!acs[i]) out(0);
	else if(cut[i]) {
	    out(pw[(M - deg[i]) - (N - 1) - 1 + conn + incconn[i]]);
	}
	else {
	    out(pw[(M - deg[i]) - (N - 1) + conn]);
	}
	space;
    }
}
int main() {
#ifdef ivorysi
    freopen("f1.in","r",stdin);
#endif
    pw[0] = 1;
    for(int i = 1 ; i <= 200000; ++i) {
	pw[i] = mul(pw[i - 1],2);
    }
    int T;
    read(T);
    while(T--) {Init();Solve();enter;}
}
												
											【LOJ】#2524. 「HAOI2018」反色游戏的更多相关文章
- LOJ #6436. 「PKUSC2018」神仙的游戏(字符串+NTT)
		
题面 LOJ #6436. 「PKUSC2018」神仙的游戏 题解 参考 yyb 的口中的长郡最强选手 租酥雨大佬的博客 ... 一开始以为 通配符匹配 就是类似于 BZOJ 4259: 残缺的字符串 ...
 - loj#2269. 「SDOI2017」切树游戏
		
还是loj的机子快啊... 普通的DP不难想到,设F[i][zt]为带上根玩出zt的方案数,G[i][zt]为子树中的方案数,后面是可以用FWT优化的 主要是复习了下动态DP #include< ...
 - LOJ 6436 「PKUSC2018」神仙的游戏——思路+卷积
		
题目:https://loj.ac/problem/6436 看题解才会. 有长为 i 的 border ,就是有长为 n-i 的循环节. 考虑如果 x 位置上是 0 . y 位置上是 1 ,那么长度 ...
 - loj#6436. 「PKUSC2018」神仙的游戏(生成函数)
		
题意 链接 Sol 生成函数题都好神仙啊qwq 我们考虑枚举一个长度\(len\).有一个结论是如果我们按\(N - len\)的余数分类,若同一组内的全为\(0\)或全为\(1\)(?不算),那么存 ...
 - LOJ #6436. 「PKUSC2018」神仙的游戏
		
题目分析 通过画图分析,如果存在border长度为len,则原串一定是长度为n-len的循环串. 考虑什么时候无法形成长度为len的循环串. 显然是两个不同的字符的距离为len的整数倍时,不存在这样的 ...
 - loj#6436. 「PKUSC2018」神仙的游戏(NTT)
		
题面 传送门 题解 一旦字符串踏上了通配符的不归路,它就永远脱离了温暖的字符串大家庭的怀抱 用人话说就是和通配符扯上关系的字符串就不是个正常的字符串了比如说这个 让我们仔细想想,如果一个长度为\(le ...
 - 【loj#2524】【bzoj5303】 [Haoi2018]反色游戏(圆方树)
		
题目传送门:loj bzoj 题意中的游戏方案可以转化为一个异或方程组的解,将边作为变量,点作为方程,因此若方程有解,方程的解的方案数就是2的自由元个数次方.我们观察一下方程,就可以发现自由元数量=边 ...
 - 【BZOJ5303】[HAOI2018]反色游戏(Tarjan,线性基)
		
[BZOJ5303][HAOI2018]反色游戏(Tarjan,线性基) 题面 BZOJ 洛谷 题解 把所有点全部看成一个\(01\)串,那么每次选择一条边意味着在这个\(01\)串的基础上异或上一个 ...
 - bzoj 5393 [HAOI2018] 反色游戏
		
bzoj 5393 [HAOI2018] 反色游戏 Link Solution 最简单的性质:如果一个连通块黑点个数是奇数个,那么就是零(每次只能改变 \(0/2\) 个黑点) 所以我们只考虑偶数个黑 ...
 
随机推荐
- 【BZOJ3670】【NOI2014】动物园(KMP算法)
			
[BZOJ3670]动物园(KMP算法) 题面 BZOJ 题解 神TM阅读理解题 看完题目之后 想暴力: 搞个倍增数组来跳\(next\) 每次暴跳\(next\) 复杂度\(O(Tnlogn)\) ...
 - 【字符串算法1】 再谈字符串Hash(优雅的暴力)
			
[字符串算法1] 字符串Hash(优雅的暴力) [字符串算法2]Manacher算法 [字符串算法3]KMP算法 这里将讲述 [字符串算法1] 字符串Hash 老版原文: RK哈希(Rabin_Ka ...
 - 解决360WiFi有时候手机连接不上
			
有可能是无线网卡的问题: 右击“计算机”->选择“管理”->“设备管理器”->网络适配器->选择“Broadcom 802.11n 网络适配器”,或者你实在不知道哪个是无线网 ...
 - kubernetes配置secret拉取私仓镜像
			
2017.05.10 19:48* 字数 390 阅读 5216评论 0喜欢 8 对于公司内部的项目, 我们不可能使用公有开放的镜像仓库, 一般情况可能会花钱买docker私仓服务, 或者说自己在服务 ...
 - Hadoop基础--统计商家id的标签数案例分析
			
Hadoop基础--统计商家id的标签数案例分析 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.项目需求 将“temptags.txt”中的数据进行分析,统计出商家id的评论标 ...
 - Hadoop基础-MapReduce的常用文件格式介绍
			
Hadoop基础-MapReduce的常用文件格式介绍 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.MR文件格式-SequenceFile 1>.生成SequenceF ...
 - java取得当前日期增加一天或多天
			
代码如下: SimpleDateFormat sf = new SimpleDateFormat("yyyy-MM-dd"); Calendar c = Calendar.getI ...
 - 用到的设计模式总结--单例模式+工厂方法模式+Builder模式
			
一,工厂方法模式和单例模式 工厂方法模式中有一个抽象的工厂接口和一个抽象的产品接口.然后,具体的工厂实现抽象工厂并负责生产具体的产品.由客户端决定 new 哪个具体的工厂,从而生产哪种产品. 因此,与 ...
 - [整理]Git使用文章整理
			
http://pcottle.github.io/learnGitBranching/ http://www.ruanyifeng.com/blog/2012/07/git.html
 - 关于Spring mvc注解中的定时任务的配置
			
关于spring mvc注解定时任务配置 简单的记载:避免自己忘记,不是很确定我理解的是否正确.有错误地方望请大家指出. 1,定时方法执行配置: (1)在applicationContext.xml中 ...