「NOI2016」区间

最近思维好僵硬啊...

一上来就觉得先把区间拆成两个端点进行差分,然后扫描位置序列,在每个位置维护答案,用数据结构维护当前位置的区间序列,但是不会维护。

于是想研究性质,想到为什么要拿区间长度做权值呢,难道是有一些性质吗

于是思考了很久区间长度的性质,猜了一些sb结论,比如什么一个区间只有加入时和删除时的贡献算一下就可以了之类的...

全错了然后就自闭了...

然后想什么钦定最大值,然后询问位置区间,然后我发现线段树每个点要挂一个单调队列(事实上把单调队列从线段树上拿下来就是正解了,我当时一点都没想到),然后又自闭了

然后想干脆钦定最大最小值,反正只有\(n^2\)种,然后我们需要查询长度在最大最小值之间的区间,然后我们看一下这些区间的区间并有没有一个位置的值比\(m\)大,区间并可以染色,然后查询最大值

这样可以拿树套树暴力搞了,好像很对

然后发现如果扫描的最大值最小值两个指针的话,移动是\(O(n)\)的,好像叫尺取法把,然后就可以只维护一个线段树了。


Code:

#include <cstdio>
#include <cctype>
#include <algorithm>
using std::max;
const int SIZE=1<<21;
char ibuf[SIZE],*iS,*iT;
#define gc() (iS==iT?(iT=(iS=ibuf)+fread(ibuf,1,SIZE,stdin),iS==iT?EOF:*iS++):*iS++)
//#define gc() getchar()
template <class T>
void read(T &x)
{
x=0;char c=gc();
while(!isdigit(c)) c=gc();
while(isdigit(c)) x=x*10+c-'0',c=gc();
}
void ckmin(int &x,int y){x=x<y?x:y;}
const int inf=0x3f3f3f3f;
const int N=5e5+10;
int n,m,k,saki[N<<1];
struct _toki
{
int l,r,val;
bool friend operator <(_toki a,_toki b){return a.val<b.val;}
}toki[N];
int mx[N<<3],tag[N<<3];
#define ls id<<1
#define rs id<<1|1
void pushdown(int id)
{
if(tag[id])
{
mx[ls]+=tag[id],tag[ls]+=tag[id];
mx[rs]+=tag[id],tag[rs]+=tag[id];
tag[id]=0;
}
}
void upt(int id,int L,int R,int l,int r,int d)
{
if(r<L||l>R) return;
if(l<=L&&R<=r)
{
mx[id]+=d;
tag[id]+=d;
return;
}
pushdown(id);
int Mid=L+R>>1;
upt(ls,L,Mid,l,r,d),upt(rs,Mid+1,R,l,r,d);
mx[id]=max(mx[ls],mx[rs]);
}
int qry(int id,int L,int R,int l,int r)
{
if(r<L||l>R) return 0;
if(l<=L&&R<=r) return mx[id];
pushdown(id);
int Mid=L+R>>1;
return max(qry(ls,L,Mid,l,r),qry(rs,Mid+1,R,l,r));
}
int main()
{
//freopen("data.in","r",stdin);
//freopen("data.out","w",stdout);
read(n),read(k);
for(int i=1;i<=n;i++)
{
read(toki[i].l),read(toki[i].r);
saki[++m]=toki[i].l,saki[++m]=toki[i].r;
toki[i].val=toki[i].r-toki[i].l;
}
std::sort(saki+1,saki+1+m);
m=std::unique(saki+1,saki+1+m)-saki-1;
for(int i=1;i<=n;i++)
{
toki[i].l=std::lower_bound(saki+1,saki+1+m,toki[i].l)-saki;
toki[i].r=std::lower_bound(saki+1,saki+1+m,toki[i].r)-saki;
}
std::sort(toki+1,toki+1+n);
int l=1,r=1,ans=inf;
while(r<=n)
{
upt(1,1,m,toki[r].l,toki[r].r,1);
while(qry(1,1,m,toki[r].l,toki[r].r)>=k)
{
ckmin(ans,toki[r].val-toki[l].val);
upt(1,1,m,toki[l].l,toki[l].r,-1);
++l;
}
++r;
}
if(ans==inf) puts("-1");
else printf("%d\n",ans);
return 0;
}

2019.5.30

