$des$

小G有一个长度为 $n$ 的 01 串 T ,其中只有 $T_S = 1$,其余位置都是 $0$。现在小G可以进行若干
次以下操作:
选择一个长度为 $K$ 的连续子串(K是给定的常数),翻转这个子串。
对于每个 $i,i ∈ [1,n]$,小G想知道最少要进行多少次操作使得 $T_i = 1$. 特别的,有 $m$ 个 “禁
止位置”,你需要保证在操作过程中 $1$ 始终不在任何一个禁止位置上。

$sol$

考虑当前在每个点时可以通过一次翻转转移到哪些点,直接遂遆道即可算出每个点的所需步
数。然而边数会达到 $O(n ^ 2)$ 级别。
可以发现转移到的点一定是一段区间内的奇数或者偶数点,于是一种简单的优化
方法是在 BFS 时开两个 SET 维护当前有哪些奇数点和偶数点还未被 BFS 到,转移时直接
在 SET 上 lower_bound,就不会访问已经 BFS 到过的点了。$O(nlogn)$

$code$

#include <bits/stdc++.h>

#define Rep(i, j, k) for (int i = j; i <= k; i++)

using namespace std;

const int N = 1e5 + ;

int n, K, m, S;
int dis[N];
bool ban[N];
set<int> add1, even2; void BFS() {
memset(dis, -, sizeof dis);
queue<int> q;
dis[S] = , q.push(S);
while (!q.empty()) {
int o = q.front(); q.pop();
int L = max(, o - K + ), R = min(n, o + K - );
L = L + (L + K - ) - o, R = R + (R - K + ) - o;
// cout << o << " " << L << " " << R << "\n";
set<int> &p = L & ? add1 : even2;
for (set<int> :: iterator i = p.lower_bound(L); i != p.end() && *i <= R; p.erase(i++))
dis[*i] = dis[o] + , q.push(*i);
}
} int main() {
scanf("%d%d%d%d", &n, &K, &m, &S);
Rep(i, , m) {
int x;
scanf("%d", &x);
ban[x] = true;
}
Rep(i, , n) if (!ban[i] && i != S) i & ? add1.insert(i) : even2.insert(i);
BFS();
Rep(i, , n) printf("%d ", dis[i]);
return ;
}

最新文章

  1. 获取 dhcp IP 过程分析 - 每天5分钟玩转 OpenStack(91)
  2. project 2016 11 20 树的多项式
  3. 12月14日《奥威Power-BI销售计划填报》腾讯课堂开课啦
  4. 电脑右键新建文本文档(txt)消失的解决办法
  5. HDU 5105 Math Problem
  6. Intellij Idea 创建Web项目入门(一)转
  7. 创建js对象和js类
  8. hdu 1166 敌兵布阵(线段树,树状数组)
  9. 皴EBS R12应用程序和数据库用户password
  10. 安装 MySQL 后,需要调整的 10 个性能配置项
  11. Java中的Lock与synchronized
  12. Ansible-----include
  13. python vs vscode问题汇总
  14. FB面经 Prepare: Count Unique Island
  15. linux pstree命令
  16. git命令详解( 五 )
  17. django 之manytomany
  18. springboot 源码笔记
  19. 7-17 Hashing(25 分)
  20. shell中的条件判断if和测试

热门文章

  1. PMM--简介与部署
  2. 把时间戳转换为 datatime 格式
  3. 【JUC】6.线程池—ThreadPoolExecutor
  4. 碰到的TypeError--记录
  5. php实现人员权限管理(用户界面)
  6. pod健康检查(liveness probe存活探针&amp;&amp;readiness probe 可读性探针)
  7. 13.5. zipfile — Work with ZIP archives
  8. simpleDateFormat中格式化时间需要注意的问题
  9. kubernetes 基本概念和资源对象汇总
  10. ASP.NET 中TextBox设置ReadOnly=&quot;true&quot; 无法取到值的做法