题目背景

$\frac{1}{4}$遇到了一道水题,叕完全不会做,于是去请教小$D$。小$D$懒得理$\frac{1}{4}$,直接就离开了。于是,$\frac{1}{4}$只好来问你,这道题是这样的:


题目描述

给定一个无向图,$n$个点(从$1$开始编号)、$m$条边(长度为$1$),每条边有一个权值$c(c\in\{0,1\})$。
一条路径,可以表示为一个长度为经过边数的$01$串,串的第$i$位为经过的第$i$条边的权值。
两条路径相同,当且仅当表示其的$01$串相同。
求从$1$号点出发、长度为$d$的路径种数。


输入格式

从文件$y.in$中读入数据。
第一行,三个整数,$n,m,d$。
接下来$m$行,每行三个整数$u,v,c$,代表一条边连接$u$和$v$,权值为$c$。


输出格式

输出到文件$y.out$中。
输出一行,一个整数,代表答案。


样例

样例输入:

3 2 3
1 2 0
1 3 1

样例输出:

4


数据范围与提示

样例解释:

$1\rightarrow 2\rightarrow 1\rightarrow 2\Rightarrow 000$
$1\rightarrow 2\rightarrow 1\rightarrow 3\Rightarrow 001$
$1\rightarrow 3\rightarrow 1\rightarrow 2\Rightarrow 110$
$1\rightarrow 3\rightarrow 1\rightarrow 3\Rightarrow 111$

数据范围:

保证$n\in [1,90],m\in [0,n\times (n−1)],d\in [1,20],u,v\in [1,n],c\in\{0,1\}$。


题解

考虑$DP$,设$dp[i][j][stack]$表示从$i$到$j$是否有一条状态为$stack$的连边。

那么显然时间复杂度是:$\Theta(s^d\times n\times (n+m))$的。

考虑第一个优化,使用$bitset$,我们能够优化掉$j$那一维。

但是时间复杂度还是不够,于是我们考虑$meet\ in\ the\ middle$算法,只算前一半即可。

时间复杂度:$\Theta(2^{\frac{d}{2}}\times n\times (n+m)+2^d\times n)$。

期望得分:$100$分。

实际得分:$100$分。


代码时刻

#include<bits/stdc++.h>
using namespace std;
int n,m,d;
bitset<90> bit[4][1100000];
long long ans;
int main()
{
scanf("%d%d%d",&n,&m,&d);
for(int i=1;i<=m;i++)
{
int u,v,c;
scanf("%d%d%d",&u,&v,&c);
if(c)bit[1][u][v]=bit[1][v][u]=1;
else bit[0][u][v]=bit[0][v][u]=1;
}
int dis=(d+1)>>1;
for(int i=n;i;i--)
{
for(int j=0;j<(1<<d);j++)bit[2][j].reset();
bit[2][1][i]=1;
for(int j=1;j<(1<<dis);j++)
for(int k=1;k<=n;k++)
{
if(!bit[2][j][k])continue;
bit[2][j<<1]|=bit[0][k];
bit[2][j<<1|1]|=bit[1][k];
}
for(int j=0;j<(1<<dis);j++)
bit[3][j][i]=bit[2][(1<<dis)|j].count()?1:0;
}
for(int i=0;i<(1<<dis);i++)
for(int j=0;j<(1<<(d-dis));j++)
if(((bit[3][i]&bit[2][(1<<(d-dis))|j]).count()))ans++;
printf("%lld",ans);
return 0;
}

rp++

