Problem 1 bfs+set
2024-09-23 02:54:50
$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 ;
}
最新文章
- 获取 dhcp IP 过程分析 - 每天5分钟玩转 OpenStack(91)
- project 2016 11 20 树的多项式
- 12月14日《奥威Power-BI销售计划填报》腾讯课堂开课啦
- 电脑右键新建文本文档(txt)消失的解决办法
- HDU 5105 Math Problem
- Intellij Idea 创建Web项目入门(一)转
- 创建js对象和js类
- hdu 1166 敌兵布阵(线段树,树状数组)
- 皴EBS R12应用程序和数据库用户password
- 安装 MySQL 后,需要调整的 10 个性能配置项
- Java中的Lock与synchronized
- Ansible-----include
- python vs vscode问题汇总
- FB面经 Prepare: Count Unique Island
- linux pstree命令
- git命令详解( 五 )
- django 之manytomany
- springboot 源码笔记
- 7-17 Hashing(25 分)
- shell中的条件判断if和测试
热门文章
- PMM--简介与部署
- 把时间戳转换为 datatime 格式
- 【JUC】6.线程池—ThreadPoolExecutor
- 碰到的TypeError--记录
- php实现人员权限管理(用户界面)
- pod健康检查(liveness probe存活探针&;&;readiness probe 可读性探针)
- 13.5. zipfile — Work with ZIP archives
- simpleDateFormat中格式化时间需要注意的问题
- kubernetes 基本概念和资源对象汇总
- ASP.NET 中TextBox设置ReadOnly=";true"; 无法取到值的做法