19_07_07校内训练[xor]
题意
长度为n的数组,上面有k个位置是1,现在有l种长度的连续全1串,要求用最少的次数将这个数组异或成全0的数组。n<=1E5,k<=10,l<=100。
思考
先将数组进行异或的差分。可以发现,现在异或上全1串只是将两个端点进行异或。
接下来求出将每对1变成0的最小代价,之后就是简单状压。
复杂度O(nkl+2^(2k))。
代码
#include<bits/stdc++.h>
using namespace std;
const int maxn=2E5+;
const int inf=;
int n,k,l;
int a[maxn],b[maxn],len[maxn],where[maxn],tot;
int dis[][];
int f[maxn],ans[(<<)+];
bool vis[maxn];
void bfs(int S,int num)
{
memset(vis,,sizeof(vis));
queue<int>Q;
Q.push(S);
vis[S]=;
for(int i=;i<=n;++i)
f[i]=inf;
f[S]=;
while(!Q.empty())
{
int u=Q.front();
Q.pop();
for(int i=;i<=l;++i)
{
int v=u+len[i],nw=f[u]+;
if(v>n)
continue;
if(nw<f[v])
{
f[v]=nw;
if(!vis[v])
Q.push(v),vis[v]=;
}
}
for(int i=;i<=l;++i)
{
int v=u-len[i],nw=f[u]+;
if(v<)
continue;
if(nw<f[v])
{
f[v]=nw;
if(!vis[v])
Q.push(v),vis[v]=;
}
}
}
for(int i=;i<=tot;++i)
dis[num][i]=f[where[i]];
}
int main()
{
scanf("%d%d%d",&n,&k,&l);
for(int i=;i<=k;++i)
{
int x;
scanf("%d",&x);
a[x]=;
}
++n;
for(int i=;i<=l;++i)
scanf("%d",&len[i]);
for(int i=;i<=n;++i)
{
b[i]=a[i]^a[i-];
if(b[i])
where[++tot]=i;
}
for(int i=;i<=tot;++i)
bfs(where[i],i);
for(int S=;S<(<<tot);++S)
ans[S]=inf;
ans[]=;
for(int S=;S<(<<tot);++S)
{
for(int i=;i<tot;++i)
{
for(int j=i+;j<tot;++j)
{
if((S&(<<i))||(S&(<<j)))
continue;
int nS=S|(<<i)|(<<j);
int nw=ans[S]+dis[i+][j+];
ans[nS]=min(ans[nS],nw);
}
}
}
if(ans[(<<tot)-]==inf)
printf("-1\n");
else
printf("%d\n",ans[(<<tot)-]);
return ;
}
19_07_07校内训练[xor]的更多相关文章
- [4.14校内训练赛by hzwer]
来自FallDream的博客,未经允许,请勿转载,谢谢. hzwer又出丧题虐人 4道noi.... 很奇怪 每次黄学长出题总有一题我做过了. 嗯题目你们自己看看呗 好难解释 ----- ...
- [2017.4.7校内训练赛by hzwer]
来自FallDream的博客,未经允许,请勿转载,谢谢. 报警啦.......hzwer又出丧题虐人啦..... 4道ctsc...有一道前几天做过了,一道傻逼哈希还wa了十几次,勉强过了3题..我好 ...
- [3.24校内训练赛by hzwer]
来自FallDream的博客,未经允许,请勿转载,谢谢. ----------------------------------------------------------------------- ...
- 19_04_19校内训练[Game]
题意 给出n,等概率地生成一个1~n的数列.现在有n个人从左到右站成一排,每个人拿有当前数列位置上的数字,并且一开始都不知道数字是多少(但知道n是多少).从左到右让每个人进行如下选择: 1.选择保留自 ...
- 19_04_02校内训练[deadline]
题意 给出一个二分图,左边为A集合,右边为B集合,要求把A集合中每一个点染为黑白两色中的一种,B集合中的颜色已定.染色后对于原本相邻且颜色相同的点,建立新的二分图,即得到了两个新的二分图,它们是独立的 ...
- 平面图转对偶图&19_03_21校内训练 [Everfeel]
对于每个平面图,都有唯一一个对偶图与之对应.若G‘是平面图G的对偶图,则满足: G'中每一条边的两个节点对应着G中有公共边的面,包括最外部无限大的面. 直观地讲,红色标出来的图就是蓝色标出的图的对偶图 ...
- fzyzojP3979 -- [校内训练20180914]魔法方阵
原题见CF632F https://blog.csdn.net/Steaunk/article/details/80217764 这个比较神仙了 点边转化, 把max硬生生转化成了路径最大值,再考虑所 ...
- fzyzojP3580 -- [校内训练-互测20180315]小基的高智商测试
题目还有一个条件是,x>y的y只会出现一次(每个数直接大于它的只有一个) n<=5000 是[HNOI2015]实验比较 的加强版 g(i,j,k)其实可以递推:g(i,j,k)=g(i- ...
- fzyzojP3372 -- [校内训练20171124]博弈问题
对于每个点都要答案 还是异或 trie树合并石锤了 朴素枚举是O(n^2*17)的 怎么办呢? 我们发现合并的时候,一些部分的trie的子树还是不变的 改变的部分也就是合并的复杂度可以接受 鉴于大部分 ...
随机推荐
- 从物联网设备生命周期理解Apple Homekit框架
本次笔记主要基于苹果公开的HomeKit Accessory Protocol协议文档和IOS Security Guide中相关部分. 总体来讲,设备与App之间采用端到端的加密,密钥由设备和App ...
- Team Foundation Server 2015使用教程【1】:团队项目创建
- JLINK、ULINK和STlink仿真器详解
JLink仿真器 德国SEGGER公司推出基于JTAG的仿真器.简单地说,是给一个JTAG协议转换盒,即一个小型USB到JTAG的转换盒,其连接到计算机用的是USB接口,而到目标板内部用的还是jtag ...
- JNDI数据源的使用
有时候我们数据库的连接会使用jndi的方式 try { InitialContext ic = new InitialContext(); dataSource = (DataSource) ic.l ...
- NoSQL入门)(详细)
NoSQL入门 (原创:黑小子-余) 1.NoSQL是什么 NoSql(NoSQL=Not Only SQL),意即“不仅仅是SQL”,泛指菲关系型数据库.传统的关系数据库在应付web2.0网站,特别 ...
- 支撑百万级并发,Netty如何实现高性能内存管理
Netty作为一款高性能网络应用程序框架,实现了一套高性能内存管理机制 通过学习其中的实现原理.算法.并发设计,有利于我们写出更优雅.更高性能的代码:当使用Netty时碰到内存方面的问题时,也可以更高 ...
- jquery简单实现复选框的全选与反选
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...
- 我的 2019 年 Python 文章榜单
现在是 2020 年的第一天,我相信从昨天开始,各位的信息流里肯定充斥了各式各样的年度盘点/回顾/总结/记录之类的内容.虽然来得稍晚了,但我还是想给诸位送上这一篇文章. 我将在本文中列出自己于 201 ...
- $hncpc2019E\ Numbers$ 搜索
正解:搜索 解题报告: 传送门$QAQ$ 考虑直接搜所有长度为1的数的位置?然后其他就能确定了嘛$QwQ$ 设每个数的出现次数为$a_i$,状态数为$\prod_{i=0}^9(a_i+1) \le ...
- CF1272D. Remove One Element 题解 动态规划
题目链接:http://codeforces.com/contest/1272/problem/D 题目大意: 给你一个长度为 \(n\) 的数组,你最多删除一个元素(也可以不删),求此条件限制下的最 ...