NOI2018湖北省队集训Day4 T2 djq 的朋友圈
题面:
得分情况:
35分枚举全排列暴力。。。
正解:
我们将直接与1相连的点称为a,不与1直接相连而与a直接相连的点称为b。
状压dp[i]表示已选的a,转移时枚举现在要选的a点,计算对答案的影响。(之前已选的点不管怎么排影响都已经计算过了)复杂度为O(2A∗B)O(2A∗B)O(2^A*B)(A,B表示a,b点的个数),能拿到70分。
对于剩下的点,我们选取A,B中较小的来作为状态,如果选到了b点则类似地转移,复杂度为O(2min(A,B)∗max(A,B))O(2min(A,B)∗max(A,B))O(2^{min(A,B)}*max(A,B)),能过掉所有数据。
代码:
#include <bits/stdc++.h>
using namespace std;const int inf=1e5;
int dp[1<<23],map1[50][50],id[50];
long long con[50],dev[50];
int c0,c1,n,m,ans;int main()
{
// freopen("friends.in","r",stdin);
// freopen("friends.out","w",stdout);scanf("%d%d",&n,&m);memset(map1,-1,sizeof(map1));memset(id,-1,sizeof(id));for(int i=1;i<=m;i++){int x,y;scanf("%d%d",&x,&y);scanf("%d",&map1[x-1][y-1]);map1[y-1][x-1]=map1[x-1][y-1];}for(int i=1;i<n;i++) if(map1[0][i]!=-1){id[i]=c0++;ans+=map1[0][i]^1;for(int j=1;j<n;j++){if(map1[0][j]==-1&&map1[i][j]!=-1){if(id[j]==-1) id[j]=c1++;con[id[i]]|=1ll<<id[j];dev[id[i]]|=(long long)(map1[0][i]^map1[i][j]^1)<<id[j];}}}if(c0<=20){for(int i=0;i<(1<<c0);i++) dp[i]=-inf;dp[0]=0;for(int i=0;i<(1<<c0);i++) if(dp[i]>=0){long long cur=0;for(int j=0;j<c0;j++) if((((i)>>(j))&1)==1) cur|=con[j];for(int j=0;j<c0;j++) if((((i)>>(j))&1)==0){int next=i|(1<<j),num=dp[i]+__builtin_popcountll(dev[j]&(~cur));if(dp[next]<num) dp[next]=num;}}ans+=dp[(1<<c0)-1];}else{for(int i=0;i<(1<<c1);i++) dp[i]=-inf;dp[0]=0;for(int i=0;i<(1<<c1);i++) if(dp[i]>=0){for(int j=0;j<c0;j++) if((i|con[j])!=i){int next=(i|con[j]),num=dp[i]+__builtin_popcountll(dev[j]&(~i));if(dp[next]<num) dp[next]=num;}}ans+=dp[(1<<c1)-1];}printf("%d\n",ans);return 0;
}
NOI2018湖北省队集训Day4 T2 djq 的朋友圈相关推荐
- NOI2018湖北省队集训Day4 T1 djq和MZ
题面: 得分情况: 40分,写了纯暴力. 正解: 其实O(nn−−√logn)O(nnlogn)O(n\sqrt{n}\log{n})的做法还挺好想的(然而我在考场上并没有想出来),分块莫队再用线段 ...
- JZOJ 6316. djq的朋友圈(状压DP)
JZOJ 6316. djq的朋友圈 题目 Description Input Output 一个整数表示最多的盟友数. Sample Input Sample 1: 7 8 1 2 0 1 3 0 ...
- FJ省队集训DAY4 T1
直接上题解 1 #include<cstdio> 2 #include<iostream> 3 #include<cmath> 4 #include<cstr ...
- FJ省队集训DAY2 T2
思路:我们可以考虑三角剖分,这样问题就变成考虑三角形的选取概率和三角形内有多少个点了. 先用树状数组预处理出三角剖分的三角形中有多少个点,然后用线段树维护,先用原点极角排序,然后枚举i,再以i极角排序 ...
- 6316. djq的朋友圈
Description Input Output 一个整数表示最多的盟友数. Sample Input Sample 1: 7 8 1 2 0 1 3 0 2 4 0 4 5 0 3 4 1 2 5 ...
- JZOJ 6316. djq的朋友圈
DescriptionDescriptionDescription 有nnn个点,mmm条边,点值是从点1通过边亦或和,求拟定一种加入点的顺序,使得0的点更多 数据范围:n≤42n\leq 42n≤4 ...
- JZOJ 6316.djq的朋友圈【状压】
... 题目: 题意: 分析: 代码: 题目: 传送门 题意: 给出关系表,求一个对比的顺序,使得可能的盟友数最大 分析: 设AAA表示直接与111相连的点集,BBB表示直接与AAA相连但不与111相 ...
- [jzoj 6316] djq的朋友圈 {状态压缩}
题目 解题思路 我们可以把和1号点相邻且是盟友的点归到A集合,与1号点相邻且不是盟友的归到B集合,然后枚举B集合的排列暴力计算. 代码 #include<cstdio> #include& ...
- 【动态规划 状压dp】JZOJ_6316 djq的朋友圈
题意 给出一张图,有若干点之间连边,边权∈{0,1}\in\{0,1\}∈{0,1},对于点1,与它直接连边的点且边权为0,就是盟友,否则是情敌:间接连边,就要按某种顺序同时列出它们的熟人,如果关系相 ...
最新文章
- 文件逆序改为正序脚本
- 四维偏序 CDQ套CDQ
- 前端学习(2556):vue插槽
- 2017.10.25 书柜的尺寸 失败总结
- php pod模式,k8s pod的4种网络模式最佳实战(externalIPs )
- linux resin mysql_【转】Linux下Resin+JSP+MySQL的安装和配置
- [Z]Java Architecture for XML Binding (JAXB)
- tab切换中的滚动条下拉分页带来的问题
- logback.xml日志文件常用配置模板文件详解
- 微信开发-点击链接自己主动加入关注
- Java Web开发的轻便架构Tapestry5---简介
- java 旅游网站项目实现_基于jsp的旅游网站a-JavaEE实现旅游网站a - java项目源码
- vue 百度地图获取经纬度地址
- 如何构建用户评分体系
- 原声JS瀑布流加延迟加载
- Gentler编程简介
- 火狐Firefox浏览器安装使用油猴Tampermonkey插件
- 福利来了,企业信息化应用云服务免费自助开通
- 多所院校发布研究生补录通知!
- JPEGLS图像压缩算法的FPGA实现(一)压缩算法