题目描述

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


输入格式

  从文件$reverse.in$中读入数据。
  第一行四个整数$n,K,m,S$。
  接下来一行$m$个整数表示禁止位置。


输出格式

  输出到文件$reverse.out$中。
  输出一行$n$个整数,对于第$i$个整数,如果可以通过若干次操作使得$T_i=1$,输出最小操作次数,否则输出$−1$。


样例

样例输入1:

6 2 0 1

样例输出1:

0 1 2 3 4 5

样例输入2:

10 4 3 3
2 5 10

样例输出2:

2 -1 0 1 -1 1 2 3 2 -1


数据范围与提示

对于所有数据,有$1\leqslant n\leqslant 10^5,1\leqslant S,k\leqslant n,0\leqslant m\leqslant n$。
保证$S$不是禁止位置,但禁止位置可能有重复。
$\bullet Subtask1(24\%)$,$n\leqslant 10$。
$\bullet Subtask2(22\%)$,$n\leqslant 10^3$。
$\bullet Subtask3(3\%)$,$k=1$。
$\bullet Subtask4(8\%)$,$k=2$。
$\bullet Subtask5(43\%)$,没有特殊的约束。


题解

首先解释一下题意,翻转子串指的是将其左右颠倒,而不是异或……

我也不知道为什么会理解错,老是死在语文……

就是一道大模拟,正解用$set$维护,但是可以疯狂加剪枝,但是理论时间复杂度还是线性的,具体剪枝看代码吧,满眼都是泪哇……

不过话说考试的时候看样例找规律能水到$11$分我也是满足了……

时间复杂度:$\Theta(n)$。

期望得分:$100$分。

实际得分:$100$分。


代码时刻

#include<bits/stdc++.h>
using namespace std;
int n,K,m,S;
bool vis[100001];
int L[100001],R[100001];
int dis[100001];
queue<int> q;
void BFS()
{
q.push(S);
vis[S]=1;
while(!q.empty())
{
int x=q.front();q.pop();
for(int i=max(1,x-K);i<=min(x,n-K);i++)
{
int t=K-x+(i<<1);
if(t>x)break;
if(!vis[t]&&dis[t]!=-1)
{
vis[t]=1;
dis[t]=dis[x]+1;
q.push(t);
}
if(dis[t]!=-1)i=max(i,(x+R[t]-K)>>1);
L[t]=min(L[t],K-x+max(1,x-K)*2);
R[t]=max(R[t],K-x+min(x,n-K)*2);
}
for(int i=min(x,n-K);i>=max(1,x-K);i--)
{
int t=K-x+(i<<1);
if(t<=x)break;
if(!vis[t]&&dis[t]!=-1)
{
vis[t]=1;
dis[t]=dis[x]+1;
q.push(t);
}
if(dis[t]!=-1)i=min(i,(x+L[t]-K)>>1);
L[t]=min(L[t],K-x+max(1,x-K)*2);
R[t]=max(R[t],K-x+min(x,n-K)*2);
}
}
}
int main()
{
scanf("%d%d%d%d",&n,&K,&m,&S);K--;
memset(dis,0x3f,sizeof(dis));dis[S]=0;
for(int i=1;i<=n;i++)L[i]=R[i]=i;
while(m--)
{
int x;scanf("%d",&x);
dis[x]=-1;
}
BFS();
for(int i=1;i<=n;i++)
{
if(dis[i]==0x3f3f3f3f)printf("-1 ");
else printf("%d ",dis[i]);
}
return 0;
}

rp++

