近日状态并不是很好, 很不稳, 思路也不是很清晰

希望自己能走出来

题意:有序列1~n 现给出两种区间

区间0:序号在[x, y]的节点不能有忍者

区间1:序号在[x, y]的节点区间里至少有一个忍者

如果有一个区间1和区间0矛盾了 保留那个区间0

已知共有k个忍者 求问一定有忍者的位置有哪些 没有的话 输出-1

A

是不是想到了一个经典问题?

——对于所有区间的最小点覆盖

【悄咪咪:解决方法

以左端点为第一关键字 右端点为第二关键字不下降排序区间

贪心每次不能覆盖的区间的最右端点】

B

但是有区间0啊 不能用这种方法了qvq

然鹅 把区间0覆盖的区间踢掉就可以了(以下“序列”都是指处理完的

差分就可以统计

C

去掉不能有忍者的区间后

我们需要找必须有忍者的区间

先考虑特殊情况

对于该序列 如果不删掉任何忍者 跑一遍最小点覆盖

如果答案大于k 那么必然无解

如果该序列长度为k 那么都要取了

D

一个点必须取 == 不取该点就是无解

蒟蒻认为这是这道题的思维精髓

现在可以很轻松地打出50分暴力了

E

考虑数据结构优化

可以使用线段树或差分

当然我这么懒用的是差分

在代码注释中体现了

#include <cstdio>
#include <cstdlib>
#include <algorithm>
#include <cmath>
#include <cstring>
#include <bitset>
#include <queue>
using namespace std;
const int N = (int)1e5 + 5;
int n, k, m;
struct Q{
int x, y, z;
}q[N];
int qsize;
int dif[N];
int lef[N], rig[N], cnt, ref[N];
//lef[i]记录的是去掉区间0编号后 离散化
//不小于位置i的最小的可以放忍者的位置
//用于把原区间1转换为处理后序列中的区间
//rig[i]反之
int lline[N], rline[N], top;
//处理后序列中各区间左右端点位置
int lf[N], rf[N];
//lf[i]从左边开始覆盖到第i个区间需要的最小节点数
inline bool rule(Q x, Q y){
return x.x == y.x ? x.y < y.y : x.x < y.x;
}
int main(){
scanf("%d%d%d", &n, &k, &m);
for(int i = 1; i <= m; ++i){
scanf("%d%d%d", &q[i].x, &q[i].y, &q[i].z);
if(!q[i].z){++dif[q[i].x]; --dif[q[i].y + 1];}
}
for(int i = 1, cur = 0; i <= n; ++i){
cur += dif[i];
if(!cur){
lef[i] = rig[i] = ++cnt;
ref[cnt] = i;
}
}
if(cnt == k){
for(int i = 1; i <= cnt; ++i) printf("%d\n", ref[i]);
return 0;
}
lef[n + 1] = n + 1;
for(int i = 1; i <= n; ++i) if(!rig[i]) rig[i] = rig[i - 1];
for(int i = n; i >= 1; --i) if(!lef[i]) lef[i] = lef[i + 1];
//处理序列 去掉区间0
qsize = 0;
for(int i = 1, x, y; i <= m; ++i){
if(!q[i].z) continue;
x = lef[q[i].x], y = rig[q[i].y];
if(x <= y) q[++qsize] = (Q){x, y, 1};
}
sort(q + 1, q + qsize + 1, rule);
//处理区间
m = qsize; n = cnt;
for(int i = 1; i <= m; ++i){
while(top && lline[top] <= q[i].x && rline[top] >= q[i].y) --top;
lline[++top] = q[i].x; rline[top] = q[i].y;
}
for(int i = 1, d = 0; i <= m; ++i){
if(lline[i] > d) d = rline[i], lf[i] = lf[i - 1] + 1;
else lf[i] = lf[i - 1];
}
for(int i = m, d = n + 1; i >= 1; --i){
if(rline[i] < d) d = lline[i], rf[i] = rf[i + 1] + 1;
else rf[i] = rf[i + 1];
}
//处理lf rf 注意其下标为区间编号
bool suc = 0;
lline[m + 1] = n + 1;
for(int i = 1, l, r, mid, x, y, del; i <= m; ++i){
del = rline[i];
if(lf[i] == lf[i - 1]) continue;
if(lline[i] == del) {
suc = 1; printf("%d\n", ref[del]); continue;
}
l = 0, r = i - 1;
while(l < r){
mid = l + ((r - l + 1) >> 1);
if(rline[mid] < lline[i]) l = mid;
else r = mid - 1;
}
x = l;
l = i + 1, r = m + 1;
while(l < r){
mid = l + ((r - l) >> 1);
if(lline[mid] > rline[i]) r = mid;
else l = mid + 1;
}
y = l;
if(lf[x] + rf[y] + 1 > k){
suc = 1; printf("%d\n", ref[del]); suc = 1;
}
}
if(!suc) printf("-1\n");
return 0;
}

[APIO2012]守卫的更多相关文章

  1. p3634 [APIO2012]守卫

    传送门 分析 1.先预处理出不被0覆盖的点,然后对每个点处理出在它左边离他最近的点和在他右边理他最近的点. 2.对于每个至少存在一个忍者的区间,先将它左右边界处理为不被0所覆盖.排序后将包含其他区间的 ...

  2. [差分][二分][贪心]luogu P3634 [APIO2012]守卫

    题面 https://www.luogu.com.cn/problem/P3634 给m个限制,可以是一段区间中必须有或者必须无忍者 最多有k个忍者,问有多少个位点一定有忍者 分析 首先用差分标记一下 ...

  3. 贪心(qwq)习题题解

    贪心(qwq)习题题解 SCOI 题解 [ SCOI2016 美味 ] 假设已经确定了前i位,那么答案ans一定属于一个区间. 从高位往低位贪心,每次区间查找是否存在使此位答案为1的值. 比如6位数确 ...

  4. 【STACK】Several待填的坑

    待学的习: https://www.cnblogs.com/xiao-ju-ruo-xjr/p/9149792.html 待写的题: loj#3184:「CEOI2018」斐波那契表示法 luoguP ...

  5. 【TYVJ1864】[Poetize I]守卫者的挑战 概率与期望

    [TYVJ1864][Poetize I]守卫者的挑战 描述 打开了黑魔法师Vani的大门,队员们在迷宫般的路上漫无目的地搜寻着关押applepi的监狱的所在地.突然,眼前一道亮光闪过."我 ...

  6. effective java —— 终结方法守卫者

    目录: effective java —— 终结方法守卫者 effective java 第2章:创建和销毁对象.第7条 : 避免使用终结方法.最后的“终结方法守卫者 (finalizer guard ...

  7. 【bzoj2809】[Apio2012]dispatching 左偏树

    2016-05-31  15:56:57 题目:http://www.lydsy.com/JudgeOnline/problem.php?id=2809 直观的思想是当领导力确定时,尽量选择薪水少的- ...

  8. 洛谷P1263 || 巴蜀2311 宫廷守卫

    题目描述 从前有一个王国,这个王国的城堡是一个矩形,被分为M×N个方格.一些方格是墙,而另一些是空地.这个王国的国王在城堡里设了一些陷阱,每个陷阱占据一块空地. 一天,国王决定在城堡里布置守卫,他希望 ...

  9. TYVJ1864 守卫者的挑战

    P1864 [Poetize I]守卫者的挑战 时间: 1000ms / 空间: 131072KiB / Java类名: Main 描述 打开了黑魔法师Vani的大门,队员们在迷宫般的路上漫无目的地搜 ...

随机推荐

  1. C语言之运算符、表达式和语句

    #include<stdio.h> #define ADJUST 7.31 int main(void) { const double SCALE = 0.333; double shoe ...

  2. java 8中抽象类与接口的异同

    1.java 8中抽象类与接口的异同 相同点: 1)都是抽象类型: 2)都可以有实现方法(以前接口不行): 3)都可以不需要实现类或者继承者去实现所有方法,(以前不行,现在接口中默认方法不需要实现者实 ...

  3. LZO

    LZO 是致力于解压速度的一种数据压缩算法,LZO 是 Lempel-Ziv-Oberhumer 的缩写.这个算法是无损算法,参考实现程序是线程安全的. 实现它的一个自由软件工具是lzop.最初的库是 ...

  4. java注解和自定义注解的简单使用

    前言 在使用Spring Boot的时候,大量使用注解的语法去替代XML配置文件,十分好用. 然而,在使用注解的时候只知道使用,却不知道原理.直到需要用到自定义注解的时候,才发现对注解原理一无所知,所 ...

  5. [转帖]批处理-For详解

    批处理-For详解 https://www.cnblogs.com/DswCnblog/p/5435300.html for 循环的写法 感觉非常好. 今天下午的时候简单测试了下. 多学习提高 非常重 ...

  6. SQL Server 2014备份维护计划

    1.      数据库 -> [管理]-> [维护计划]  -> [新建维护计划](如果没有操作过可以,选择“维护计划向导”): 2.      直接点击下一步,然后填写计划名称.说 ...

  7. 解决方法:CentOS7用yum安装软件显示错误:cannot find a valid baseurl for repo: base/7/x86_64

    在Linux学习中,发现使用yum安装软件出现以下的错误: 百度了各种方法,很多人也发现光是修改REBOOT=yes也没用,多次进行挂载.修改网卡配置文件.重置IP地址.重启网络.创建又删除配置文件的 ...

  8. 10分钟让你的代码更加pythonic

    参考: https://blog.csdn.net/g8433373/article/details/80709116

  9. 报错:ch.qos.logback.core.joran.spi.JoranException

    项目中使用了maven. 1.找到本地仓库,删除ch文件夹 2.对项目执行maven install 3.在更新下项目maven update

  10. Netty ByteBuf 和 String 转换

    参考https://blog.csdn.net/o1101574955/article/details/81024102 参考http://youyu4.iteye.com/blog/2361959 ...