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的更多相关文章

  1. 【CodeForces】704 C. Black Widow 动态规划+模拟

    [题目]C. Black Widow [题意]给定一个表达式,形式为(...)^(...)^......^(...)=1(n个括号),括号中为1~2个值取或.有m个变量,给出表达式的值为xi或 !xi ...

  2. js中widow.open()方法详解

    一. window.open() 支持环境: JavaScript1.0+/JScript1.0+/Nav2+/IE3+/Opera3+ 二.基本语法: window.open(pageURL,nam ...

  3. Day02——widow对象

    window - 计时器 1、setTimeout()可以用来在指定的时间之后单次调用函数. setTimeount(f,1000);//一秒后调用函数f clearTimeout();取消函数的执行 ...

  4. Black Widow CodeForces - 704C (dp)

    大意: 给定一个m个bool变量的方程, 求方程解的个数 给定方程的形式类似于这样 每个括号是一个子式, 每个子式里变量数不超过2, 每个变量出现次数不超过2, 方程右侧一直是1 对每个变量出现的式子 ...

  5. Mac与Widow下编译与运行java文件引入多个外部jar包

    记录下,以后万一用得着呢 1.MAC环境下: 前提:在终端跳转到当前的源文件目录(cd xx), 并且配置好jdk,这里面不是重点 编译命令:注意连接用  :  号 javac -cp commons ...

  6. widow系统 LuaForWindows,安装 luasocket

    参考 http://94it.net/a/jingxuanboke/2013/0625/49052.html 1. 我用的是 LuaForWindows_v5.1.4-46.exe 可以在我的百度网盘 ...

  7. widow下svn上传项目时的文件可执行权限问题

    还是项目上发现的问题,要上传Android的源码项目.这里客户端是windows的机器, 测试后发现俩个问题. 1. 文件后缀是.so的文件默认上传不了.    2. 文件后缀是.sh的文件,上传后, ...

  8. flink widow&window funcion&水印

    在定义了窗口分配器之后,我们需要为每一个窗口明确的指定计算逻辑,这个就是窗口函数要做的事情, 当系统决定一个窗口已经准备好执行之后,这个窗口函数将被用来处理窗口中的每一个元素(可能是 分组的). 谁可 ...

  9. Codeforces 704C - Black Widow(dp)

    Codeforces 题目传送门 & 洛谷题目传送门 u1s1 感觉这种题被评到 *2900 是因为细节太繁琐了,而不是题目本身的难度,所以我切掉这种题根本不能说明什么-- 首先题目中有一个非 ...

随机推荐

  1. APP热修复

    APP热修复的概念: APP修复是针对修复app中的bug场景来定义的.当我们已上线的app出现bug的时候,我们想在用户不知情的情况下修复这个bug,那么就会用到热修复. APP热修复的实现原理: ...

  2. jqueryUI插件

    <link rel="stylesheet" href="~/Content/themes/base/jquery-ui.css" /> <s ...

  3. [Luogu1848][USACO12OPEN]书架Bookshelf DP+set+决策单调性

    题目链接:https://www.luogu.org/problem/show?pid=1848 题目要求书必须按顺序放,其实就是要求是连续的一段.于是就有DP方程$$f[i]=min\{f[j]+m ...

  4. 阿里云CDN服务功能介绍

  5. restful api的简单理解

    百度百科的描述:一种软件架构风格,设计风格而不是标准,只是提供了一组设计原则和约束条件.它主要用于客户端和服务器交互类的软件.基于这个风格设计的软件可以更简洁,更有层次,更易于实现缓存等机制. RES ...

  6. 这是一条立了Flag的不归路

    时间2017年7月11日 14:48:40 首次激活博客园的博客来进行学习记录,立下了不算远大的小目标,下一步就是要一步一步的往前走. Java是目前最普遍的使用语言之一,作为一名测试,本应该去学习更 ...

  7. leetcode_998. Maximum Binary Tree II

    https://leetcode.com/problems/maximum-binary-tree-ii/ 在654. Maximum Binary Tree版本的建树基础上,在最后插入一个数. 新节 ...

  8. leetcode_378. Kth Smallest Element in a Sorted Matrix_堆的应用

    Given a n x n matrix where each of the rows and columns are sorted in ascending order, find the kth ...

  9. 高阶函数与接口混入和java匿名类

    高阶函数与接口混入和java匿名类. 高阶函数中的组件(参量)函数相当于面向对象中的混入(接口)类. public abstract class Bird { private String name; ...

  10. MySql(一)mysql服务的基本操作及环境配置

    MySQL服务的启动开始–>计算机–>右键选择管理–>双击打开服务和应用程序–>双击服务–>找到MySQL的服务名称(我的是MySQL56),右键选择启动即可 通过命令行 ...