星空:差分,状压dp
总算不再是能用暴力卡常/随机化水过的好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的更多相关文章
- 【模拟8.11】星空(差分转化,状压DP,最短路)
一道很好的题,综合很多知识点. 首先复习差分: 将原来的每个点a[i]转化为b[i]=a[i]^a[i+1],(如果是求和形式就是b[i]=a[i+1]-a[i]) 我们发现这样的方便在于我 ...
- Codeforces 79D - Password(状压 dp+差分转化)
Codeforces 题目传送门 & 洛谷题目传送门 一个远古场的 *2800,在现在看来大概 *2600 左右罢( 不过我写这篇题解的原因大概是因为这题教会了我一个套路罢( 首先注意到每次翻 ...
- 【bzoj5161】最长上升子序列 状压dp+打表
题目描述 现在有一个长度为n的随机排列,求它的最长上升子序列长度的期望. 为了避免精度误差,你只需要输出答案模998244353的余数. 输入 输入只包含一个正整数n.N<=28 输出 输出只包 ...
- #12【BZOJ3003】LED BFS+状压DP
题解: 看到区间修改先想一下差分 这题用差分是为了分析问题 现在的问题就变成了 原序列全为0,要使得特定的k个点变为1,每个操作改变x,y+1 然后我们会发现 对于二元组a,b我们要修改它,实际上是在 ...
- HDU 4899 Hero meet devil (状压DP, DP预处理)
题意:给你一个基因序列s(只有A,T,C,G四个字符,假设长度为n),问长度为m的基因序列s1中与给定的基因序列LCS是0,1......n的有多少个? 思路:最直接的方法是暴力枚举长度为m的串,然后 ...
- BZOJ 1087: [SCOI2005]互不侵犯King [状压DP]
1087: [SCOI2005]互不侵犯King Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 3336 Solved: 1936[Submit][ ...
- nefu1109 游戏争霸赛(状压dp)
题目链接:http://acm.nefu.edu.cn/JudgeOnline/problemShow.php?problem_id=1109 //我们校赛的一个题,状压dp,还在的人用1表示,被淘汰 ...
- poj3311 TSP经典状压dp(Traveling Saleman Problem)
题目链接:http://poj.org/problem?id=3311 题意:一个人到一些地方送披萨,要求找到一条路径能够遍历每一个城市后返回出发点,并且路径距离最短.最后输出最短距离即可.注意:每一 ...
- [NOIP2016]愤怒的小鸟 D2 T3 状压DP
[NOIP2016]愤怒的小鸟 D2 T3 Description Kiana最近沉迷于一款神奇的游戏无法自拔. 简单来说,这款游戏是在一个平面上进行的. 有一架弹弓位于(0,0)处,每次Kiana可 ...
- 【BZOJ2073】[POI2004]PRZ 状压DP
[BZOJ2073][POI2004]PRZ Description 一只队伍在爬山时碰到了雪崩,他们在逃跑时遇到了一座桥,他们要尽快的过桥. 桥已经很旧了, 所以它不能承受太重的东西. 任何时候队伍 ...
随机推荐
- [转] Julia 高性能动态编程语言入门
本文共 851字,阅读大约需要 3分钟 ! 概 述 Julia 是一个 "全新"的高性能动态编程语言,前两天迎来了其 1.0 正式版的重大更新.Julia集 Python.C.R. ...
- .NET进阶篇-语言章-2-Delegate委托、Event事件
知识只有经过整理才能形成技能 整个章节分布简介请查看第一篇 内容目录 一.概述 二.解析委托知识点 1.委托本质 2.委托的使用 3.委托意义 逻辑解耦,减少重复代码 代码封装支持扩展 匿名方法和La ...
- 02-19 k近邻算法(鸢尾花分类)
[TOC] 更新.更全的<机器学习>的更新网站,更有python.go.数据结构与算法.爬虫.人工智能教学等着你:https://www.cnblogs.com/nickchen121/ ...
- Mint(Linux)系统设置优化及其常用软件安装笔记
LInux /home下中文目录如何修改成英文? 打开终端,在终端中输入命令: export LANG=en_US xdg-user-dirs-gtk-update 跳出对话框询问是否将目录转化为英文 ...
- LAMP环境部署物联网项目
今天来在LAMP环境下搭建一个PHP项目,开始之前,先来普及下物联网常识: 物联网,即Internet of Things,简写IOT.让所有能行使独立功能的普通物体实现互联互通的网络,通过物联网可以 ...
- Focus on the Good 专注于好的方面
[1] Dealing with people is like digging for gold. When you go digging for an ounce of gold, you hav ...
- Oracle 编写存储过程并设置定时执行
Oracle 版本:11g PL/SQL 版本:11.0.3.1770 1.如果编写单个存储过程,则直接在procedure新建并编写:如果需要写多个同类功能的存储过程,为了方便管理,可以现在pack ...
- 像艺术家一样思考 Think Like an Artist
艺术家是如何获得灵感,如何找到自己的独特风格和主题的? 艺术家在绘画.写作.表演或歌唱前不会去征求谁的允许,而是随心而行 要想在数字时代获得满足感,我们需要变得有创造性 1.艺术家富有事业心 艺术家是 ...
- window下 phpstorm 打不开
如果 window 上不能执行 strace 命令, 安装 Git Bash 工具. 切换到 phpstorm 安装的 bin 目录: D 盘的相关文件昨天被我删了!奇怪这文件怎么放到那里了? 换个路 ...
- asp.net core 设置默认文档index.html
参考:https://jingyan.baidu.com/article/6079ad0e3e212168fe86db75.html 在Startup.cs的Configure添加 app.UseFi ...