[CSP-S模拟测试]:y(DP+bitset)的更多相关文章

  1. [20190727NOIP模拟测试9]单(single) 题解(树上dp)

    啊啊啊啊啊啊啊啊考场上差一点就A掉了5555 千里之堤溃于蚁穴……鬼知道最后一步那么显然的柿子我为什么没考虑用上…… 观察数据范围可知,出题人期望我们想出一个$O(n)$的做法 当然也有可能是$O(n ...

  2. [CSP-S模拟测试]:赤(red)(WQS二分+DP)

    题目传送门(内部题38) 输入格式 每个输入文件包含多组测试数据.选手应当处理到文件结束($EOF$) 每一组数据包括$3$行. 第$1$行包含三个正整数$n,a,b$,表示有$n$只猫,$gyz$有 ...

  3. [考试反思]1109csp-s模拟测试106:撞词

    (撞哈希了用了模拟测试28的词,所以这次就叫撞词吧) 蓝色的0... 蓝色的0... 都该联赛了还能CE呢... 考试结束前15分钟左右,期望得分300 然后对拍发现T2伪了写了一个能拿90分的垃圾随 ...

  4. [考试反思]1003csp-s模拟测试58:沉淀

    稳住阵脚. 还可以. 至少想拿到的分都拿到了,最后一题的确因为不会按秩合并和线段树分治而想不出来. 对拍了,暴力都拍了.挺稳的. 但是其实也有波折,险些被卡内存. 如果内存使用不连续或申请的内存全部使 ...

  5. 2019.8.14 NOIP模拟测试21 反思总结

    模拟测试20的还没改完先咕着 各种细节问题=错失190pts T1大约三分钟搞出了式子,迅速码完,T2写了一半的时候怕最后被卡评测滚去交了,然后右端点没有初始化为n…但是这样还有80pts,而我后来还 ...

  6. 2019.8.9 NOIP模拟测试15 反思总结

    日常爆炸,考得一次比一次差XD 可能还是被身体拖慢了学习的进度吧,虽然按理来说没有影响.大家听的我也听过,大家学的我也没有缺勤多少次. 那么果然还是能力问题吗……? 虽然不愿意承认,但显然就是这样.对 ...

  7. 2019.8.1 NOIP模拟测试11 反思总结

    延迟了一天来补一个反思总结 急匆匆赶回来考试,我们这边大家的状态都稍微有一点差,不过最后的成绩总体来看好像还不错XD 其实这次拿分的大都是暴力[?],除了某些专注于某道题的人以及远程爆踩我们的某学车神 ...

  8. HDU5716, HDU5745【dp+bitset】

    DP+bitset  HDU5716 dp[i][j] = dp[i-1][j-1] && (s[i] in set[j]); 第二维压bitset #include <bits ...

  9. 转 C#实现PID控制的模拟测试和曲线绘图

    C#实现PID控制的模拟测试和曲线绘图   本文分两部分,一部分是讲PID算法的实现,另一部分是讲如何用动态的曲线绘制出PID运算的结果. 首先,PID算法的理论模型请参考自动控制理论,最早出现的是模 ...

随机推荐

  1. VS2012生成Web时报未能找到元数据文件xxx.dll

    问题:引用里已经添加了,还是报‘未能找到元数据文件xxx.dll’ 解决:添加了相同的不同路径的xxx.dll文件,删掉一个用不到的,就不报错了

  2. Java8 Nashorn JavaScript引擎

    使用Java8,Nashorn大大提高了JavaScript 引擎引入,以取代现有的Nashorn Java脚本引擎.Nashorn提供2至10倍更好的性能,因为它直接编译代码在存储器,并传递到字节码 ...

  3. eclipse或者myeclipse的代码提示功能

    第一步:打开eclipse,在菜单栏选择window-->preferences 第二步:在左边tree菜单栏选择General-->keys 第三步:在右边的文本框中输入content, ...

  4. 《JAVA设计模式》之抽象工厂模式(Abstract Factory)

    场景问题 举个生活中常见的例子——组装电脑,我们在组装电脑的时候,通常需要选择一系列的配件,比如CPU.硬盘.内存.主板.电源.机箱等.为讨论使用简单点,只考虑选择CPU和主板的问题. 事实上,在选择 ...

  5. fastJson + lombok + 属性名命名 踩坑点

    JavaBean属性名要求:前两个字母要么都大写,要么都小写 package com.jdyh.worker.project.controller; import com.alibaba.fastjs ...

  6. #3831 TJOI2013单词

    WOJ#3831 TJOI2013单词 题面 某人读论文,一篇论文是由许多单词组成.但他发现一个单词会在论文中出现很多次,现在想知道每个单词分别在论文中出现多少次. 输入 第一个一个整数 N ,表示有 ...

  7. nginx配置多个server,搭建多个站点

    今天域名备案终于成功了,赶紧进行了域名的绑定,在配置vhosts的时候发现了一个default_server 字段,对于这个字段之前没有接触过,后来查了一下,其实是这样的 当用户在浏览器中输入相关域名 ...

  8. tomcat安装分享

    安装Tomcat前需要安装JDK 安装的jdk1.8   解压   在vim /etc/profile下面添加以下内容 export JAVA_HOME=/jdk/jdk1.8.0_111export ...

  9. matplot绘图无法显示中文的问题

    手动添加: from pylab import * mpl.rcParams['font.sans-serif'] = ['SimHei'] #指定默认字体 mpl.rcParams['axes.un ...

  10. 不在同一个解决方案下的exe去调试dll,采用附加到进程:

    先把dll的项目生成一下,把得到的pdb,dll文件复制到exe目录下,然后直接双击运行exe(不是通过vs启动),再接着在dll的项目中”调试”->”附加到进程”,选择刚才运行的exe. 注意 ...