Description

有n个区间,第i个区间是[li,ri],它的长度是ri−li。

有q个询问,每个询问给定L,R,K,询问被[L,R]包含的且长度不小于K的区间数量。

你想,像这种板子题,你随手写,不到十分钟就能AC。

Input

第一行,两个空格隔开的正整数n,q。

接下来n行,第i行有两个空格隔开的正整数li,ri​​。

接下来q行,每行三个空格隔开的正整数L,R,K,表示一个询问。

Output

共q行,每行一个非负整数,表示询问的答案。

Sample Input

5 5
1 2
1 3
2 3
2 4
2 5
1 5 1
1 4 1
1 5 2
2 5 2
1 5 3

Sample Output

5
4
3
2
1

HINT

对于30%的数据,n,q≤5,000;

对于60%的数据,n,q≤50,000;

对于所有数据,n,q≤500,000,li,ri,L,R,K≤n,li<ri,L<R。

题解

我们考虑这样一个问题,在基于所有区间长度都不大于询问区间的条件下。被询问区间包含的区间个数 = 总个数-(区间左端点在询问区间左端点左端的个数 + 区间右端点在询问区间右端点右端的个数)。

那么我们考虑从小到大插入这些区间。在插入区间大小为询问区间的 $K_i-1$ 时,我们统计下答案。同时,在大小为 $R_i-L_i$ 时也统计一次答案。最终答案两次作差即可。

同时注意的是由于题目数据存在 $K_i > R_i-L_i$ 所以要特殊处理。

 //It is made by Awson on 2018.1.5
#include <set>
#include <map>
#include <cmath>
#include <ctime>
#include <queue>
#include <stack>
#include <cstdio>
#include <string>
#include <vector>
#include <cstdlib>
#include <cstring>
#include <iostream>
#include <algorithm>
#define LL long long
#define lowbit(x) ((x)&(-(x)))
#define Max(a, b) ((a) > (b) ? (a) : (b))
#define Min(a, b) ((a) < (b) ? (a) : (b))
using namespace std;
const int N = ;
const int INF = ~0u>>; int n, q;
struct bit_tree {
int c[N+];
void add(int x, int val) {for (; x <= n; x += lowbit(x)) c[x] += val; }
int count(int x) {
int sum = ;
for (; x; x -= lowbit(x)) sum += c[x];
return sum;
}
}L, R;
struct seq {
int l, r, k, id;
bool operator < (const seq &b) const {
return k < b.k;
}
}a[N+], b[(N<<)+];
int cnt[(N<<)+]; void work() {
scanf("%d%d", &n, &q);
for (int i = ; i <= n; i++) scanf("%d%d", &a[i].l, &a[i].r), a[i].k = a[i].r-a[i].l;
for (int i = , tot = ; i <= q; i++) {
++tot, scanf("%d%d%d", &b[tot].l, &b[tot].r, &b[tot].k), --b[tot].k, b[tot].id = tot;
++tot, b[tot].l = b[tot-].l, b[tot].r = b[tot-].r, b[tot].k = b[tot].r-b[tot].l, b[tot].id = tot;
}
sort(a+, a+n+), sort(b+, b+(q<<)+);
int loc = ;
for (int i = ; i <= (q<<); i++) {
while (loc <= n && a[loc].k <= b[i].k) L.add(a[loc].l, ), R.add(a[loc].r, ), ++loc;
if (b[i].k <= b[i].r-b[i].l) cnt[b[i].id] = R.count(b[i].r)-L.count(b[i].l-);
else cnt[b[i].id] = INF;
}
for (int i = ; i <= q; i++) printf("%d\n", Max(cnt[*i]-cnt[*i-], ));
}
int main() {
work();
return ;
}

