题目传送门

题意:给出一些花开花落的时间,问某个时间花开的有几朵

分析:这题有好几种做法,正解应该是离散化坐标后用线段树成端更新和单点询问。还有排序后二分查找询问点之前总花开数和总花凋谢数,作差是当前花开的数量,放张图易理解:

还有一种做法用尺取法的思想,对暴力方法优化,对询问点排序后再扫描一遍,花开+1,花谢-1。详细看代码。

收获:一题收获很多:1. 降低复杂度可以用二分 2. 线段计数问题可以在端点标记1和-1 3. 离散化+线段树 终于会了:) (听说数据很水?)

代码1:离散化+线段树

/************************************************
* Author :Running_Time
* Created Time :2015-8-25 8:55:54
* File Name :F.cpp
************************************************/ #include <cstdio>
#include <algorithm>
#include <iostream>
#include <sstream>
#include <cstring>
#include <cmath>
#include <string>
#include <vector>
#include <queue>
#include <deque>
#include <stack>
#include <list>
#include <map>
#include <set>
#include <bitset>
#include <cstdlib>
#include <ctime>
using namespace std; #define lson l, mid, rt << 1
#define rson mid + 1, r, rt << 1 | 1
typedef long long ll;
typedef pair<int, int> P;
const int N = 1e5 + 10;
const int INF = 0x3f3f3f3f;
struct ST {
int sum[N<<2], col[N<<2]; void push_up(int rt) {
sum[rt] = sum[rt<<1] + sum[rt<<1|1];
}
void push_down(int rt, int len) {
if (col[rt]) {
col[rt<<1] += col[rt];
col[rt<<1|1] += col[rt];
sum[rt<<1] += col[rt] * (len - (len >> 1));
sum[rt<<1|1] += col[rt] * (len >> 1);
col[rt] = 0;
}
}
void build(int l, int r, int rt) {
col[rt] = 0; sum[rt] = 0;
if (l == r) return ;
int mid = (l + r) >> 1;
build (lson); build (rson);
// push_up (rt);
}
void updata(int ql, int qr, int l, int r, int rt) {
if (ql <= l && r <= qr) {
sum[rt] += (r - l + 1); col[rt] += 1; return ;
}
push_down (rt, r - l + 1);
int mid = (l + r) >> 1;
if (ql <= mid) updata (ql, qr, lson);
if (qr > mid) updata (ql, qr, rson);
// push_up (rt);
}
int query(int ql, int qr, int l, int r, int rt) {
if (ql <= l && r <= qr) return sum[rt];
push_down (rt, r - l + 1);
int mid = (l + r) >> 1;
if (ql <= mid) return query (ql, qr, lson);
if (qr > mid) return query (ql, qr, rson);
}
}st;
int x1[N], x2[N], q[N];
int X[N*3]; int my_binary_search(int l, int r, int key) {
while (l <= r) {
int mid = (l + r) >> 1;
if (X[mid] == key) return mid;
if (X[mid] < key) l = mid + 1;
else r = mid - 1;
}
return -1;
} int main(void) {
int T, cas = 0; scanf ("%d", &T);
while (T--) {
int n, m;
scanf ("%d%d", &n, &m);
int tot = 0;
for (int i=1; i<=n; ++i) {
scanf ("%d%d", &x1[i], &x2[i]);
X[tot++] = x1[i]; X[tot++] = x2[i];
}
for (int i=1; i<=m; ++i) {
scanf ("%d", &q[i]);
X[tot++] = q[i];
}
sort (X, X + tot);
int k = 1;
for (int i=1; i<tot; ++i) {
if (X[i] != X[i-1]) X[k++] = X[i];
} st.build (0, k, 1);
for (int ql, qr, i=1; i<=n; ++i) {
ql = lower_bound (X, X+k, x1[i]) - X;
qr = lower_bound (X, X+k, x2[i]) - X;
// ql = my_binary_search (0, k-1, x1[i]);
// qr = my_binary_search (0, k-1, x2[i]);
st.updata (ql, qr, 0, k, 1);
} printf ("Case #%d:\n", ++cas);
for (int p, i=1; i<=m; ++i) {
p = lower_bound (X, X+k, q[i]) - X;
// p = my_binary_search (0, k-1, q[i]);
printf ("%d\n", st.query (p, p, 0, k, 1));
}
} return 0;
}

代码2:二分查找

/************************************************
* Author :Running_Time
* Created Time :2015-8-25 8:55:54
* File Name :F.cpp
************************************************/ #include <cstdio>
#include <algorithm>
#include <iostream>
#include <sstream>
#include <cstring>
#include <cmath>
#include <string>
#include <vector>
#include <queue>
#include <deque>
#include <stack>
#include <list>
#include <map>
#include <set>
#include <bitset>
#include <cstdlib>
#include <ctime>
using namespace std; #define lson l, mid, rt << 1
#define rson mid + 1, r, rt << 1 | 1
typedef long long ll;
const int N = 1e5 + 10;
const int INF = 0x3f3f3f3f;
const int MOD = 1e9 + 7;
int x1[N], x2[N];
int n, m; int main(void) {
int T, cas = 0; scanf ("%d", &T);
while (T--) {
scanf ("%d%d", &n, &m);
for (int i=1; i<=n; ++i) {
scanf ("%d%d", &x1[i], &x2[i]);
}
sort (x1+1, x1+1+n); sort (x2+1, x2+1+n); printf ("Case #%d:\n", ++cas);
for (int i=1; i<=m; ++i) {
int p; scanf ("%d", &p);
printf ("%d\n", lower_bound (x1+1, x1+1+n, p) - (x1 + 1) - (lower_bound (x2+1, x2+1+n, p) - (x2 + 1)));
}
} return 0;
}

代码3:尺取法

#include <cstdio>
#include <algorithm>
#include <cstring>
using namespace std; typedef long long ll;
typedef pair<int, int> P;
const int N = 1e5 + 10;
const int INF = 0x3f3f3f3f;
P p[N], q[N];
int ans[N];
int n, m; int main(void) {
int T, cas = 0; scanf ("%d", &T);
while (T--) {
scanf ("%d%d", &n, &m);
int tot = 0;
for (int a, b, i=1; i<=n; ++i) {
scanf ("%d%d", &a, &b);
p[++tot] = P (a, 1);
p[++tot] = P (b + 1, -1);
}
sort (p+1, p+1+tot);
for (int i=1; i<=m; ++i) {
int x; scanf ("%d", &x);
q[i] = P (x, i);
}
sort (q+1, q+1+m); printf ("Case #%d:\n", ++cas);
for (int j=1, cnt=0, i=1; i<=m; ++i) {
while (j <= tot && p[j].first <= q[i].first) {
cnt += p[j].second; ++j;
}
ans[q[i].second] = cnt;
}
for (int i=1; i<=m; ++i) printf ("%d\n", ans[i]);
} return 0;
}

