题意

长度为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]的更多相关文章

  1. [4.14校内训练赛by hzwer]

    来自FallDream的博客,未经允许,请勿转载,谢谢. hzwer又出丧题虐人 4道noi....        很奇怪 每次黄学长出题总有一题我做过了. 嗯题目你们自己看看呗 好难解释 ----- ...

  2. [2017.4.7校内训练赛by hzwer]

    来自FallDream的博客,未经允许,请勿转载,谢谢. 报警啦.......hzwer又出丧题虐人啦..... 4道ctsc...有一道前几天做过了,一道傻逼哈希还wa了十几次,勉强过了3题..我好 ...

  3. [3.24校内训练赛by hzwer]

    来自FallDream的博客,未经允许,请勿转载,谢谢. ----------------------------------------------------------------------- ...

  4. 19_04_19校内训练[Game]

    题意 给出n,等概率地生成一个1~n的数列.现在有n个人从左到右站成一排,每个人拿有当前数列位置上的数字,并且一开始都不知道数字是多少(但知道n是多少).从左到右让每个人进行如下选择: 1.选择保留自 ...

  5. 19_04_02校内训练[deadline]

    题意 给出一个二分图,左边为A集合,右边为B集合,要求把A集合中每一个点染为黑白两色中的一种,B集合中的颜色已定.染色后对于原本相邻且颜色相同的点,建立新的二分图,即得到了两个新的二分图,它们是独立的 ...

  6. 平面图转对偶图&19_03_21校内训练 [Everfeel]

    对于每个平面图,都有唯一一个对偶图与之对应.若G‘是平面图G的对偶图,则满足: G'中每一条边的两个节点对应着G中有公共边的面,包括最外部无限大的面. 直观地讲,红色标出来的图就是蓝色标出的图的对偶图 ...

  7. fzyzojP3979 -- [校内训练20180914]魔法方阵

    原题见CF632F https://blog.csdn.net/Steaunk/article/details/80217764 这个比较神仙了 点边转化, 把max硬生生转化成了路径最大值,再考虑所 ...

  8. fzyzojP3580 -- [校内训练-互测20180315]小基的高智商测试

    题目还有一个条件是,x>y的y只会出现一次(每个数直接大于它的只有一个) n<=5000 是[HNOI2015]实验比较 的加强版 g(i,j,k)其实可以递推:g(i,j,k)=g(i- ...

  9. fzyzojP3372 -- [校内训练20171124]博弈问题

    对于每个点都要答案 还是异或 trie树合并石锤了 朴素枚举是O(n^2*17)的 怎么办呢? 我们发现合并的时候,一些部分的trie的子树还是不变的 改变的部分也就是合并的复杂度可以接受 鉴于大部分 ...

随机推荐

  1. IdentityServer4 Clients

    原文地址 Clients 的定义 Client是指那些从 identityserver获取 token的应用 通常需要为client定义下面通用的设置 唯一的client id secret, 如果需 ...

  2. 转:EBS-自动获取/创建CCID

    DECLARE l_ccid NUMBER; l_msg ); l_chart_of_account_id NUMBER; l_set_of_book_id NUMBER; BEGIN l_set_o ...

  3. 错误 1 未能找到类型或命名空间名称“”, 引入DLL文件出现提示文件不存在问题

    在所有引入都正确的情况下,查看项目目标框架是否正确

  4. jquery file upload + asp.net 异步多文件上传

    百度了很久,国内一直 找不到 使用jquery file upload 插件 +asp.net 的相关代码 一开始使用 jquery uploadify ,一款基于 flash的插件,但是不支持 Sa ...

  5. STM32与STM8操作寄存器的区别

    在STM8中,由于STM8寄存器较少,在头文件中定义寄存器的时候不用采取任何形式的封装,所以操作寄存器的时候直接可以用如下方式处理:PB_DDR |=0x20; 但是在STM32中,由于其寄存器实在太 ...

  6. Python3 安装pylint 及与PyCharm关联

    使用如下命令: pip3 install pylint 安装完后可以看到在你的python3的目录底下的Scripts目录下有pylint.exe了 然后就可以使用pylint 评估你的代码了,如: ...

  7. [译文] C# 已成旧闻, 向前, 抵达 C# 9!

    C# 8 is old news. Onward, to C# 9! (C# 已成旧闻, 向前, 抵达 C# 9!) Did you know that planning is already und ...

  8. 简易数据分析 15 | Web Scraper 高级用法——CSS 选择器的使用

    这是简易数据分析系列的第 15 篇文章. 年末事情比较忙,很久不更新了,后台一直有读者催更,我看了一些读者给我的私信,发现一些通用的问题,所以单独写篇文章,介绍一些 Web Scraper 的进阶用法 ...

  9. Spring命令行参数

    一般我们通过java -jar xxx.jar的方式启动应用,其实除了启动应用我们还能在命令中指定应用的参数,比如java -jar xxx.jar --server.port=1234,直接以命令行 ...

  10. Callable,阻塞队列,线程池问题

    一.说说Java创建多线程的方法 1. 通过继承Thread类实现run方法   2. 通过实现Runnable接口 3. 通过实现Callable接口 4. 通过线程池获取 二. 可以写一个Call ...