Reverse

题目背景

小\(\text{G}\)有一个长度为\(n\)的\(01\)串\(T\),其中只有\(T_S=1\),其余位置都是\(0\)。现在小\(\text{G}\)可以进行若干次以下操作:

• 选择一个长度为\(K\)的连续子串(\(K\)是给定的常数),翻转这个子串。

对于每个\(i,i\in [1,n]\),小\(\text{G}\)想知道最少要进行多少次操作使得\(T_i=1\).特别的,有\(m\)个“禁止位置”,你需要保证在操作过程中\(1\)始终不在任何一个禁止位置上。

输入输出格式

输入格式

从文件reverse.in中读入数据.

第一行四个整数\(n,K,m,S\).

接下来一行\(m\)个整数表示禁止位置。

输出格式

输出到文件reverse.out中.

输出一行\(n\)个整数,对于第\(i\)个整数,如果可以通过若干次操作使得\(T_i=1\),输出最小操作次数,否则输出\(-1\).

说明

对于所有数据,有\(1≤n≤10^5,1≤S,k≤n,0≤m≤n\).

保证\(S\)不是禁止位置,但禁止位置可能有重复。

  • \(\text{Subtask1}(24\%), n≤10\).

  • \(\text{Subtask2}(22\%), n≤10^3\).

  • \(\text{Subtask3}(3\%), k=1\).

  • \(\text{Subtask4}(8\%), k=2\).

  • \(\text{Subtask5}(43\%)\), 没有特殊的约束。


题目其实并不难

发现可以连边直接bfs,可以拿到57pts的暴力分

发现边的数量很多,需要支持动态删点

用两颗平衡树分别维护位置为奇数时和位置为偶数时

然后每次找到可翻转的左边和右边,在平衡上二分,bfs然后删掉点就可以了

每个点只会被删掉一次,复制度差不多是\(O(nlogn)\)的


Code:

#include <cstdio>
#include <cstring>
#include <set>
const int N=1e5+10;
std::set <int> s1,s2;
std::set <int>::iterator it;
int n,k,m,s,l=1,r,q[N<<2],used[N],ans[N],lp,rp,d;
int min(int x,int y){return x<y?x:y;}
int max(int x,int y){return x>y?x:y;}
int main()
{
scanf("%d%d%d%d",&n,&k,&m,&s);
memset(ans,-1,sizeof(ans));
used[s]=1,q[++r]=s,ans[s]=0;
for(int p,i=1;i<=m;i++) scanf("%d",&p),used[p]=1;
for(int i=1;i<=n;i+=2)
{
if(!used[i]) s1.insert(i);
if(!used[i+1]) s2.insert(i+1);
}
while(l<=r)
{
int p=q[l++];
lp=max(p-k+1,max(k-p+1,1)),rp=min(p+k-1,min(2*n+1-k-p,n));
if(p-k&1)//s2
{
it=s2.lower_bound(lp);
while(it!=s2.end()&&(d=*it)<=rp)
{
q[++r]=d;
ans[d]=ans[p]+1;
it++;
s2.erase(d);
}
}
else
{
it=s1.lower_bound(lp);
while(it!=s1.end()&&(d=*it)<=rp)
{
q[++r]=d;
ans[d]=ans[p]+1;
it++;
s1.erase(d);
}
}
}
for(int i=1;i<=n;i++)
printf("%d ",ans[i]);
return 0;
}

2018.10.7

