2018杭电多校第三场1003(状态压缩DP)
#include<bits/stdc++.h>
using namespace std;
const int mod =1e9+7;
int dp[1<<10];
int cnt[1<<10];
int ans[1<<10];
char c[10];
int t;
void add(int &x,int y)
{
x=x+y>=mod?x+y-mod:x+y;
}
void del(int &x,int y)
{
x=x-y<0?x-y+mod:x-y;
}
int main()
{
int times;
scanf("%d",×);
while(times--)
{
int n,m;
scanf("%d%d",&n,&m);
t=1<<n;
int u,v;
for(int i=0;i<t;i++)
{
dp[i]=0;
cnt[i] = __builtin_popcount(i);//已经加入的边,函数返回i中位为1的个数
}
dp[0]=1;
for(int k=1;k<=m;k++)
{
memset(ans,0,sizeof(ans));
scanf("%s%d%d",c,&u,&v);
u--;
v--;
int s=(1<<u)|(1<<v);//表示u和v两条边已被选
if(c[0]=='+')
{
for(int i=t-1;i>=0;i--)//从后往前遍历表示在没有u和v两条边的集合里添加这两条边
{
if(!(i&s))
add(dp[i^s],dp[i]);
}
}
else
{
for(int i=0;i<t;i++)//从前往后便利表示在含有u和v两条边的集合里删除后者通过增加u和v两条边而达成前者的状态
{
if(!(i&s))
del(dp[i^s],dp[i]);
}
}
for(int i=1;i<t;i++)
{
add(ans[cnt[i]],dp[i]);//将含有这么多条边的状态合并计数
}
for(int i=2;i<=n;i+=2)
printf("%d%c",ans[i],i==n?'\n':' ');
}
}
return 0;
}
/*状态压缩用于将数据转化为二进制用0和1表示状态,通常数据在十几组左右,就也就是可以用2的十几次方来代替状态,通常涉及与或异或等操作,同时大胆猜测推断dp公式,看到数据要对其敏感,朝着正确的方向去考虑。*/
2018杭电多校第三场1003(状态压缩DP)的更多相关文章
- 2018 Multi-University Training Contest 3 杭电多校第三场
躺了几天 终于记得来填坑了 1001 Ascending Rating (hdoj 6319) 链接:http://acm.hdu.edu.cn/showproblem.php?pid=6319 ...
- 2019年杭电多校第三场 1011题Squrirrel(HDU6613+树DP)
题目链接 传送门 题意 给你一棵无根树,要你寻找一个根节点使得在将一条边权变为\(0\)后,离树根最远的点到根节点的距离最小. 思路 本题和求树的直径很像,不过要记得的东西有点多,且状态也很多. \( ...
- 杭电多校第三场 A Ascending Rating
Problem Description Before the start of contest, there are n ICPC contestants waiting in a long queu ...
- 2018杭电多校第六场1009(DFS,思维)
#include<bits/stdc++.h>using namespace std;int a[100010];char s[20];int zhiren[100010];vector& ...
- 2018杭电多校第五场1002(暴力DFS【数位】,剪枝)
//never use translation#include<bits/stdc++.h>using namespace std;int k;char a[20];//储存每个数的数值i ...
- 2019年杭电多校第三场 1008题Game(HDU6610+带修改莫队+Nim博弈)
题目链接 传送门 题意 给你\(n\)堆石子,每堆有\(a_i\)堆石子,\(q\)次操作: 在\([L,R]\)内有多少个子区间使得\(Alice\)(先手)在\(Nim\)博弈中获胜: 交换\(a ...
- [2019杭电多校第三场][hdu6609]Find the answer(线段树)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=6609 大致题意是求出每个位置i最小需要将几个位置j变为0(j<i),使得$\sum_{j=1}^ ...
- [2019杭电多校第三场][hdu6608]Fansblog
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=6608 大致题意是比p小的最大素数q,求q!%p的值. 由威尔逊定理开始推: $(p-1)!\equiv ...
- [2019杭电多校第三场][hdu6606]Distribution of books(线段树&&dp)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=6606 题意为在n个数中选m(自选)个数,然后把m个数分成k块,使得每块数字之和最大的最小. 求数字和最 ...
随机推荐
- winserver 资源下载
http://msdn.itellyou.cn/ 下载各种系统资源,支持迅雷下载,速度杠杠的
- svn 出现冲突时可以使用 meld . 命令合并。 而git的冲突合并详见内容
1.可以在任意目录使用 git mergetool --tool-help 查看 git 所支持的merge tools. 2.可以使用如下配置去设置merge tool 和 diff tool ...
- HTML——input
一个简单的HTML表单,包含两个文本输出框和一个提交按钮: <form action="form_action.asp" method="get"> ...
- STM32 FSMC学习笔记+补充(LCD的FSMC配置)
STM32 FSMC学习笔记+补充(LCD的FSMC配置) STM32 FSMC学习笔记 STM32 FSMC的用法--LCD
- 20145239杜文超 《Java程序设计》第1周学习总结
20145239<Java程序设计>第1周学习总结 教材学习内容总结 第一周. 通过教材简单的了解了java的历史.因为之前看过视频,所以有一个大致明了的认识. 识记了Java三大平台:J ...
- 数据库,序列化数据为json字符串
create PROCEDURE [dbo].[usp_SerializeJSON] @ParameterSQL as varchar(max) AS BEGIN declare @SQL nvarc ...
- zabbix监控系统性能采集指标
监控项目 详细内容 ...
- Ajax动态切换按钮
function changeAjax(str, obj) { var idx = $(obj).parent().parent().index(); if(confirm('确定执行操作么?')) ...
- TF-IFD算法及python实现关键字提取
TF-IDF算法: TF:词频(Term Frequency),即在分词后,某一个词在文档中出现的频率. IDF:逆文档频率(Inverse Document Frequency).在词频的基础上给每 ...
- Linux网络编程 gethostbyaddr()
C语言函数 概述: 返回对应于给定地址的主机信息. #include <winsock.h> struct hostent FAR *PASCAL FAR gethostbyaddr(co ...