[CSP-S模拟测试]:Reverse(模拟+暴力+剪枝)的更多相关文章

  1. [CSP-S模拟测试]:D(暴力+剪枝)

    题目传送门(内部题47) 输入格式 第一行一个正整数$n$.第二行$n$个正整数,表示序列$A_i$. 输出格式 一行一个正整数,表示答案. 样例 样例输入: 530 60 20 20 20 样例输出 ...

  2. [CSP-S模拟测试]:reverse(模拟)

    题目传送门(内部题56) 输入格式 第一行包含一个整数:$T$,表示数据组数.接下来$T$行,每行包含两个字符串:$a\ b$. 输出格式 对于每组数据,如果存在$c$,输出最长的情况下字典序最大的$ ...

  3. [CSP-S模拟测试]:reverse(数位DP)

    题目描述 我们定义: $\overline{d_k...d_2d_1}=\sum \limits_{i=1}^kd_i\times {10}^{i-1}=n(d_i\in [0,9]\ and\ d_ ...

  4. [CSP-S模拟测试]:公园(BFS+剪枝)

    题目传送门(内部题31) 输入格式 第一行,五个整数$V,M,N,E,L$.接下来$M$行,每行两个正整数$s_i,a_i$.保证$s_i$互不相等.接下来$N$行,每行两个正整数$t_j,b_j$. ...

  5. [CSP-S模拟测试]:传递(暴力+bitset)

    题目描述 我们称一个有向图$G$是传递的,当且仅当对于图$G$的三个不同顶点$a,b,c$,若图$G$中有一条边从$a$到$b$且有一条边从$b$到$c$,那么图中也有一条边从$a$到$c$.我们称一 ...

  6. [CSP-S模拟测试]:寿司(暴力)

    题目描述 小$c$是一名$oier$.最近,他发现他的数据结构好像学傻了.因为他在刷题时碰到了一道傻逼数据结构题,强行使用了平衡树来解决,卡着时间$AC$.为此,他被狠狠地嘲讽了一番.于是,小$c$找 ...

  7. [CSP-S模拟测试]:Median(暴力+模拟)

    题目描述 定义两个数列: $$S=\{S(1),S(2),...,S(n)\}\text{和}S_2\{S_2(1),S_2(2),...,S_2(n)\}$$ $$S(k)=(p_k\times k ...

  8. 模拟测试—moq:简单一两句

    在Xunit的基础上,说话模拟测试. 假如我们有这样一个控制器里面有这样一个方法,如图 我们在对Bar测试得时候,如果测试未通过,错误有可能来至于Bar,也有可能错误来至于serverde Foo方法 ...

  9. NOIP模拟测试19「count·dinner·chess」

    反思: 我考得最炸的一次 怎么说呢?简单的两个题0分,稍难(我还不敢说难,肯定又有人喷我)42分 前10分钟看T1,不会,觉得不可做,完全不可做,把它跳了 最后10分钟看T1,发现一个有点用的性质,仍 ...

随机推荐

  1. 前端框架React入门课程【视频】

    视频教程列表: http://v1.mukewang.com/1a8228ac-5f7f-48de-b1c5-7d1b8bce9c77/L.mp4 1-1 React入门课程介绍 http://v1. ...

  2. 【ABAP系列】SAP abap dialog screen屏幕参数简介

    公众号:SAP Technical 本文作者:matinal 原文出处:http://www.cnblogs.com/SAPmatinal/ 原文链接:[ABAP系列]SAP abap dialog ...

  3. shader例子

    1.水波涟漪:https://zhuanlan.zhihu.com/p/47204844 2.shaderToy转unity: https://zhuanlan.zhihu.com/p/5228708 ...

  4. Java相关面试题总结+答案(五)

    [异常] 74. throw 和 throws 的区别? throw 是真实抛出一个异常: throws 是声明可能会抛出一个异常. 75. final.finally.finalize 有什么区别? ...

  5. python字典使用总结

    作者:python技术人 博客:https://www.cnblogs.com/lpdeboke 字典是另一种可变容器模型,且可存储任意类型对象. 字典的每个键值 key=>value 对用冒号 ...

  6. Scrapy框架的应用

    一, Scrapy Scrapy是一个为了爬取网站数据,提取结构性数据而编写的应用框架,非常出名,非常强悍.所谓的框架就是一个已经被集成了各种功能(高性能异步下载,队列,分布式,解析,持久化等)的具有 ...

  7. HDU-1847 Good Luck in CET-4 Everybody! (博弈+找规律)

    大学英语四级考试就要来临了,你是不是在紧张的复习?也许紧张得连短学期的ACM都没工夫练习了,反正我知道的Kiki和Cici都是如此.当然,作为在考场浸润了十几载的当代大学生,Kiki和Cici更懂得考 ...

  8. python 模块调用的几种方式

    在python里面又很多模块,或者引用第三方模块,python 模块调用的几种方式,下面详细解说 1,import 模块名 2,from 模块 import  模块里面的小功能 3,from  模块 ...

  9. C#设计模式:外观模式(Facade Pattern)

    一,什么是外观模式? 外观模式:为子系统中的一组接口提供一个一致的界面,定义一个高层接口,这个接口使得这一子系统更加容易使用. 二,我们看看代码的实现 using System; using Syst ...

  10. 10-js对象、数组

    # js对象 ```1.使用原始的方式创建内置对象 var myObject = new Object(); myObject.name = “lijie”; myObject.age = 20; m ...