雅礼集训 Day7 T1 Equation 解题报告的更多相关文章

  1. 雅礼集训 Day6 T2 Equation 解题报告

    Equation 题目描述 有一棵\(n\)个点的以\(1\)为根的树,以及\(n\)个整数变量\(x_i\).树上\(i\)的父亲是\(f_i\),每条边\((i,f_i)\)有一个权值\(w_i\ ...

  2. 雅礼集训 Day6 T1 Merchant 解题报告

    Merchant 题目描述 有\(n\)个物品,第\(i\)个物品有两个属性\(k_i,b_i\),表示它在时刻\(x\)的价值为\(k_i\times x+b_i\). 当前处于时刻\(0\),你可 ...

  3. 「雅礼集训 2017 Day2」解题报告

    「雅礼集训 2017 Day2」水箱 我怎么知道这种题目都能构造树形结构. 根据高度构造一棵树,在树上倍增找到最大的小于约束条件高度的隔板,开一个 \(vector\) 记录一下,然后对于每个 \(v ...

  4. 「雅礼集训 2017 Day1」 解题报告

    「雅礼集训 2017 Day1」市场 挺神仙的一题.涉及区间加.区间除.区间最小值和区间和.虽然标算就是暴力,但是复杂度是有保证的. 我们知道如果线段树上的一个结点,\(max=min\) 或者 \( ...

  5. 雅礼集训 Day3 T3 w 解题报告

    w 题目背景 \(\frac 14\)遇到了一道水题,双完全不会做,于是去请教小\(\text{D}\).小\(\text{D}\)看了\(0.607^2\)眼就切掉了这题,嘲讽了\(\frac 14 ...

  6. 雅礼集训 Day1 T3 画作 解题报告

    画作 题目描述 小\(\mathrm{G}\)的喜欢作画,尤其喜欢仅使用黑白两色作画. 画作可以抽象成一个\(r\times c\)大小的\(01\)矩阵.现在小\(\mathrm{G}\)构思好了他 ...

  7. 雅礼集训 Day5 T3 题 解题报告

    题 题目背景 由于出题人赶时间所以没办法编故事来作为背景. 题目描述 一开始有\(n\)个苹果,\(m\)个人依次来吃苹果,第\(i\)个人会尝试吃\(u_i\)或\(v_i\)号苹果,具体来说分三种 ...

  8. 雅礼集训 Day3 T2 u 解题报告

    u 题目背景 \(\frac 14\) 遇到了一道水题,完全不会做,于是去请教小\(\text{D}\).小\(\text{D}\)看了一眼就切掉了这题,嘲讽了\(\frac 14\)一番就离开了. ...

  9. 雅礼集训 Day3 T2 v 解题报告

    v 题目背景 \(\frac 14\)遇到了一道水题,又完全不会做,于是去请教小\(\text{D}\).小\(\text{D}\)看了\(0.607\)眼就切掉了这题,嘲讽了\(\frac 14\) ...

随机推荐

  1. 【杂题总汇】UVa-10618 Tango Tango Insurrection

    [UVa-10618] Tango Tango Insurrection ◇ 题目 +vjudge 链接+ (以下选自<算法竞赛入门经典>-刘汝佳,有删改) <题目描述> 你想 ...

  2. 爬虫学习(十五)——json解析

    json与jsonpath 对象{}:jsonobject 对象:对象在js中表现为{}括起来的内容,数据结构为{key:value,key:value...}键值对的结构,在面向对象的结构中,key ...

  3. 在haoodp-2.7.3 HA的基础上安装Hbase HA

    前提安装好hadoop基于QJM的高可用 node1 HMaster node2 HMaster.HRegionServer node3 HRegionServer node4 HRegionServ ...

  4. Centos 7 下安装mysql

    // 卸载原有maridb-lib库 [root@localhost ~]# rpm -qa | grep mariadb mariadb-libs-5.5.41-2.el7_0.x86_64 [ro ...

  5. LEA指令与MOV指令区别

    Tips: LEA指令与MOV指令的区别: ① MOV指令是 数据        传送指令-------传送数据 LEA指令是   有效地址 传送指令-------取偏移地址 ② MOV OPRD1 ...

  6. 关于Mysql唯一索引的操作方法(添加删除)

    首先我们查看一下News数据表的索引信息      使用命令 show index from ‘数据表名称’; 目前数据表中仅有一个主键索引 继续,我们给news表添加两个唯一索引(两种方法) 方法一 ...

  7. easyPOI导出excel报错

    http-nio--exec- at :: - excel cell export error ,data is :com.jn.ssr.superrescue.web.qc.dto.Automati ...

  8. CONDENSE命令により、文字列から冗長スペースが削除

    CONDENSE 命令により.文字列から冗長スペースが削除されます. CONDENSE c [NO-GAPS]. この命令により.項目 c に先行空白が含まれる場合は削除され.その他の空白列がある場合 ...

  9. python里面list()函数

    1. list() 方法用于将元组转换为列表. 元组与列表是非常类似的,区别在于元组的元素值不能修改,元组是放在括号中,列表是放于方括号中. 2. python里面的变量不用提前声明.

  10. 2.ifconfig

    转载http://www.cnblogs.com/peida/archive/2013/02/27/2934525.html 许多windows非常熟悉ipconfig命令行工具,它被用来获取网络接口 ...