传送门:http://codeforces.com/problemset/problem/612/D

(转载请注明出处谢谢)

题意:

给出数字n和k,n表示接下来将输入n个在x轴上的闭区间[li,ri],找出被包含了至少k次的点,并求由这些点组成的连续区间的数目,并使该数目最小。输出该数目并将区间从左到右(x的正方向)输出。

比如样例1,给出区间[0,5],[-3,2],[3,8],那么被覆盖了至少两次的区间就是[0,2],[3,5],有两个。

解题思路:

处理区间覆盖,一上来就想到了前缀和,普通前缀和处理的话,以数值为下标,然后开一个标记数组,每次对于区间[l,r],tmp[l]++,tmp[r+1]--,这样求前缀和数组s后,s[i]即为i被覆盖的次数,因此只需要如此操作一遍后,O(n)扫一遍,连续的s[x]>=k的,就为一个区间,记录输出即可。

随后注意到,l和r的范围在[-1e9,1e9],开不了数组,但n只为1e6,每次输入最多2e6个数字,因此采用离散化处理。将输入是数字排序后,扫一遍所有区间,每次用lower_bound来求它所在的位置,因为一定存在,所以得到的下标一定是该数字的第一个下标(如果有重复,则为第一个该数字的下标)。

在运行样例时,发现出来的结果不对。留意到是因为此时运行出来的前缀和数组s[]和想要的不一样。一般情况下,前缀和处理区间覆盖问题时“tmp[l]++,tmp[r+1]--”中的l和r指的是数值,而离散化后指的是它的下标,在处理的时候就会发生冲突。

为了解决这个冲突,只要给每个数字都多“复制”一次就可以了,因为此时tmp[r+1]中的r+1所指是一个“多余”的位置,就不会出现冲突的情况。(语言表述有点无力,下面以第一个样例为例)

区间[0,5],[-3,2],[3,8],输入后为a[]={-3,0,2,3,5,8},然后按上述所说求前缀和数组为s[]={1,2,2,2,2,1}。复制后,a[]={-3,-3,0,0,2,2,3,3,5,5,8,8},前缀和数组为s[]={1,1,2,2,2,1,2,2,2,1,1},此时s数组中值为2的连续区间上的第一个数和第二个数(相同下标的a数组)恰好是具体区间,冲突解决。

具体实现细节看代码。

代码:

#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
using namespace std;
const int N=1e6+;
int n,k,cnt,a[N<<];
int tmp[N<<],s[N<<];
struct seg{
int l,r;
}sgt[N],res[N];
int main(){
//freopen("in.txt","r",stdin);
while(~scanf("%d%d",&n,&k)){
cnt=;
for(int i=;i<n;i++){
scanf("%d%d",&sgt[i].l,&sgt[i].r);
a[cnt++]=sgt[i].l,a[cnt++]=sgt[i].l;
a[cnt++]=sgt[i].r,a[cnt++]=sgt[i].r;
}
sort(a,a+cnt);
memset(tmp,,sizeof(tmp));
for(int i=;i<n;i++){
tmp[lower_bound(a,a+cnt,sgt[i].l)-a]++;
tmp[lower_bound(a,a+cnt,sgt[i].r)-a+]--;
}
s[]=tmp[];
for(int i=;i<cnt;i++)
s[i]=s[i-]+tmp[i];
int tot=,flag=;
for(int i=;i<cnt;i++){
if(s[i]>=k){
if(!flag){
res[tot].l=a[i];
flag=;
}
}
else{
if(flag){
flag=;
res[tot++].r=a[i-];
}
}
}
printf("%d\n",tot);
for(int i=;i<tot;i++)
printf("%d %d\n",res[i].l,res[i].r);
}
return ;
}

