p3634 [APIO2012]守卫
分析
1.先预处理出不被0覆盖的点,然后对每个点处理出在它左边离他最近的点和在他右边理他最近的点。
2.对于每个至少存在一个忍者的区间,先将它左右边界处理为不被0所覆盖。排序后将包含其他区间的区间去除。
3.贪心求出前i个区间最小忍者数和后i个区间最小忍者数。
4.我们知道对于一个区间除了点R[i]之外最优的点就是R[i]-1,所以我们二分一个右端点小于R[i]-1的最靠右区间k1和一个左端点大于R[i]-1的最靠左区间k2,如果f[k1]+g[k2]+1>k则代表点R[i]必选
代码
#include<iostream>
#include<cstdio>
#include<cstring>
#include<string>
#include<algorithm>
#include<cctype>
#include<cmath>
#include<cstdlib>
#include<queue>
#include<ctime>
#include<vector>
#include<set>
#include<map>
#include<stack>
using namespace std;
struct node {
int le,ri,k;
};
node d[];
int a[],b[],pos[],sum[],cnt,tot,n,m,k;
int L[],R[],f[],g[];
inline bool cmp(const node x,const node y){
return x.le<y.le;
}
int main(){
int i,j;
scanf("%d%d%d",&n,&k,&m);
for(i=;i<=m;i++){
scanf("%d%d%d",&d[i].le,&d[i].ri,&d[i].k);
if(!d[i].k){
sum[d[i].le]++;
sum[d[i].ri+]--;
}
}
for(i=;i<=n;i++){
sum[i]+=sum[i-];
if(!sum[i]){
pos[++tot]=i;
a[i]=b[i]=tot;
}
}
if(tot==k){
for(i=;i<=tot;i++)
printf("%d\n",pos[i]);
return ;
}
a[n+]=n+;
for(i=n;i>;i--)
if(!a[i])a[i]=a[i+];
for(i=;i<=n;i++)
if(!b[i])b[i]=b[i-];
for(i=;i<=m;i++)
if(d[i].k){
d[++cnt].le=a[d[i].le];
d[cnt].ri=b[d[i].ri];
}
m=cnt;
sort(d+,d+m+,cmp);
cnt=;
for(i=;i<=m;i++){
while(cnt&&d[i].le>=L[cnt]&&d[i].ri<=R[cnt])--cnt;
L[++cnt]=d[i].le;
R[cnt]=d[i].ri;
}
int l=n+,r=;
for(i=;i<=cnt;i++){
if(L[i]>r)f[i]=f[i-]+,r=R[i];
else f[i]=f[i-];
}
for(i=cnt;i>;i--){
if(R[i]<l)g[i]=g[i+]+,l=L[i];
else g[i]=g[i+];
}
int ok=;
for(i=;i<=cnt;i++){
if(f[i]==f[i-])continue;
if(L[i]==R[i]){
printf("%d\n",pos[R[i]]);
ok=;
continue;
}
int l=,r=cnt+,x=,y=cnt+;
while(r-l>){
int mid=(l+r)>>;
if(R[mid]<R[i]-)x=mid,l=mid;
else r=mid;
}
l=,r=cnt+;
while(r-l>){
int mid=(l+r)>>;
if(L[mid]>R[i]-)y=mid,r=mid;
else l=mid;
}
if(f[x]+g[y]+>k){
printf("%d\n",pos[R[i]]);
ok=;
}
}
if(!ok)puts("-1");
return ;
}
p3634 [APIO2012]守卫的更多相关文章
- [差分][二分][贪心]luogu P3634 [APIO2012]守卫
题面 https://www.luogu.com.cn/problem/P3634 给m个限制,可以是一段区间中必须有或者必须无忍者 最多有k个忍者,问有多少个位点一定有忍者 分析 首先用差分标记一下 ...
- [APIO2012]守卫
近日状态并不是很好, 很不稳, 思路也不是很清晰 希望自己能走出来 题意:有序列1~n 现给出两种区间 区间0:序号在[x, y]的节点不能有忍者 区间1:序号在[x, y]的节点区间里至少有一个忍者 ...
- 贪心(qwq)习题题解
贪心(qwq)习题题解 SCOI 题解 [ SCOI2016 美味 ] 假设已经确定了前i位,那么答案ans一定属于一个区间. 从高位往低位贪心,每次区间查找是否存在使此位答案为1的值. 比如6位数确 ...
- 【STACK】Several待填的坑
待学的习: https://www.cnblogs.com/xiao-ju-ruo-xjr/p/9149792.html 待写的题: loj#3184:「CEOI2018」斐波那契表示法 luoguP ...
- 【TYVJ1864】[Poetize I]守卫者的挑战 概率与期望
[TYVJ1864][Poetize I]守卫者的挑战 描述 打开了黑魔法师Vani的大门,队员们在迷宫般的路上漫无目的地搜寻着关押applepi的监狱的所在地.突然,眼前一道亮光闪过."我 ...
- effective java —— 终结方法守卫者
目录: effective java —— 终结方法守卫者 effective java 第2章:创建和销毁对象.第7条 : 避免使用终结方法.最后的“终结方法守卫者 (finalizer guard ...
- 【bzoj2809】[Apio2012]dispatching 左偏树
2016-05-31 15:56:57 题目:http://www.lydsy.com/JudgeOnline/problem.php?id=2809 直观的思想是当领导力确定时,尽量选择薪水少的- ...
- 洛谷P1263 || 巴蜀2311 宫廷守卫
题目描述 从前有一个王国,这个王国的城堡是一个矩形,被分为M×N个方格.一些方格是墙,而另一些是空地.这个王国的国王在城堡里设了一些陷阱,每个陷阱占据一块空地. 一天,国王决定在城堡里布置守卫,他希望 ...
- TYVJ1864 守卫者的挑战
P1864 [Poetize I]守卫者的挑战 时间: 1000ms / 空间: 131072KiB / Java类名: Main 描述 打开了黑魔法师Vani的大门,队员们在迷宫般的路上漫无目的地搜 ...
随机推荐
- 条款49:了解new-handle行为
多线程下的内存管理与单线程下是完全不同的,因为heap是一个可以被全局改动的资源,所以所有的线程都有可能去访问这一资源,这回导致很多的race_conditions. 当operator new未 ...
- 整理下PC和移动获取点击、移动坐标的代码和坑
一.PC PC是通过鼠标点击和移动,相对比较简单,比如onmousedown.onmouseup.onmousemove.onmouseout鼠标按键按下.按键起来.鼠标在元素上移动.鼠标从元素上离开 ...
- python3的map(),filter()和reduce()函数总结
这三个都是内置的常用高阶函数(Higher-order function),用法如下: map()函数接收两个参数,一个是函数,一个是Iterable,map将传入的函数依次作用到序列的每个元素,并把 ...
- MAC的VMWare CentOS 6.8命令笔记
1.图形界面切换到命令行界面 真正的Linux切换界面使用命令, Ctrl + Alt + Fn (1,2,3,4,5,6) Wondows平台 Ctrl + option + F ...
- centos下wget: command not found的解决方法
今天给服务器安装新LNMP环境时,wget 时提示 -bash:wget command not found,很明显没有安装wget软件包.一般linux最小化安装时,wget不会默认被安装,这里是C ...
- Sqoop--Free-form Query Imports 自由查询模式下$CONDITIONS关键字的作用
Scoop是用来实现HDFS文件系统和关系型数据库如MySQL之间数据传输和转换的工具. 从MySQL导出到HDFS可以通过--table, --columns and --where等设置数据抽出的 ...
- CF 622F The Sum of the k-th Powers——拉格朗日插值
题目:http://codeforces.com/problemset/problem/622/F 发现 sigma(i=1~n) i 是一个二次的多项式( (1+n)*n/2 ),sigma(i=1 ...
- Java-API:java.lang百科
ylbtech-Java-API:java.lang百科 java.lang是提供利用 Java 编程语言进行程序设计的基础类.最重要的类是Object(它是类层次结构的根)和 Class(它的实例表 ...
- Git学习笔记(三)远程库(GitHub)协同开发,fork和忽略特殊文件
远程库 远程库,通俗的讲就是不再本地的git仓库!他的工作方式和我们本地的一样,但是要使用他就需要先建立连接! 远程库有两种,一个是自己搭建的git服务器:另一种就是使用GitHub,这个网站就是提供 ...
- paramiko监控 windows服务器 被监控服务器只需要安装openssh服务即可基于wmic完成大部分监控
#!/usr/bin/python #-*- coding: UTF-8 -*- #++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ...