传送门:cogs2897
在网上搜了一圈,只有可怜的一篇题解,是整体二分的。其实这题可以不用整体二分(我不会整体二分)。
二分的思想是,对于每块木板,可以二分它被打碎的时间,然后用数据结构来check,时间复杂度两个log。
那你既然写了数据结构为何还要二分呢(逃
对于每块模板,直接查询它被打碎的时间。如果把每个子弹的位置作为下标,时间作为值,就相当于是查询区间上的第s小值,主席树模板题。
并且主席树应该是可以回避一个位置上多个子弹的问题的,因为它是权值线段树。然而我比较菜,就用了一种很奇怪的做法(我也不知道有没有更好的写法)。对每个位置我都开了一个vector,建树的时候就…还是看代码吧我感觉我很难说清楚了

#include <cctype>
#include <cstdio>
#include <climits>
#include <algorithm>
#include <vector>template <typename T> inline void read(T& t) {int f = 0, c = getchar(); t = 0;while (!isdigit(c)) f |= c == '-', c = getchar();while (isdigit(c)) t = t * 10 + c - 48, c = getchar();if (f) t = -t;
}
#if __cplusplus >= 201103L
template <typename T, typename... Args>
inline void read(T& t, Args&... args) {read(t); read(args...);
}
#else
template <typename T1, typename T2>
inline void read(T1& t1, T2& t2) { read(t1); read(t2); }
template <typename T1, typename T2, typename T3>
inline void read(T1& t1, T2& t2, T3& t3) { read(t1, t2); read(t3); }
template <typename T1, typename T2, typename T3, typename T4>
inline void read(T1& t1, T2& t2, T3& t3, T4& t4) { read(t1, t2, t3); read(t4); }
template <typename T1, typename T2, typename T3, typename T4, typename T5>
inline void read(T1& t1, T2& t2, T3& t3, T4& t4, T5& t5) { read(t1, t2, t3, t4); read(t5); }
#endif  // C++11#ifdef WIN32
#define LLIO "%I64d"
#else
#define LLIO "%lld"
#endif  // WIN32 long long
#define rep(I, A, B) for (int I = (A); I <= (B); ++I)
#define rrep(I, A, B) for (int I = (A); I >= (B); --I)
#define erep(I, X) for (int I = head[X]; I; I = next[I])const int maxn = 2e5 + 207;
int lx[maxn], rx[maxn], sx[maxn];
int left[maxn << 5], right[maxn << 5], sum[maxn << 5], root[maxn];
// 本来应该是 int a[maxn],但是要考虑一个位置上有多个值的情况(有点像哈希表冲突)
// 所以我就用了类似拉链法的做法,开了个vector(感觉很蠢)
std::vector<int> a[maxn];
int ans[maxn];
// all用来记录位置最远到哪里
int n, m, tot, all;void insert(int &curr, int l, int r, int pos) {sum[++tot] = sum[curr] + 1;left[tot] = left[curr];right[tot] = right[curr];curr = tot;if (l == r) return;int mid = (l + r) >> 1;if (pos <= mid)insert(left[curr], l, mid, pos);elseinsert(right[curr], mid + 1, r, pos);
}
int query(int lt, int rt, int l, int r, int k) {if (l == r) return l;int s = sum[left[rt]] - sum[left[lt]];int mid = (l + r) >> 1;if (k <= s)return query(left[lt], left[rt], l, mid, k);elsereturn query(right[lt], right[rt], mid + 1, r, k - s);
}int main() {freopen("shooting.in", "r", stdin);freopen("shooting.out", "w", stdout);read(n, m);rep(i, 1, n) {read(lx[i], rx[i], sx[i]);all = std::max(all, rx[i]);}rep(i, 1, m) {int x; read(x);a[x].push_back(i);all = std::max(all, x);}rep(i, 1, all) {root[i] = root[i - 1];// 对每个值都依次插入主席树if (!a[i].empty()) {for (unsigned j = 0; j < a[i].size(); ++j)insert(root[i], 1, m, a[i][j]);}}rep(i, 1, n) {// 可能出现木板根本没被打碎的情况if (sum[root[rx[i]]] - sum[root[lx[i] - 1]] < sx[i]) continue;int rp = query(root[lx[i] - 1], root[rx[i]], 1, m, sx[i]);++ans[rp];}rep(i, 1, m) printf("%d\n", ans[i]);return 0;
}

[THUPC2017]天天爱射击 题解(主席树)相关推荐

  1. [THUPC2017] 天天爱射击(整体二分+树状数组)

    洛谷题目传送门 解题思路 我们发现直接做不是很好做 考虑计算每个木板是在第几次射击被射掉的 这显然是具有可二分性的 于是我们考虑整体二分 每次二分中间点 m i d mid mid,然后将时间小于等于 ...

  2. LOJ2402 [THUPC2017] 天天爱射击 / Shooting 二分查找+主席树

    题目链接:传送门 主席树模板题. 把子弹按照xxx排序,另外记录一个ttt,表示子弹射♂出去的时间qwq. 对于每块木板,设它左右端的xxx坐标分别为x1,x2.x1,x2.x1,x2. 二分查找出子 ...

  3. luoguP1600 天天爱跑步(NOIP2016)(主席树+树链剖分)

    阅读体验: https://zybuluo.com/Junlier/note/1303550 为什么这一篇的Markdown炸了? # 天天爱跑步题解(Noip2016)(桶+树上差分 ^ 树剖+主席 ...

  4. 【bzoj4408】[Fjoi 2016]神秘数 主席树

    题目描述 一个可重复数字集合S的神秘数定义为最小的不能被S的子集的和表示的正整数.例如S={1,1,1,4,13}, 1 = 1 2 = 1+1 3 = 1+1+1 4 = 4 5 = 4+1 6 = ...

  5. POJ 2104 K-th Number 主席树(区间第k大)

    题目链接: http://poj.org/problem?id=2104 K-th Number Time Limit: 20000MSMemory Limit: 65536K 问题描述 You ar ...

  6. [noip2016]天天爱跑步(主席树+lca)

    恩..在百度的第一页翻了翻,没有用主席树做的,于是打算水一篇blog: 天天爱跑步 首先有一个解题的关键: 将玩家的向上和向下分成两部分: 先定义几个变量,s是起点,t是终点,wi是每个观察员出现的时 ...

  7. 洛谷 P2468 粟粟的书架 二分(主席树+前缀和)

    传送~:https://www.luogu.org/problem/P2468 看了一下数据也发现是两道题,后边当他是一个序列(n==1)的时候直接主席树二分区间前k大和就行了 但是有一个细节我觉得就 ...

  8. LuoguP2617 Dynamic Rankings (动态主席树学习理解)

    题目地址 题目链接 题解 动态主席树的板子题.动态主席树其实和静态的有很大差别,虽然同样是n个根,但是节点并不能共用,每个根节点表示bit上的一段区间. 所以其实是个树套树的东西来着,外层是bit,内 ...

  9. [湖南集训]更为厉害 树上主席树-以树深度为下下标建立主席树

    题意题解: 首先对于树上某个点a来说,假设点b是a的祖先(也就是在a的上面),那么答案很好计算,也就是min(k,dep[a]−1)∗(size[a]−1)min(k,dep[a]-1)*(size[ ...

最新文章

  1. 通过细胞自动机,AI在「我的世界」学会了盖房子
  2. input框自动填充内容背景颜色为黄色解决方法
  3. 媒体智能-淘宝直播流媒体互动实践 | D2 分享视频+文章
  4. api 另一窗体 之上_12 个设计 API 的安全建议,不要等出事儿了“捶胸顿足”
  5. python dbf 修改_在Python中将数据写入dbf时出错
  6. 【网络安全工程师面试合集】—如何利用Http协议入侵网站
  7. 调试安装php源码,Xdebug的安装与配置,帮助调试PHP程序
  8. wifi驱动总结(2)
  9. FileUpload1.PostedFile.FileName未找到文件或者上传失败
  10. electron仿制百度网盘客户端2(登录界面制作)
  11. ACM图灵奖现状以及得主及其分别分别的贡献
  12. 学习笔记-Speed-Linux
  13. 怎么安装苹果系统mac os x虚拟机
  14. 云服务器和虚拟主,云服务器和虚拟主机
  15. C++ new失败处理
  16. Android 第五章 TextView
  17. nodejs中解决压缩包乱码
  18. python的str()字符串类型的方法详解
  19. 【状语从句练习题】since 的时态问题
  20. 用平常语言介绍神经网络

热门文章

  1. IE8按F12开发人员工具不显示
  2. LB-Link关于设置校园网路由器上网配置的相关说明
  3. js正则验证手机号码
  4. 无法成功完成操作因为文件包含病毒或潜在的垃圾文件
  5. Unity实时接收麦克风音频将音频可视化类卡拉OK效果展示
  6. std::stoi stol stoul stoll stof stod
  7. 逆行时间的 精神。。。病
  8. 施努卡:机器视觉系统有哪几部分组成(机器视觉系统价格)
  9. java堆栈内存_关于 js 与 Java 堆栈内存的一些疑惑
  10. IDEA中pom文件变成蜘蛛图标 或者蚂蚁图标 或者pom文件为灰色