Codeforces704C. Black Widow
n<=1e5个值v,分别由<=1e5的m个变量中的1<=ki<=2个布尔变量xj(或某个变量取反)或起来组成,而所有的v异或起来为1,一个x不会在输入数据中出现超过2次,包括他和他反面。问满足该条件的布尔序列x有多少种。
如果忽略“超过两次”这个条件是难做的。。(好吧就是我看走眼了)
利用好这个条件,可以先把含相同x的v连边,由于一个x不会出现超过两次,一个v的度也不会超过2,那么就有可能形成环、链或点。
然后分别在环链上做DP,点特判即可。$f(i,0/1,0/1,0/1)$--前i个点,第一个点的第一个变量选了0还是1(判环用),上一次选的变量是0还是1,当前已经确定的v异或起来是0还是1。然后分极多种情况转移即可,要考虑一条边对应的x符号是否一样,详见代码。环的最后要特判,边的最初和最后要分端点的v是含一个变量还是两个。
比较难写。
#include<string.h>
#include<stdlib.h>
#include<stdio.h>
#include<math.h>
//#include<assert.h>
#include<algorithm>
//#include<iostream>
using namespace std; int n,m;
#define maxn 200011
const int mod=1e9+;
struct Edge{int to,next,v;}edge[maxn<<]; int first[maxn],le=;
void in(int x,int y,int v) {Edge &e=edge[le]; e.to=y; e.v=v; e.next=first[x]; first[x]=le++;}
void insert(int x,int y,int v) {in(x,y,v); in(y,x,v);} struct Node
{
int k,id[];
}a[maxn];
int appear[maxn],h[maxn][],final[maxn][],start[maxn],tot=; bool vis[maxn]; int sta[maxn],top=;
void findstart(int x,int fa)
{
vis[x]=; sta[++top]=x;
bool flag=;
for (int i=first[x];i;i=edge[i].next)
{
if (i==fa || (i^)==fa) continue;
flag=;
const Edge &e=edge[i];
if (vis[e.to]) start[tot]=e.to;
else findstart(e.to,i);
}
if (!flag) start[tot]=x;
if (flag && fa== && !start[tot]) start[tot]=x;
} int now,f[maxn][][][];
void dfs(int x,int fa)
{
f[x][][][]%=mod;
f[x][][][]%=mod;
f[x][][][]%=mod;
f[x][][][]%=mod;
f[x][][][]%=mod;
f[x][][][]%=mod;
f[x][][][]%=mod;
f[x][][][]%=mod;
vis[x]=;
if (!fa)
{
if (a[x].k==) f[x][][][]=f[x][][][]=;
else f[x][][][]=;
} bool flag=;
for (int i=first[x];i;i=edge[i].next)
{
if (i==fa || (i^)==fa) continue;
const Edge &e=edge[i];
if (vis[e.to] && !fa) continue;
flag=;
bool diff;
for (int j=;j<a[x].k;j++)
for (int k=;k<a[e.to].k;k++)
if (fabs(a[x].id[j])==fabs(a[e.to].id[k]) && fabs(a[x].id[j])==e.v)
diff=(a[x].id[j]==-a[e.to].id[k]);
if (vis[e.to])
{
if (!diff)
{
h[now][]=(0ll+f[x][][][]+f[x][][][]+f[x][][][]+f[x][][][])%mod;
h[now][]=(0ll+f[x][][][]+f[x][][][]+f[x][][][]+f[x][][][])%mod;
}
else
{
h[now][]=(0ll+f[x][][][]+f[x][][][]+f[x][][][]+f[x][][][])%mod;
h[now][]=(0ll+f[x][][][]+f[x][][][]+f[x][][][]+f[x][][][])%mod;
}
}
else
{
if (!diff)
{
f[e.to][][][]+=f[x][][][];
f[e.to][][][]+=f[x][][][];
f[e.to][][][]+=f[x][][][];
f[e.to][][][]+=f[x][][][];
f[e.to][][][]+=f[x][][][];
f[e.to][][][]+=f[x][][][];
f[e.to][][][]+=f[x][][][];
f[e.to][][][]+=f[x][][][]; f[e.to][][][]+=f[x][][][];
f[e.to][][][]+=f[x][][][];
f[e.to][][][]+=f[x][][][];
f[e.to][][][]+=f[x][][][];
f[e.to][][][]+=f[x][][][];
f[e.to][][][]+=f[x][][][];
f[e.to][][][]+=f[x][][][];
f[e.to][][][]+=f[x][][][];
}
else
{
f[e.to][][][]+=f[x][][][];
f[e.to][][][]+=f[x][][][];
f[e.to][][][]+=f[x][][][];
f[e.to][][][]+=f[x][][][];
f[e.to][][][]+=f[x][][][];
f[e.to][][][]+=f[x][][][];
f[e.to][][][]+=f[x][][][];
f[e.to][][][]+=f[x][][][]; f[e.to][][][]+=f[x][][][];
f[e.to][][][]+=f[x][][][];
f[e.to][][][]+=f[x][][][];
f[e.to][][][]+=f[x][][][];
f[e.to][][][]+=f[x][][][];
f[e.to][][][]+=f[x][][][];
f[e.to][][][]+=f[x][][][];
f[e.to][][][]+=f[x][][][];
}
dfs(e.to,i);
}
}
if (!flag)
{
if (a[x].k==)
{
h[now][]=(0ll+f[x][][][]+f[x][][][]+f[x][][][]+f[x][][][])%mod;
h[now][]=(0ll+f[x][][][]+f[x][][][]+f[x][][][]+f[x][][][])%mod;
}
else
{
h[now][]=(0ll+f[x][][][]+f[x][][][]+f[x][][][]+f[x][][][]
+f[x][][][]+f[x][][][]+f[x][][][]+f[x][][][])%mod;
h[now][]=(0ll+f[x][][][]+f[x][][][]+f[x][][][]+f[x][][][]
+f[x][][][]+f[x][][][]+f[x][][][]+f[x][][][])%mod;
}
}
} int main()
{
scanf("%d%d",&n,&m);
for (int i=;i<=n;i++)
{
scanf("%d",&a[i].k);
for (int j=;j<a[i].k;j++)
{
scanf("%d",&a[i].id[j]);
if (appear[(int)fabs(a[i].id[j])])
{
if (appear[(int)fabs(a[i].id[j])]!=i)
insert(appear[(int)fabs(a[i].id[j])],i,(int)fabs(a[i].id[j]));
else
{
vis[i]=; tot++;
if (a[i].id[]==-a[i].id[]) h[tot][]=,h[tot][]=;
else h[tot][]=h[tot][]=;
}
appear[(int)fabs(a[i].id[j])]=-;
}
else appear[(int)fabs(a[i].id[j])]=i;
}
}
for (int i=;i<=m;i++) if (appear[i]> && a[appear[i]].k==)
{
vis[appear[i]]=; tot++;
h[tot][]=h[tot][]=;
}
for (int i=;i<=n;i++) if (!vis[i]) tot++,findstart(i,);
for (;top;top--) vis[sta[top]]=;
for (int i=;i<=tot;i++) if (start[i]) now=i,dfs(start[i],); final[][]=h[][]; final[][]=h[][];
for (int i=;i<=tot;i++)
{
final[i][]=(1ll*final[i-][]*h[i][]+1ll*final[i-][]*h[i][])%mod;
final[i][]=(1ll*final[i-][]*h[i][]+1ll*final[i-][]*h[i][])%mod;
}
for (int i=;i<=m;i++) if (appear[i]==) final[tot][]=(final[tot][]<<)%mod;
printf("%d\n",final[tot][]);
return ;
}
Codeforces704C. Black Widow的更多相关文章
- 【CodeForces】704 C. Black Widow 动态规划+模拟
[题目]C. Black Widow [题意]给定一个表达式,形式为(...)^(...)^......^(...)=1(n个括号),括号中为1~2个值取或.有m个变量,给出表达式的值为xi或 !xi ...
- js中widow.open()方法详解
一. window.open() 支持环境: JavaScript1.0+/JScript1.0+/Nav2+/IE3+/Opera3+ 二.基本语法: window.open(pageURL,nam ...
- Day02——widow对象
window - 计时器 1、setTimeout()可以用来在指定的时间之后单次调用函数. setTimeount(f,1000);//一秒后调用函数f clearTimeout();取消函数的执行 ...
- Black Widow CodeForces - 704C (dp)
大意: 给定一个m个bool变量的方程, 求方程解的个数 给定方程的形式类似于这样 每个括号是一个子式, 每个子式里变量数不超过2, 每个变量出现次数不超过2, 方程右侧一直是1 对每个变量出现的式子 ...
- Mac与Widow下编译与运行java文件引入多个外部jar包
记录下,以后万一用得着呢 1.MAC环境下: 前提:在终端跳转到当前的源文件目录(cd xx), 并且配置好jdk,这里面不是重点 编译命令:注意连接用 : 号 javac -cp commons ...
- widow系统 LuaForWindows,安装 luasocket
参考 http://94it.net/a/jingxuanboke/2013/0625/49052.html 1. 我用的是 LuaForWindows_v5.1.4-46.exe 可以在我的百度网盘 ...
- widow下svn上传项目时的文件可执行权限问题
还是项目上发现的问题,要上传Android的源码项目.这里客户端是windows的机器, 测试后发现俩个问题. 1. 文件后缀是.so的文件默认上传不了. 2. 文件后缀是.sh的文件,上传后, ...
- flink widow&window funcion&水印
在定义了窗口分配器之后,我们需要为每一个窗口明确的指定计算逻辑,这个就是窗口函数要做的事情, 当系统决定一个窗口已经准备好执行之后,这个窗口函数将被用来处理窗口中的每一个元素(可能是 分组的). 谁可 ...
- Codeforces 704C - Black Widow(dp)
Codeforces 题目传送门 & 洛谷题目传送门 u1s1 感觉这种题被评到 *2900 是因为细节太繁琐了,而不是题目本身的难度,所以我切掉这种题根本不能说明什么-- 首先题目中有一个非 ...
随机推荐
- 转 叫板OpenStack:用Docker实现私有云
http://www.cnblogs.com/alexkn/p/4239457.html 看到各大厂商的云主机,会不会觉得高大上?目前大公司的主流方案是OpenStack,比如某个公司的私有云
- 转 Docker Swarm vs Kubernetes
容器化已经改变我们部署软件和微服务开发的方式.如果你刚听说容器, 这篇博客帮你入门. 什么是容器编排 容器能够把服务打包成基本单元,你可以把它部署到任何地方:本地机器.测试环境或者生产系统.但是在生产 ...
- poj3735Training little cats
链接 构造矩阵 快速幂求解 构造矩阵a[i]为每个cati所拥有的花生总数 这里多加一维用来求和,具体是怎么求得可以看下面的一组例子 假设有3个cat a[] = {1,0,0,0} 构造单位矩阵来保 ...
- AJPFX关于网络编程的理解
1:网络编程(理解) (1)网络编程:用Java语言实现计算机间数据的信息传递和资源共享 (2)网络编程模型 (3)网络编程的三要素 ...
- [BZOJ2005][NOI2010]能量采集 数学
题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=2005 发现与$(0,0)$连线斜率相同的点会被挡住.也就是对于$(a,b)$且$gcd(a ...
- Android与H5互调(通过实例来了解Hybrid App)
前些日子,Android原生开发将被取缔的吵得火热,JavaScript是能做一个完全的APP,但只使用JavaScript做出来的APP也不会牛逼到哪里去.最好的是混合(Hybrid)开发,在需要的 ...
- InChatter系统之客户端实现原理与阶段小结
InChatter客户端的开发可以说是目前系统的阶段性结尾了.很抱歉的是,这篇文章来的这么晚,迟到了这么久. 在客户端的开发主要针对两个方面: 消息的传输与处理 消息的UI交互处理 一.消息的传输与处 ...
- js阻塞ui进程涉及的知识点整理
项目进行中遇到了同步ajax阻塞ui线程阻塞的问题,原因是执行两个同步ajax请求为一次完整的方法,因业务需求需要循环执行这个方法,检查后台返回的数据正确,但是由于ajax请求时间过长,考虑增加遮罩层 ...
- [转] 以超级管理员身份运行bat
(转自:以超级管理员身份运行bat - lishirong 原文日期:2013.07.04) 废话不多说,直接上代码: -------------------------------------- ...
- win8怎么打开或关闭快速启动(进入BIOS前的设置)
win8系统之后,系统添加了快速启动功能,这让Windows的启动速度快了不少.但是,任何事物有利有弊,相信不少人在进入BIOS或者重装系统时遇到了麻烦.接下来我们看看在win8及以上版本怎么打开或关 ...