离散化+线段树/二分查找/尺取法 HDOJ 4325 Flowers的更多相关文章

  1. BZOJ4653(区间离散化+线段树+决策单调尺取)

    写得很好的题解 一眼过去很像是:排序,然后从前向后扫,有这个区间时插到树里,过去以后再删除.然后事实也是这样做的…… 具体起来: 1.如果考虑暴力的话,一种想法是枚举左端和右端要选取的区间(如果我们按 ...

  2. hdoj 4325 Flowers 线段树+离散化

    hdoj 4325 Flowers 题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=4325 思路: 直接线段树,按照花的开放区间的大小建树,要注意虽然 ...

  3. hdu4614 线段树+二分 插花

    Alice is so popular that she can receive many flowers everyday. She has N vases numbered from 0 to N ...

  4. 洛谷P4344 脑洞治疗仪 [SHOI2015] 线段树+二分答案/分块

    !!!一道巨恶心的数据结构题,做完当场爆炸:) 首先,如果你用位运算的时候不小心<<打成>>了,你就可以像我一样陷入疯狂的死循环改半个小时 然后,如果你改出来之后忘记把陷入死循 ...

  5. 南阳理工 题目9:posters(离散化+线段树)

    posters 时间限制:1000 ms  |  内存限制:65535 KB 难度:6   描述 The citizens of Bytetown, AB, could not stand that ...

  6. SGU 180 Inversions(离散化 + 线段树求逆序对)

    题目链接:http://acm.sgu.ru/problem.php?contest=0&problem=180 解题报告:一个裸的求逆序对的题,离散化+线段树,也可以用离散化+树状数组.因为 ...

  7. Codeforces Gym 100803G Flipping Parentheses 线段树+二分

    Flipping Parentheses 题目连接: http://codeforces.com/gym/100803/attachments Description A string consist ...

  8. Codeforces Gym 100231B Intervals 线段树+二分+贪心

    Intervals 题目连接: http://codeforces.com/gym/100231/attachments Description 给你n个区间,告诉你每个区间内都有ci个数 然后你需要 ...

  9. 【POJ】2528 Mayor's posters ——离散化+线段树

    Mayor's posters Time Limit: 1000MS    Memory Limit: 65536K   Description The citizens of Bytetown, A ...

随机推荐

  1. Null value was assigned to a property of primitive type setter of原因及解决

    出现Null value was assigned to a property of primitive type setter of错误是由于类型不匹配,将字段的属性由hibernate的int类型 ...

  2. vue :src 文件路径错误

    首先先说明下vue-cli的assets和static的两个文件的区别,因为这对你理解后面的解决办法会有所帮助 assets:在项目编译的过程中会被webpack处理解析为模块依赖,只支持相对路径的形 ...

  3. 基于UDP的通讯

    XX:那飘过的100~_~{2014/10/03 10:57} UDP是一种面向非连接SOCK_DGRAM,提供无连接服务.数据包以独立包形式发送,不提供无措保证,数据能够丢失或反复. UDP的Ser ...

  4. JS文件中引用另一个JS文件

    1.生产项目上遇到一个Bug,需要修改JS文件,添加Jquery代码,但是原来的页面没有添加对Jquery文件的引用,无法修改原来的页面(自动生成的HTML) 这就需要在JS文件中添加对Jquery文 ...

  5. vs2010中设置qt环境的智能识别方案

    Qt搭建请参考:Win7系统VS2010下搭建qt开发环境 搭建好之后,虽然可以编译过去,但是写代码时,编辑器无法识别,也没有智能提示,并且代码中都是红色的提示如下: 此时需要设置一下include路 ...

  6. POJ3468 A Simple Problem with Integers —— 线段树 区间修改

    题目链接:https://vjudge.net/problem/POJ-3468 You have N integers, A1, A2, ... , AN. You need to deal wit ...

  7. 小幻美图 API

    『不忘初心,方得始终.』 小幻美图 API 更新:2015.03.29 目前提供的API共有10种! 必应各种今日获取API共4种! 本站收录图片获取API共4种! 网络图片尺寸修改API共1枚! 百 ...

  8. gearcache在qemu-kvm虚拟化平台下的实现

    需要用到的数据结构: 链表,基树. gearcache在qemu-kvm虚拟化平台下的实现主要有以下的步骤: 1.打开镜像文件的时候,为gearcache中的基数池(page_node_pool)和读 ...

  9. 洛谷 P1541 乌龟棋 —— DP

    题目:https://www.luogu.org/problemnew/show/P1541 DP. 代码如下: #include<iostream> #include<cstdio ...

  10. bzoj2809 [Apio2012]dispatching——左偏树(可并堆)

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=2809 思路有点暴力和贪心,就是 dfs 枚举每个点作为管理者: 当然它的子树中派遣出去的忍者 ...