[NOIP10.4模拟赛]2.y题解--折半搜索+状压计数
题目链接:
咕
闲扯:
这题暴力分似乎挺多,但是一些奇奇怪怪的细节没注意RE了,还是太菜了
分析:
首先我们考虑最naiive的状压DP ,\(f[u][v][state]\)表示u开头,v结尾是否存在一条表示为state的路径,这个好转移不讲了,但是由于d的范围时间复杂度过大,于是考虑折半搜索
我们把一条最终路径的路径分成两部分\(p=(d+1)/2\)(其实就是上取整),\(q=d-p\),显然\(p>=q\)
于是我们可以把一条路径长度看成两部分,一条从1开始,长度为p的路径,另一条以某点为开头,长度为q,终点恰好与第一条路径接上.
然后这时候我们就用\(ff[state][x]\)表示是否存在一条以x为开头,表示为state的路径,这个DP数组怎么得到呢?
我们枚举起点\(st\),再用一个数组\(f[state][x]\)表示是否存在一条st开头,x结尾,状态为state的路径,这个非常好转移我们从小到达枚举状态再根据两点之间是否连边转移
于是如果\(f[state]\)中存在一个值为1的元素,那么\(ff[state][st]=1\)
由于是折半路径,我们只需要将路径状态压为一个p位二进制数就好了
注意最后路径是从1开始,我们方便起见倒着枚举起点,最后枚举长度为p的前一半状态,和长度为q的后一半状态,如果存在一点v,\(ff[state_1][v]\)&\(f[state_2][v]==1\),那么方案数加1
同时预防前导0还需要特殊处理
还发现DP数组都是0/1序列,使用bitset减少操作时间复杂度
代码:
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <algorithm>
#include <cctype>
#include <iostream>
#include <bitset>
#define ll long long
#define ri register int
using std::min;
using std::bitset;
using std::max;
template <class T>inline void read(T &x){
x=0;int ne=0;char c;
while(!isdigit(c=getchar()))ne=c=='-';
x=c-48;
while(isdigit(c=getchar()))x=(x<<3)+(x<<1)+c-48;
x=ne?-x:x;return ;
}
const int maxn=95;
const int inf=0x7fffffff;
const int N=1<<20-1;
bitset <maxn> g0[maxn],g1[maxn],f[N],ff[N];
int p,q;
inline void clear(){
for(ri i=0;i<N;i++)f[i].reset();
return ;
}
ll ans=0;
int n,m,d;
int main(){
int x,y,z;
#ifdef Luogu
freopen("y2.in","r",stdin);
freopen("y2.out","w",stdout);
#endif
read(n),read(m),read(d);
int p=(d+1)/2,q=d-p;
int o=1<<p,oo=1<<q;
for(ri i=1;i<=m;i++){
read(x),read(y),read(z);
if(z==1)g1[x][y]=g1[y][x]=1;
else g0[x][y]=g0[y][x]=1;
}
for(ri now=n;now>=1;now--){
clear();
f[1][now]=1;//避免前导0
for(ri i=1;i<o;i++){
for(ri j=1;j<=n;j++){
if(f[i][j]){//now循环中,f[state][v]表示now开头,v结尾状态为state的路径是否存在
f[i<<1]|=g0[j],f[i<<1|1]|=g1[j];
}
}
}//ff[state][u]表示从u开头,是否能走出一条状态为state的路径
for(ri i=0;i<o;i++)ff[i][now]=f[o|i].any();
}
for(ri i=0;i<o;i++){
for(ri j=0;j<oo;j++){
if((ff[i]&f[oo|j]).any())ans++;
}
//若存在点x f[state_1][x]=1并且ff[state_2][x]=1
//说明从x开头能走出一条state_2的路径
//从1开头,x结尾,又能走出一条state_1的路径,这样就能连起来成为一条合法的路径
}
printf("%lld\n",ans);
return 0;
}
[NOIP10.4模拟赛]2.y题解--折半搜索+状压计数的更多相关文章
- [NOIP10.6模拟赛]2.equation题解--DFS序+线段树
题目链接: 咕 闲扯: 终于在集训中敲出正解(虽然与正解不完全相同),开心QAQ 首先比较巧,这题是\(Ebola\)出的一场模拟赛的一道题的树上强化版,当时还口胡出了那题的题解 然而考场上只得了86 ...
- 20190716NOIP模拟赛T1 礼物(概率dp+状压)
题目描述 夏川的生日就要到了.作为夏川形式上的男朋友,季堂打算给夏川买一些生 日礼物. 商店里一共有种礼物.夏川每得到一种礼物,就会获得相应喜悦值Wi(每种 礼物的喜悦值不能重复获得). 每次,店员会 ...
- [NOIP10.4模拟赛]3.z题解--思维
题目链接: 咕咕 闲扯: 哈哈这道T3考场上又敲了5个namespace,300+行,有了前车之鉴还对拍过,本以为子任务分稳了 结果只有30分哈哈,明明用极限数据对拍过不知怎么回事最后数据又是读不全, ...
- [NOIP10.3模拟赛]3.w题解--神奇树形DP
题目链接: 咕 闲扯: 这题考场上把子任务都敲满了,5个namespace,400行11k 结果爆0了哈哈,因为写了个假快读只能读入一位数,所以手测数据都过了,交上去全TLE了 把边分成三类:0. 需 ...
- [NOIP10.5模拟赛]3.c题解--思维
题目链接 这次不咕了 https://www.luogu.org/problemnew/show/AT2389 闲扯 考场20分爆搜走人 \cy 话说这几天T3都很考验思维啊 分析 我们先钦定一只鸡( ...
- [NOIP10.6模拟赛]1.merchant题解--思维+二分
题目链接: while(1)gugu(while(1)) 闲扯 考场上怕T2正解写挂其他两题没管只打了暴力,晚上发现这题思维挺妙的 同时想吐槽出题人似乎热衷卡常...我的巨大常数现在显露无疑QAQ 分 ...
- [NOIP10.5模拟赛]1.a题解--离散化+异或线段树
题目链接: 咕咕咕 https://www.luogu.org/problemnew/show/CF817F 闲扯 在Yali经历几天折磨后信心摧残,T1数据结构裸题考场上连暴力都TM没打满 分析 观 ...
- contesthunter暑假NOIP模拟赛第一场题解
contesthunter暑假NOIP模拟赛#1题解: 第一题:杯具大派送 水题.枚举A,B的公约数即可. #include <algorithm> #include <cmath& ...
- NOIP2017 宝藏 题解报告【状压dp】
题目描述 参与考古挖掘的小明得到了一份藏宝图,藏宝图上标出了 n 个深埋在地下的宝藏屋, 也给出了这 n 个宝藏屋之间可供开发的 m 条道路和它们的长度. 小明决心亲自前往挖掘所有宝藏屋中的宝藏.但是 ...
随机推荐
- git 优雅的撤销中间某次提交
环境git : 2+ 前言最近两天,公司的git合并代码时,出现了严重的问题,浪费很多时间: 现在记录下: 情况是这样的,一个同事自己的本地分支(远程没有),不知怎么的,有了别人开发分支的代码,而他自 ...
- Python将多个excel表格合并为一个表格
Python将多个excel表格合并为一个表格 生活中经常会碰到多个excel表格汇总成一个表格的情况,比如你发放了一份表格让班级所有同学填写,而你负责将大家的结果合并成一个.诸如此类的问题有很多.除 ...
- Java操作excel_导出与读取(导入)
我自己的jar包下载 一.介绍 常常有客户这样子要求:你要把我们的报表直接用Excel打开(电信系统.银行系统).或者是:我们已经习惯用Excel打印.这样在我们实际的开发中,很多时候需要实现导入.导 ...
- Flutter 状态管理 flutter_Provide
项目的商品类别页面将大量的出现类和类中间的状态变化,这就需要状态管理.现在Flutter的状态管理方案很多,redux.bloc.state.Provide. Scoped Model : 最早的状态 ...
- C语言tips_2 关于scanf 读取规则小结以及与getchar 的区别
第一点:scanf默认回车和空格是输入不同组之间的间隔和结束符号. 也就是说他不会读取 空格 和 换行符.而是把他们当作一个 数据被读取完成的标志!他的停止标志则为,当%d之类的数据输入结束之后,自动 ...
- 配置zabbix监控windows,cmd运行报错cannot connect to Service Manager: [0x00000005]
错误原因: cmd运行没有管理员权限 解决: 找到cmd.exe的位置C:\Windows\System32,选中--右键--使用管理员身份运行 再通过cmd进入到zabbix_agentd文件夹进行 ...
- power bi可视化--乘用车案例
- twig 模板控制器对应列表
{{ render(controller(metas.header,{request:app.request, course: course, member: member|default(null) ...
- spring的控制器如何跳转到指定的视图
1.控制器代码 2.跳转代码 return "greeting"; 引号内为跳转的页面,默认不需要加html
- 39.创建多进程及进程通讯 -- Queue--Pipe--Event
创建多进程 windows:进程.线程 linux:进程.线程(做了进程通信的多进程实现的线程) 进程之间内存彼此独立,不管是父子进程还是单个独立进程 multiprocessing:Process ...