CodeForces - 704C
题目大意:给你一个逻辑表达式,然后让你计算表达式为真的取值情况数,表达式由一系列的 a 或者 a|b 亦或起来,每个变量最多出现两次(包括反变量)
嘴炮开始:每个变量最多出现两次,那么跟它相关联的变量也最多是两个,转化成图的话,那么整个图就是由很多链和很多环组成,分别DP就好了;
链DP很简单,从一段DP到另一端就可以了
环上的DP就是先确定一个点的值然后链DP就好了,一个环DP两次
写起来感觉还是有点麻烦。。
#include<cstdio>
#include<vector>
#include<cstring>
#include<algorithm>
using namespace std; const int mod=1e9+;
const int maxn=*;
int n,m,d[maxn];
int fir[maxn],last[maxn<<],nex[maxn<<],a[maxn<<],b[maxn<<],tot=;
vector <int> e[maxn];
bool vis[maxn];
long long dp[maxn][][]; int sgn(int x)
{
if(x>)return ;
if(x<)return ;
} void add(int u,int v,int aa,int bb)
{
++tot;
last[tot]=v;
a[tot]=aa;
b[tot]=bb;
nex[tot]=fir[u];
fir[u]=tot;
} struct node{
int a,b;
}fa[maxn];
bool evis[maxn<<];
int s[maxn],cnt; void dfs(int x)
{
//printf("%d\n",x);
vis[x]=;
s[++cnt]=x;
for(int i = fir[x];i;i=nex[i])
{
if(!evis[i])
{
evis[i]=;
evis[i^]=;
fa[x]=(node){a[i],b[i]};
if(!vis[last[i]])dfs(last[i]);
}
}
} void up(long long &a,long long b)
{
a+=b;
a%=mod;
} int main()
{
scanf("%d%d",&n,&m);
long long ans1=,ans0=;
for(int i = ;i <= n;i++)
{
int k;
scanf("%d",&k);
if(k==)
{
int x;
scanf("%d",&x);
e[abs(x)].push_back(sgn(x));
}
else
{
int u,v;
scanf("%d%d",&u,&v);
if(abs(u)==abs(v))
{
if(u!=v)
{
vis[abs(u)]=;
swap(ans1,ans0);
ans1=ans1*%mod;
ans0=ans0*%mod;
}
else
{
e[abs(u)].push_back(sgn(u));
}
continue;
}
add(abs(u),abs(v),sgn(u),sgn(v));
add(abs(v),abs(u),sgn(v),sgn(u));
d[abs(u)]++;
d[abs(v)]++;
}
}
for(int i = ;i <= m;i++)
if(!vis[i] && d[i]== && e[i].size()>)
{
vis[i]=;
if(e[i].size()==)
{
ans1=(ans1+ans0)%mod;
ans0=ans1;
}
else
{
if(e[i][]==e[i][])
{
ans1=ans1*%mod;
ans0=ans0*%mod;
}
else
{
swap(ans1,ans0);
ans1=ans1*%mod;
ans0=ans0*%mod;
}
}
//printf("%I64d %I64d\n",ans1,ans0);
}
for(int i = ;i <= m;i++)
if(d[i]== && !vis[i])
{
cnt=;
dfs(i);
dp[i][][]=;
dp[i][][]=;
dp[i][][]=;
dp[i][][]=;
if(e[i].size())
{
if(e[i][]==)
{
swap(dp[i][][],dp[i][][]);
}
else
{
swap(dp[i][][],dp[i][][]);
}
}
for(int step = ;step < cnt;step++)
{
for(int ii = ;ii < ;ii++)
for(int jj = ;jj < ;jj++)
for(int kk = ;kk < ;kk++)
{
up(dp[s[step+]][kk][((ii^fa[s[step]].a)|(kk^fa[s[step]].b))^jj],dp[s[step]][ii][jj]);
}
}
int x=s[cnt];
if(e[x].size())
{
if(e[x][]==)
{
swap(dp[x][][],dp[x][][]);
}
else
{
swap(dp[x][][],dp[x][][]);
}
}
//printf("xx %I64d %I64d %I64d %I64d\n",dp[x][0][0],dp[x][0][1],dp[x][1][0],dp[x][1][1]);
long long a1=,a0=; //printf("%I64d %I64d\n",ans1,ans0);
a1=(dp[x][][]+dp[x][][])*ans1%mod+(dp[x][][]+dp[x][][])*ans0%mod;
a0=(dp[x][][]+dp[x][][])*ans0%mod+(dp[x][][]+dp[x][][])*ans1%mod;
ans1=a1%mod;
ans0=a0%mod;
//printf("%I64d %I64d\n",ans1,ans0);
}
for(int i = ;i <= m;i++)
if(d[i]== && !vis[i])
{
cnt=;
dfs(i);
dp[i][][]=;
dp[i][][]=;
dp[i][][]=;
dp[i][][]=;
for(int step = ;step <= cnt;step++)
memset(dp[s[step]],,sizeof(dp[s[step]]));
for(int step = ;step < cnt;step++)
{
for(int ii = ;ii < ;ii++)
for(int jj = ;jj < ;jj++)
for(int kk = ;kk < ;kk++)
{
up(dp[s[step+]][kk][((ii^fa[s[step]].a)|(kk^fa[s[step]].b))^jj],dp[s[step]][ii][jj]);
}
}
int x=s[cnt];
for(int ii=;ii<;ii++)
if((ii^fa[x].a)|(fa[x].b))swap(dp[x][ii][],dp[x][ii][]);
long long a1=,a0=;
//printf("xx %I64d %I64d %I64d %I64d\n",dp[x][0][0],dp[x][0][1],dp[x][1][0],dp[x][1][1]);
a1+=(dp[x][][]+dp[x][][])*ans1%mod+(dp[x][][]+dp[x][][])*ans0%mod;
a0+=(dp[x][][]+dp[x][][])*ans0%mod+(dp[x][][]+dp[x][][])*ans1%mod; dp[i][][]=;
dp[i][][]=;
dp[i][][]=;
dp[i][][]=;
for(int step = ;step <= cnt;step++)
memset(dp[s[step]],,sizeof(dp[s[step]]));
for(int step = ;step < cnt;step++)
{
for(int ii = ;ii < ;ii++)
for(int jj = ;jj < ;jj++)
for(int kk = ;kk < ;kk++)
{
up(dp[s[step+]][kk][((ii^fa[s[step]].a)|(kk^fa[s[step]].b))^jj],dp[s[step]][ii][jj]);
}
}
for(int ii=;ii<;ii++)
if((ii^fa[x].a)|(^fa[x].b))swap(dp[x][ii][],dp[x][ii][]);
//printf("xx %I64d %I64d %I64d %I64d\n",dp[x][0][0],dp[x][0][1],dp[x][1][0],dp[x][1][1]);
a1+=(dp[x][][]+dp[x][][])*ans1%mod+(dp[x][][]+dp[x][][])*ans0%mod;
a0+=(dp[x][][]+dp[x][][])*ans0%mod+(dp[x][][]+dp[x][][])*ans1%mod;
ans1=a1%mod;
ans0=a0%mod;
//printf("%I64d %I64d\n",ans1,ans0);
}
for(int i = ;i <= m;i++)
if(!vis[i])ans1=ans1*%mod;
printf("%I64d\n",ans1);
return ;
}
AC code
CodeForces - 704C的更多相关文章
- Codeforces 704C - Black Widow(dp)
Codeforces 题目传送门 & 洛谷题目传送门 u1s1 感觉这种题被评到 *2900 是因为细节太繁琐了,而不是题目本身的难度,所以我切掉这种题根本不能说明什么-- 首先题目中有一个非 ...
- Black Widow CodeForces - 704C (dp)
大意: 给定一个m个bool变量的方程, 求方程解的个数 给定方程的形式类似于这样 每个括号是一个子式, 每个子式里变量数不超过2, 每个变量出现次数不超过2, 方程右侧一直是1 对每个变量出现的式子 ...
- python爬虫学习(5) —— 扒一下codeforces题面
上一次我们拿学校的URP做了个小小的demo.... 其实我们还可以把每个学生的证件照爬下来做成一个证件照校花校草评比 另外也可以写一个物理实验自动选课... 但是出于多种原因,,还是绕开这些敏感话题 ...
- 【Codeforces 738D】Sea Battle(贪心)
http://codeforces.com/contest/738/problem/D Galya is playing one-dimensional Sea Battle on a 1 × n g ...
- 【Codeforces 738C】Road to Cinema
http://codeforces.com/contest/738/problem/C Vasya is currently at a car rental service, and he wants ...
- 【Codeforces 738A】Interview with Oleg
http://codeforces.com/contest/738/problem/A Polycarp has interviewed Oleg and has written the interv ...
- CodeForces - 662A Gambling Nim
http://codeforces.com/problemset/problem/662/A 题目大意: 给定n(n <= 500000)张卡片,每张卡片的两个面都写有数字,每个面都有0.5的概 ...
- CodeForces - 274B Zero Tree
http://codeforces.com/problemset/problem/274/B 题目大意: 给定你一颗树,每个点上有权值. 现在你每次取出这颗树的一颗子树(即点集和边集均是原图的子集的连 ...
- CodeForces - 261B Maxim and Restaurant
http://codeforces.com/problemset/problem/261/B 题目大意:给定n个数a1-an(n<=50,ai<=50),随机打乱后,记Si=a1+a2+a ...
随机推荐
- 【转载】COM编程入门不得不看的文章 :第一部分 什么是COM,如何使用COM
原文:COM编程入门不得不看的文章 :第一部分 什么是COM,如何使用COM 原文:http://www.codeproject.com/Articles/633/Introduction-to-CO ...
- Android 9 适配怎么做? “QQ音乐”优化实录
WeTest 导读 2018年8月7日,Google对外发布最新 Android 9.0 正式版系统,并宣布系统版本Android P 被正式命名为代号“Pie”,最新系统已经正式推送包括谷歌Pixe ...
- 腾讯WeTest开启“测试扶持计划”赠送重磅福利(含MTSC/TiD门票)
WeTest导语 伴随着互联网行业的发展,与各行各业的连接更加紧密,竞争也变得越发激烈,用户对于产品的体验开始变得更加“挑剔”.然而目前互联网产品却始终受到各类质量问题的困扰.以兼容问题为例,应用平台 ...
- 模拟实现MyBatis中通过SQL反射实体类对象功能
话不多说,直接上干货! package cn.test; import java.lang.reflect.Method; import java.sql.Connection; import jav ...
- 92套AE抖音快闪模板(精品)
包含很多场景和类型,直接用即可,下载地址:百度网盘,https://pan.baidu.com/s/1bRFql1zFWyfpTAwa6MhuPA 内容截图:
- hackhttp模板的介绍
hackhttp模板:造福人类 发起get/post/ 发起http原始数据包 漏洞利用:更为快捷放放不安 #hackhttp使用方法hh=hackhttp.hackhttp() code,head, ...
- 使用jenkins构建一个自由风格的项目
一.创建一个freestyle风格的构建项目 二.输入任务名称和选择任务类型 三.配置项目 3.1:选择代码托管 3.2:到gitlab上去配置deploy key 3.3:到jenkins服务器去生 ...
- List和String数组相互转化
在工作中经常会遇到需要String[] 参数的地方,我们可以先定义一个list,再转成String[] 来使用,使用list的好处自然是可以随时方便的添加删除元素,下面是方法: List list = ...
- Microservices with Spring Boot
找到一套比较不错的Spring Boot/Cloud入门教程,推荐一下. https://dzone.com/users/1041459/ranga_pec.html
- Ubuntu14.04下部署FastDFS 5.08+Nginx 1.9.14
最新的版本可以在这里获取,目前下载的最新版本是5.08,更新于2016-02-03.在这里可以找到更多的说明. 下载好后,server端分为两个部分,一个是tracker,一个是storage.顾 ...