[LOJ 6270]数据结构板子题的更多相关文章

  1. LOJ #6270. 数据结构板子题 (离线+树状数组)

    题意 有 \(n\) 个区间,第 \(i\) 个区间是 \([l_i,r_i]\) ,它的长度是 \(r_i-l_i\) . 有 \(q\) 个询问,每个询问给定 \(L,R,K\) ,询问被 \([ ...

  2. 堆以及一些用法 QWQ这是写得最认真的板子题

    最近一直在学图论,然后吧,由于学的东西实在是太多太杂了,加上蒟蒻本蒻又经常颓,所以落了好多好多板子题的整理没写啊嘤嘤嘤,不过把这些东西学的差不多了,再一块写个整理,其实感觉还不错?????也算是很神奇 ...

  3. POJ 1321 棋盘问题(DFS板子题,简单搜索练习)

    棋盘问题 Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 44012   Accepted: 21375 Descriptio ...

  4. POJ 3278 Catch That Cow(BFS,板子题)

    Catch That Cow Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 88732   Accepted: 27795 ...

  5. Gym 100952J&&2015 HIAST Collegiate Programming Contest J. Polygons Intersection【计算几何求解两个凸多边形的相交面积板子题】

    J. Polygons Intersection time limit per test:2 seconds memory limit per test:64 megabytes input:stan ...

  6. hihoCoder #1038 : 01背包(板子题)

    #1038 : 01背包 时间限制:20000ms 单点时限:1000ms 内存限制:256MB 描述 且说上一周的故事里,小Hi和小Ho费劲心思终于拿到了茫茫多的奖券!而现在,终于到了小Ho领取奖励 ...

  7. bzoj-1787-洛谷-4281(LCA板子题)

    传送门(bzoj) 传送门(洛谷) 可以说这道也是一个板子题 由于题中是三个人需经过的路径最短 就会有一点点不太一样 那么 就两两求LCA 这样之后就会出现两种状况 一.所得到的三个LCA是相等的 那 ...

  8. bzoj3944: Sum 杜教筛板子题

    板子题(卡常) 也可能是用map太慢了 /************************************************************** Problem: 3944 Us ...

  9. AC自动机板子题/AC自动机学习笔记!

    想知道484每个萌新oier在最初知道AC自动机的时候都会理解为自动AC稽什么的,,,反正我记得我当初刚知道这个东西的时候,我以为是什么神仙东西,,,(好趴虽然确实是个对菜菜灵巧比较难理解的神仙知识点 ...

随机推荐

  1. python全栈学习--day5

    字典 特点:字典是python中唯一的映射类型,采用键值对(key-value) 的形式存数据. 存储大量的数据,是关系型数据,查询数据快. 字典初始说明: 遍历字典从列表开始,列表是从头便利到尾的. ...

  2. Java8学习(4)-Stream流

    Stream和Collection的区别是什么 流和集合的区别是什么? 粗略地说, 集合和流之间的差异就在于什么时候进行计算.集合是一个内存中的数据结构,它包含数据结构中目前所有的值--集合中的每个元 ...

  3. 利用1.1.1.1进行DNS网络加速,仅需2分钟让网络更快

    NEWS 近日,Cloudflare 和 APNIC联合推出了1.1.1.1DNS网络加速. Cloudflare 运行全球规模最大.速度最快的网络之一.APNIC 是一个非营利组织,管理着亚太和大洋 ...

  4. 2018上C语言程序设计(高级)作业- 第2次作业

    作业要求一 提交截图: 6-7: 6-8: 6-9: 7-1: 作业要求二 题目6-7删除字符中数字字符 1.设计思路: (1)第一步:本题要求是删除字符中的数字字符,我的主要思路是通过数组遍历若遇到 ...

  5. 201621123057 《Java程序设计》第12周学习总结

    1. 本周学习总结 1.1 以你喜欢的方式(思维导图或其他)归纳总结多流与文件相关内容. 2. 面向系统综合设计-图书馆管理系统或购物车 使用流与文件改造你的图书馆管理系统或购物车. 2.1 简述如何 ...

  6. 20145237 《Java程序设计》第三周学习总结

    20145237 <Java程序设计>第3周学习总结 教材学习内容总结 第四章主要讲了Java基本类型中的类类型,如何定义类.构造函数.使用标准类.基本类型打包器.数组复制.字符串等内容查 ...

  7. python的迭代器、生成器、装饰器

    迭代器.生成器.装饰器 在这个实验里我们学习迭代器.生成器.装饰器有关知识. 知识点 迭代器 生成器 生成器表达式 闭包 装饰器 实验步骤 1. 迭代器 Python 迭代器(Iterators)对象 ...

  8. Spring-Data-JPA整合MySQL和配置

    一.简介 (1).MySQL是一个关系型数据库系统,是如今互联网公司最常用的数据库和最广泛的数据库.为服务端数据库,能承受高并发的访问量. (2).Spring-Data-Jpa是在JPA规范下提供的 ...

  9. javascript原型链__proto__属性的理解

    在javascript中,按照惯例,构造函数始终都应该以一个大写字母开头,而非构造函数则应该以一个小写字母开头.一个方法使用new操作符创建,例如下面代码块中的Person1(可以吧Person1看做 ...

  10. 【转】支持向量机(SVM)

    什么是支持向量机(SVM)? SVM 是一种有监督的机器学习算法,可用于分类或回归问题.它使用一种称为核函数(kernel)的技术来变换数据,然后基于这种变换,算法找到预测可能的两种分类之间的最佳边界 ...