总算不再是能用暴力卡常/随机化水过的好T3了。

说是打了两个标签,实际上最关键的是题意转化。

如果你丝毫不转化的话也可以:

 #include<bits/stdc++.h>
using namespace std;
int dp[][],b[],k,n,m,x[],f=,mx;
int main(){
scanf("%d%d%d",&n,&k,&m);
for(int i=;i<=k;++i)scanf("%d",&x[i]);
for(int i=;i<=m;++i)scanf("%d",&b[i]),mx=max(mx,b[i]);
if(mx<=){
memset(dp,0x3f,sizeof dp);dp[][]=;const int maxst=(<<mx-)-;
for(int i=;i<=n;++i){
int base=;if(x[f]==i)f++,base=;memset(dp[i&],0x3f,sizeof dp[]);
for(int j=;j<=m;++j)if(i>=b[j])for(int st=;st<=maxst;++st)
dp[i&][st<<^((<<b[j])-)^base]=min(dp[i&][st<<^((<<b[j])-)^base],dp[i&^][st]+(j?:));
}
printf("%d\n",dp[n&][]);return ;
}
if(!k){puts("");return ;}
int bj=;
for(int i=;i<k;++i)if(x[i]+!=x[i+])bj=;
if(!bj)for(int j=;j<=m;++j)if(b[j]==k){puts("");return ;}
srand(time()+clock());printf("%d\n",+rand()%);
}

考场上56分,直接状压最大的操作区间,再加骗分

(本来想上去讲讲的毕竟勉强算是个单题最高分但其实很水)

然而自然骗分并不稳定。考后再测:

考场上rp生效了!

这个暴力可以稍微讲一讲:

我们先观察数据范围可以发现k超级小但那是全部测试点是正解的事与我无瓜并不会用

其次m也不大但理由同上。

但是那个bi在某些测试点里小,也有些特别大。

和《奇怪的道路》有点莫名其妙的像?状压它!

只不过是把单点的操作换成了区间,其余真的没有什么区别。

时间复杂度O(nm2max(bi))。我不像题解一样只压了4而是尝试压了一下16。T了不要想了。

考场上还剩那么几分钟,干啥?骗分啊!

答案小于4。挺好。只有0123。

0好说啊,所有灯都亮着就是0啊。

1也好说啊,没亮的灯连成一片了而且操作里有能刚好这么长的就是1啊。

2得搜索吧,懒得打。rand一下。

效果不错。

好了好了废话太多说正解。

首先我们的操作是一次一个区间,暴力扫肯定T。区间异或怎么搞?

其实异或运算和加法在很多方面上有互通之处,如果是加法,你会怎么做?

差分啊!然后你就可以惊奇地发现异或的确也可以差分。

那么刚开始对于一个全亮的串,几个不亮的灯就是单点异或。也放进差分数组里处理。

每一个操作就是对于l~r区间异或。其实就是对于相隔距离一定的两个点同时异或一下。

我们的最终目标是得到一个全0串,差分数组全0就表示原区间全0,也就是灯都亮了。

我们继续考虑每一步操作,每次异或两个位置,如果它们都是0你异或完就都是1,和要消除1的目标不符且并不会i作出正贡献。

所以你只会同时选两个1或一个1一个0。前者会使两个1都消失。后者会让两者交换位置。

那么既然你想让它们都消失,就是不断改变1的位置最后让它们两两撞在一起消失掉。

而它每次会移动多少,就是向左右移动它给定的bi位啊。

跑bfs,找出所有1的单源最短路。(不建议打dijkstra或SPFA,常数大,而且就是说明你不理解这个bfs)

因为这个bfs每次走都是一次操作,相当于边权是1,队列里自带单调递增。

不要把边建出来,某牛T了。

然后我们就找出了每一对数字1对撞需要几次操作。

接下来状压它,不断枚举你要让哪两个1对消更新状态即可。

 #include<bits/stdc++.h>
using namespace std;
int n,m,k,b[],x[],y[],cnt,dt[],cost[][],q[],t,dp[];
int main(){y[]=-;
scanf("%d%d%d",&n,&k,&m);
for(int i=;i<=k;++i)scanf("%d",&y[i]);
for(int i=;i<=m;++i)scanf("%d",&b[i]);
for(int i=;i<=k;++i){
if(y[i]+!=y[i+])x[++cnt]=y[i];
if(y[i]-!=y[i-])x[++cnt]=y[i]-;
}
memset(cost,0x3f,sizeof cost);
for(int i=;i<=cnt;++i){
memset(dt,0x3f,sizeof dt);dt[q[t=]=x[i]]=;
for(int h=;h<=t;++h)for(int j=;j<=m;++j){
if(q[h]+b[j]<=n&&dt[q[h]+b[j]]==0x3f3f3f3f)dt[q[++t]=q[h]+b[j]]=dt[q[h]]+;
if(q[h]-b[j]>=&&dt[q[h]-b[j]]==0x3f3f3f3f)dt[q[++t]=q[h]-b[j]]=dt[q[h]]+;
}
for(int j=i+;j<=cnt;++j)cost[i][j]=cost[j][i]=dt[x[j]];
}
memset(dp,0x3f,sizeof dp);dp[]=;
for(int s=;s<<<cnt;++s)for(int i=;i<=cnt;++i)if(!(s&<<i-)){
for(int j=;j<=cnt;++j)if(!(s&<<j-))
dp[s|<<i-|<<j-]=min(dp[s|<<i-|<<j-],dp[s]+cost[i][j]);
break;
}
printf("%d\n",dp[(<<cnt)-]);
}

没上Kb。1008B

