雅礼集训 Day7 T1 Equation 解题报告
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 解题报告的更多相关文章
- 雅礼集训 Day6 T2 Equation 解题报告
Equation 题目描述 有一棵\(n\)个点的以\(1\)为根的树,以及\(n\)个整数变量\(x_i\).树上\(i\)的父亲是\(f_i\),每条边\((i,f_i)\)有一个权值\(w_i\ ...
- 雅礼集训 Day6 T1 Merchant 解题报告
Merchant 题目描述 有\(n\)个物品,第\(i\)个物品有两个属性\(k_i,b_i\),表示它在时刻\(x\)的价值为\(k_i\times x+b_i\). 当前处于时刻\(0\),你可 ...
- 「雅礼集训 2017 Day2」解题报告
「雅礼集训 2017 Day2」水箱 我怎么知道这种题目都能构造树形结构. 根据高度构造一棵树,在树上倍增找到最大的小于约束条件高度的隔板,开一个 \(vector\) 记录一下,然后对于每个 \(v ...
- 「雅礼集训 2017 Day1」 解题报告
「雅礼集训 2017 Day1」市场 挺神仙的一题.涉及区间加.区间除.区间最小值和区间和.虽然标算就是暴力,但是复杂度是有保证的. 我们知道如果线段树上的一个结点,\(max=min\) 或者 \( ...
- 雅礼集训 Day3 T3 w 解题报告
w 题目背景 \(\frac 14\)遇到了一道水题,双完全不会做,于是去请教小\(\text{D}\).小\(\text{D}\)看了\(0.607^2\)眼就切掉了这题,嘲讽了\(\frac 14 ...
- 雅礼集训 Day1 T3 画作 解题报告
画作 题目描述 小\(\mathrm{G}\)的喜欢作画,尤其喜欢仅使用黑白两色作画. 画作可以抽象成一个\(r\times c\)大小的\(01\)矩阵.现在小\(\mathrm{G}\)构思好了他 ...
- 雅礼集训 Day5 T3 题 解题报告
题 题目背景 由于出题人赶时间所以没办法编故事来作为背景. 题目描述 一开始有\(n\)个苹果,\(m\)个人依次来吃苹果,第\(i\)个人会尝试吃\(u_i\)或\(v_i\)号苹果,具体来说分三种 ...
- 雅礼集训 Day3 T2 u 解题报告
u 题目背景 \(\frac 14\) 遇到了一道水题,完全不会做,于是去请教小\(\text{D}\).小\(\text{D}\)看了一眼就切掉了这题,嘲讽了\(\frac 14\)一番就离开了. ...
- 雅礼集训 Day3 T2 v 解题报告
v 题目背景 \(\frac 14\)遇到了一道水题,又完全不会做,于是去请教小\(\text{D}\).小\(\text{D}\)看了\(0.607\)眼就切掉了这题,嘲讽了\(\frac 14\) ...
随机推荐
- SQL递归查询实现组织机构树
系统用到的组织机构树,要实现对当前节点以及其子节点的查询,数据库SQL要用到递归查询,这也是我第一次接触SQL的递归查询. 先说一下什么是递归查询,简单说来是将一个树状结构存储在一张表里,比如一个表中 ...
- 安装阿里云版Linux云服务器,配置软件
1. 购买域名 2. 购买云服务器ecs 3. 远程访问云服务器并装上Java环境和必备软件 3.1安装远程访问工具 3.2 jdk环境配置 3.3 Mysql依赖关系 重新配置MySQL的远程 ...
- Linux实战教学笔记16:磁盘原理
第十五节 磁盘原理 标签(空格分隔): Linux实战教学笔记 1,知识扩展 非脚本方式的一条命令搞定批量创建用户并设置随机10位字母数字组合密码. 1.1 sed的高级用法 [root@chensi ...
- 近年来爆发的CVE漏洞编号
1.Office漏洞 Office漏洞是大部分APT组织最喜爱的漏洞,Office在个人办公电脑使用量大,对针对性目标是最佳的外网入口,效果也是最直接的. CVE编号 漏洞类型 使用组织 CVE-2 ...
- ethereum(以太坊)(三)--合约单继承与多继承
pragma solidity ^0.4.0; // priveta public internal contract Test{ //defualt internal uint8 internal ...
- python-含参函数
#!/usr/local/bin/python3 # -*- coding:utf-8 -*- ''' #----------函数位置参数和关键字参数---------- def test(x,y): ...
- strak组件(9):关键字搜索
效果图: 在列表视图函数增加搜索功能. 新增函数 def get_search_list(self) 钩子方法,获取搜索条件 一.strak组件 strak/service/core_func.py ...
- CONDENSE命令により、文字列から冗長スペースが削除
CONDENSE 命令により.文字列から冗長スペースが削除されます. CONDENSE c [NO-GAPS]. この命令により.項目 c に先行空白が含まれる場合は削除され.その他の空白列がある場合 ...
- Pandas库入门
pandas库的series类型
- Web安全2--XSS&CSRF
1.XSS(跨站脚本攻击) 跨站脚本攻击(Cross Site Scripting),为不和层叠样式表(Cascading Style Sheets, CSS)的缩写混淆,故将跨站脚本攻击缩写为XSS ...