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. 435 Non-overlapping Intervals 无重叠区间

    给定一个区间的集合,找到需要移除区间的最小数量,使剩余区间互不重叠.注意:    可以认为区间的终点总是大于它的起点.    区间 [1,2] 和 [2,3] 的边界相互“接触”,但没有相互重叠.示例 ...

  2. 关于C# DropDownList 动态加载数据笔记

    今天在处理一个导游注册的页面,其中需要填写地址以及该地址下所有旅行社,地址区级以上都是用下拉列表实现,具体地址街道等手动填写.在填写区县之后,该区县下的所有旅行社也需要动态加载. 后台代码 DataT ...

  3. 《基于Node.js实现简易聊天室系列之环境搭建》

    前文提到了Demo所涉及的技术,现在讲环境(工具)的配置.环境的配置主要是数据库mongDB和Node.js的配置. Node.js Node.js的官方地址:https://nodejs.org/e ...

  4. linux命令useradd添加用户

    linux命令useradd添加用户详解 1.作用 useradd或adduser命令用来建立用户帐号和创建用户的起始目录,使用权限是超级用户. 2.格式 useradd [-d home] [-s ...

  5. 建设一个能承受500万PV/每天的网站如果计算?

    PV是什么: PV是page view的简写.PV是指页面的访问次数,每打开或刷新一次页面,就算做一个pv. 计算模型: 每台服务器每秒处理请求的数量=((80%*总PV量)/(24小时*60分*60 ...

  6. 迅为i.MX6Q嵌入式开发板

    工业级核心板:核心板10层高速PCB设计,充分保证电磁兼容. 01. 处理器:开发板默认是四核商业扩展级芯片,可根据用户需求更换单核.双核.工业级.汽车级处理器,批量更省成本. 02. 扩展引脚:32 ...

  7. jQuery radio 选中提示

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  8. C++运行外部exe并判断exe返回值

    有三个API函数可以运行可执行文件WinExec.ShellExecute和CreateProcess.CreateProcess因为使用复杂,比较少用. WinExec主要运行EXE文件. ⑴ 函数 ...

  9. Jupyter IPython dead kernel and do not restart

    本人遇到的情况:dead kernel & try to restart failed 查看CMD发现这个库安装有问题 解决办法 1.pip uninstall backports.shuti ...

  10. DIV可编辑后,与限制输入及光标偏移的纠葛

    前言 最近在弄个人的网站,偶然间发现DIV可以设置编辑模式,之前设计的方案在此功能上需要限制输入的长度.网上搜索了一波,综合搜索的结果,考虑使用的监听事件有:keydown .textInput .i ...