「NOI2016」区间 解题报告的更多相关文章

  1. 「NOI2016」网格 解题报告

    「NOI2016」网格 容易注意到,答案最多为2,也就是说答案为-\(1,0,1,2\)四种,考虑逐个判断. 无解的情况比较简单 如果\(nm\le c+1\),显然无解 如果\(nm=c+2\),判 ...

  2. 「HNOI2016」树 解题报告

    「HNOI2016」树 事毒瘤题... 我一开始以为每次把大树的子树再接给大树,然后死活不知道咋做,心想怕不是个神仙题哦 然后看题解后才发现是把模板树的子树给大树,虽然思维上难度没啥了,但是还是很难写 ...

  3. 「HNOI2016」序列 解题报告

    「HNOI2016」序列 有一些高妙的做法,懒得看 考虑莫队,考虑莫队咋移动区间 然后你在区间内部找一个最小值的位置,假设现在从右边加 最小值左边区间显然可以\(O(1)\),最小值右边的区间是断掉的 ...

  4. 「SCOI2016」美味 解题报告

    「SCOI2016」美味 状态极差无比,一个锤子题目而已 考虑每次对\(b\)和\(d\)求\(c=d \ xor \ (a+b)\)的最大值,因为异或每一位是独立的,所以我们可以尝试按位贪心. 如果 ...

  5. 「SCOI2016」萌萌哒 解题报告

    「SCOI2016」萌萌哒 这思路厉害啊.. 容易发现有个暴力是并查集 然后我想了半天线段树优化无果 然后正解是倍增优化并查集 有这个思路就简单了,就是开一个并查集代表每个开头\(i\)每个长\(2^ ...

  6. 「NOI2014」购票 解题报告

    「NOI2014」购票 写完了后发现写的做法是假的...然后居然过了,然后就懒得管正解了. 发现需要维护凸包,动态加点,询问区间,强制在线 可以二进制分组搞,然后你发现在树上需要资瓷撤回,然后暴力撤回 ...

  7. 「NOI2017」整数 解题报告

    「NOI2017」整数 有一些比较简单的\(\log^2n\)做法 比如暴力在动态开点线段树上维护每个位置为\(0\)还是\(1\),我们发现涉及到某一位加上\(1\)或者减去\(1\)实际上对其他位 ...

  8. 「ZJOI2016」旅行者 解题报告

    「ZJOI2016」旅行者 对网格图进行分治. 每次从中间选一列,然后枚举每个这一列的格子作为起点跑最短路,进入子矩形时把询问划分一下,有点类似整体二分 至于复杂度么,我不会阿 Code: #incl ...

  9. 「HNOI2016」网络 解题报告

    「HNOI2016」网络 我有一个绝妙的可持久化树套树思路,可惜的是,它的空间是\(n\log^2 n\)的... 注意到对一个询问,我们可以二分答案 然后统计经过这个点大于当前答案的路径条数,如果这 ...

随机推荐

  1. Java中static修饰类的问题

    Java中static修饰类的问题 众所周知,Java中static关键字可以修饰方法与变量: 修饰变量的时候,这个变量属于类变量,可以直接通过类名.变量名来引用. 修饰方法的时候可以直接通过类名.方 ...

  2. 弗洛伊德Floyd求最小环

    模板: #include<bits/stdc++.h> using namespace std; ; const int INF = 0xffffff0; ]; void Solve(in ...

  3. MySQL 获取本月第一天、下个月第一天等

    select curdate(); --获取当前日期 select last_day(curdate()); --获取当月最后一天. select DATE_ADD(curdate(),interva ...

  4. centos6.8安装redis

    1.下载Redis3.2.5安装包 cd /optwget http://download.redis.io/releases/redis-3.2.5.tar.gz 2.解压.编译.安装redis-3 ...

  5. VC6.0在Win8,10下的兼容性调整

    Microsoft Visual C++ 6.0,简称VC6.0,是微软推出的一款C++编译器,将“高级语言”翻译为“机器语言(低级语言)”的程 序.Visual C++是一个功能强大的可视化软件开发 ...

  6. luoguP3258 [JLOI2014]松鼠的新家 题解(树上差分)

    P3258 [JLOI2014]松鼠的新家  题目 树上差分:树上差分总结 #include<iostream> #include<cstdlib> #include<c ...

  7. CSS3 3D旋转下拉菜单--兼容性不太好

    <!DOCTYPE html> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <m ...

  8. 后端数据推送-EventSource

    服务器发送事件(以下简称SSE)是HTML 5规范的一个组成部分,可以实现服务器到客户端的单向数据通信.通过SSE,客户端可以自动获取数据更新,而不用重复发送HTTP请求.一旦连接建立,“事件”便会自 ...

  9. FZU 1876 JinYueTuan(排列组合)

    Description Let’s have a look at the picture below Now, do you know what it’s? Yeah , O(∩_∩)O~ , It ...

  10. JavaScript 盖尔-沙普利算法

    最近在学 JavaScript , 为了尽快熟悉语法,决定移植以前写的盖尔-沙普利算法. c# 下的代码:https://www.cnblogs.com/aitong/p/10973774.html ...