Codeforces 612D 前缀和处理区间问题的更多相关文章

  1. codeforces Gym 100187F F - Doomsday 区间覆盖贪心

    F. Doomsday Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://codeforces.com/gym/100187/problem/F ...

  2. Codeforces Round #427 (Div. 2) Problem C Star sky (Codeforces 835C) - 前缀和

    The Cartesian coordinate system is set in the sky. There you can see n stars, the i-th has coordinat ...

  3. Educational Codeforces Round 61 F 思维 + 区间dp

    https://codeforces.com/contest/1132/problem/F 思维 + 区间dp 题意 给一个长度为n的字符串(<=500),每次选择消去字符,连续相同的字符可以同 ...

  4. CSU 1809 - Parenthesis - [前缀和+维护区间最小值][线段树/RMQ]

    题目链接:http://acm.csu.edu.cn/csuoj/problemset/problem?pid=1809 Bobo has a balanced parenthesis sequenc ...

  5. CodeForces 816B 前缀和

    To stay woke and attentive during classes, Karen needs some coffee! Karen, a coffee aficionado, want ...

  6. 洛谷 P1865 A % B Problem[筛素数/前缀和思想/区间质数个数]

    题目描述 区间质数个数 输入输出格式 输入格式: 一行两个整数 询问次数n,范围m 接下来n行,每行两个整数 l,r 表示区间 输出格式: 对于每次询问输出个数 t,如l或r∉[1,m]输出 Cros ...

  7. Dasha and Photos CodeForces - 761F (前缀优化)

    大意: 给定n*m初始字符矩阵, 有k个新矩阵, 第$i$个矩阵是由初始矩阵区间赋值得到的, 求选择一个新矩阵, 使得其余新矩阵到它距离和最小. 字符集比较小, 可以考虑每次区间覆盖对每个字符的贡献. ...

  8. Codeforces Gym100543L Outer space invaders 区间dp 动态规划

    原文链接https://www.cnblogs.com/zhouzhendong/p/CF-Gym100543L.html 题目传送门 - CF-Gym100543L 题意 $T$ 组数据. 有 $n ...

  9. Codeforces 508E Arthur and Brackets 区间dp

    Arthur and Brackets 区间dp, dp[ i ][ j ]表示第 i 个括号到第 j 个括号之间的所有括号能不能形成一个合法方案. 然后dp就完事了. #include<bit ...

随机推荐

  1. git 忽略文件[.gitignore]常用配置

    .idea .buildpath .project .settings .Ds_Store composer.json composer.lock a.php /public/uploads /run ...

  2. LearnPython笔记:ex48 代码

    赶紧写上 ,一定有人着急要看,啊哈哈哈哈,嘻嘻 哈哈 不枉我起了个大早 利用什么碎片时间啊,真正能深入学习的,是需要大段大段不被打断的时间 1. 完全实现了如下几种输入数据: 2. 遗留:最后一个el ...

  3. stall and flow separation on airfoil or blade

    stall stall and flow separation Table of Contents 1. Stall and flow separation 1.1. Separation of Bo ...

  4. Ajax学习总结(2)——Ajax参数详解及使用场景介绍

    一.定义和用法 AJAX即"Asynchronous Javascript And XML"(异步JavaScript和XML),是指一种创建交互式网页应用的网页开发技术. AJA ...

  5. 解决Windows Server 2012 R2 Datacenter云服务器无法运行opencv python程序的问题

    写了个基于opencv的python程序,pyinstaller 32位机打包后在win7/win10 32/64正常运行,在Windows Server 2012 R2 Datacenter云服务器 ...

  6. MTK平台系统稳定性分析

    目录 1:简介 2:怎么抓取和分析log 3:怎么确定问题点 简介 系统稳定性目前主要是解决系统死机重启. 分为两部分:Android /kernel Kernel 分析需要的文件和工具: Mtklo ...

  7. [USACO06JAN]牛的舞会The Cow Prom Tarjan

    题目描述 The N (2 <= N <= 10,000) cows are so excited: it's prom night! They are dressed in their ...

  8. vijos - P1122出栈序列统计 (卡特兰数)

    P1122出栈序列统计 未递交 标签:NOIP普及组2003[显示标签] 描写叙述 栈是经常使用的一种数据结构,有n令元素在栈顶端一側等待进栈,栈顶端还有一側是出栈序列. 你已经知道栈的操作有两·种: ...

  9. CI 日志类

    开发ci的过程中,使用log能直观的看出代码运行到哪,还可设置代码查看数据接口的发送情况.日志类: <?php defined('BASEPATH') OR exit('No direct sc ...

  10. window.setTimeout() 和window.setInterval() 的差别

    setTimeout 和setInterval的功能都是经过某一个时间段后发生某件指定的事件或者方法. 如window.setTimeout("sleep()",5000);指的是 ...