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的子树还是不变的 改变的部分也就是合并的复杂度可以接受 鉴于大部分 ...
随机推荐
- Android APP前后台状态切换
getActivity().getApplication().registerActivityLifecycleCallbacks(new Application.ActivityLifecycleC ...
- 数据多js平均时间取固定条数展示,echarts数据多处理数据
js代码: function getfailurerate(start,end,ip) { $.ajax( { url : "report/getvirtual.action", ...
- 高校表白app用后感
此款app前提是我们自行设计研发的app,其次满足了在校大学生对谈恋爱的需求,可以说是一款简单实用,好操作的软件.下面我根据自己的使用体验简单的介绍一下此软件: (1)首先对于未使用过的用户,你需要在 ...
- CAP 3.0 版本发布通告
前言 大家好,我们很高兴宣布 CAP 发布了 3.0 版本正式版. 自从上次 CAP 2.6 版本发布 以来,已经过去了几个月的时间,关注的朋友可能知道,在这几个月的时间里,也发布了几个预览版的 3. ...
- ObjectArx 使用消息钩子实现鼠标滚轮旋转实体
测试结果: 实现方法:主要是程序注册一个消息函数:func,拦截鼠标滚轮触发的消息,需要注意的是,以写的方式处理实体时需要锁定文档.注册func的主要方法是:BOOL acedRegisterFilt ...
- notpad++使用cmd的快捷键设置
notepad++运行批处理的设置: 运行 --> 输入运行程序名"$(FULL_CURRENT_PATH)" --> 保存(自定义的快捷键即可运行)
- 我们为什么会删除不了集群的 Namespace?
作者 | 声东 阿里云售后技术专家 导读:阿里云售后技术团队的同学,每天都在处理各式各样千奇百怪的线上问题.常见的有网络连接失败.服务器宕机.性能不达标及请求响应慢等.但如果要评选的话,什么问题看起 ...
- linux下压缩包的解压
linux下 最常见的是 .tar.gz 包和.tar.bz2包 .tar.gz格式的压缩包解压命令是: tar -zxvf xx.tar.gz .tar.bz2格式的压缩包 ...
- 条款03:尽可能使用const
目录 1. 总结 2. const对象 3. const函数返回值和函数参数 4. const成员函数 const成员函数的重要性 bitwise constness logical constnes ...
- Scanner使用方法
import java.util.Scanner; //导入包 public void main (String args[]){ Scanner a=new Scanner(System.in); ...