星空:差分,状压dp的更多相关文章

  1. 【模拟8.11】星空(差分转化,状压DP,最短路)

    一道很好的题,综合很多知识点. 首先复习差分:      将原来的每个点a[i]转化为b[i]=a[i]^a[i+1],(如果是求和形式就是b[i]=a[i+1]-a[i]) 我们发现这样的方便在于我 ...

  2. Codeforces 79D - Password(状压 dp+差分转化)

    Codeforces 题目传送门 & 洛谷题目传送门 一个远古场的 *2800,在现在看来大概 *2600 左右罢( 不过我写这篇题解的原因大概是因为这题教会了我一个套路罢( 首先注意到每次翻 ...

  3. 【bzoj5161】最长上升子序列 状压dp+打表

    题目描述 现在有一个长度为n的随机排列,求它的最长上升子序列长度的期望. 为了避免精度误差,你只需要输出答案模998244353的余数. 输入 输入只包含一个正整数n.N<=28 输出 输出只包 ...

  4. #12【BZOJ3003】LED BFS+状压DP

    题解: 看到区间修改先想一下差分 这题用差分是为了分析问题 现在的问题就变成了 原序列全为0,要使得特定的k个点变为1,每个操作改变x,y+1 然后我们会发现 对于二元组a,b我们要修改它,实际上是在 ...

  5. HDU 4899 Hero meet devil (状压DP, DP预处理)

    题意:给你一个基因序列s(只有A,T,C,G四个字符,假设长度为n),问长度为m的基因序列s1中与给定的基因序列LCS是0,1......n的有多少个? 思路:最直接的方法是暴力枚举长度为m的串,然后 ...

  6. BZOJ 1087: [SCOI2005]互不侵犯King [状压DP]

    1087: [SCOI2005]互不侵犯King Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 3336  Solved: 1936[Submit][ ...

  7. nefu1109 游戏争霸赛(状压dp)

    题目链接:http://acm.nefu.edu.cn/JudgeOnline/problemShow.php?problem_id=1109 //我们校赛的一个题,状压dp,还在的人用1表示,被淘汰 ...

  8. poj3311 TSP经典状压dp(Traveling Saleman Problem)

    题目链接:http://poj.org/problem?id=3311 题意:一个人到一些地方送披萨,要求找到一条路径能够遍历每一个城市后返回出发点,并且路径距离最短.最后输出最短距离即可.注意:每一 ...

  9. [NOIP2016]愤怒的小鸟 D2 T3 状压DP

    [NOIP2016]愤怒的小鸟 D2 T3 Description Kiana最近沉迷于一款神奇的游戏无法自拔. 简单来说,这款游戏是在一个平面上进行的. 有一架弹弓位于(0,0)处,每次Kiana可 ...

  10. 【BZOJ2073】[POI2004]PRZ 状压DP

    [BZOJ2073][POI2004]PRZ Description 一只队伍在爬山时碰到了雪崩,他们在逃跑时遇到了一座桥,他们要尽快的过桥. 桥已经很旧了, 所以它不能承受太重的东西. 任何时候队伍 ...

随机推荐

  1. 快学Scala 第十六课 (shell调用,正则表达式,正则表达式组,stripMargin妙用)

    shell调用:(管道符前加#号,执行shell用!) import sys.process._ "ls -al" #| "grep x" ! 正则表达式:(r ...

  2. MongoDB 学习笔记之 MongoDB导入导出

    MongoDB数据导入导出: mongoexport: -host 机器 -port 端口 -u 用户名 -p 密码 -d 库名 -c 表名 -f 列名 -o 导出的文件名 -q 查询条件 --csv ...

  3. python requests自动化框架

    一.项目结构 1.新建一个工程(一定要创建工程),工程名称自己定义,如:yoyo_jiekou 2.在工程的跟目录新建一个脚本:run_main.py,用来执行全部用例 3.在工程下创建以下几个pak ...

  4. Java自动化测试框架-03 - TestNG之Test Group篇 - 我们一起组团打怪升级(详细教程)

    简介 其实这篇文章的group宏哥在上一篇中就提到过,但是就是举例一笔带过的,因此今天专门有一篇文章来讲解Group的相关知识.希望大家茅塞顿开 ,有着更进一步认识和了解测试组. 一.Test Gro ...

  5. php 安装vld扩展

    下载地址 : http://pecl.php.net/package/vld 此处包是 : vld-0.14.0.tgz 1. tar -xvf  vld-0.14.0.tgz  -C  INSTAL ...

  6. RequireJS 插件

    网址:http://www.requirejs.cn/docs/api.html#i18n RequireJS的插件: Text:自动加载一些非js的文本文件. domReady:确保在Dom Rea ...

  7. 生成函数(TBC)

    生成函数 生成函数 (Generating Function) 的应用简单来说在于研究未知(通项)数列规律,用这种方法在给出递推式的情况下求出数列的通项. 对于一个数列 aaa,称f(x)=∑i=0n ...

  8. Vue路由守卫(跳转页面置顶的处理方)

    在用Vue 框架开发时,在电脑调试没有任何问题,但是用手机调试时会发现页面跳转的不对.就是跳转时页面展示的滑动位置不对,会保留上次跳转页面时的跳转位置.因此需要对页面的路由跳转进行优化,需要用到Vue ...

  9. spark cdh5编译安装[spark-1.0.2 hadoop2.3.0 cdh5.1.0]

    前提你得安装有Hadoop 我的版本hadoop2.3-cdh5.1.0 1.下载maven包 2.配置M2_HOME环境变量,配置maven 的bin目录到path路径 3.export MAVEN ...

  10. CodeForces - 1214D B2. Books Exchange (hard version)

    题目链接:http://codeforces.com/problemset/problem/1249/B2 思路:用并查集模拟链表,把关系串联起来,如果成环,则满足题意.之后再用并查集合并一个链,一个 ...