首页 > 其他分享 >CF777E题解

CF777E题解

时间:2023-10-28 14:22:41浏览次数:25  
标签:lazy rs int 题解 CF777E maxn ls max

  • 分析

    看到这个题就想到了二维偏序。
    你们很自然地,以 \(b\) 为第一关键字降序排序,当有若干个片 \(b\) 相等时,我们发现由于 \(a < b\),所以排到最后的片一定能把这些 \(b\) 相等的片都统计上,而前面的片能否统计是依赖于 \(b\),所以考虑如何让后面的片更好统计,显然 \(a\) 越小越好统计,于是将 \(a\) 降序排序。
    我们可以直接从前向后 DP,因为在前面的点的 \(b\) 必然不小于当前 \(b\),所以我们在转移的时候只需要考虑转移 \(a\) 小于当前 \(b\) 的数,那么直接想到二维偏序的做法,将 DP 值存入 \(a\) 下标,用线段树快速统计 \([1,b-1]\)(即 \([1,b)\)) 下标范围内最大值转移,然后再将新的 DP 值存入当前 \(a\) 下标。
    这样总时间复杂度就是 \(\mathcal{O(n \log n)}\),可以通过本题。

  • 代码

#include <iostream>
#include <algorithm>
#define int long long
using namespace std;
constexpr int MAXN(1000007);
int maxn[MAXN], lazy[MAXN], w[MAXN];
int n, tot;
inline void read(int &temp) { cin >> temp; }
struct node{
	int a, b, h;
	friend bool operator < (node x, node y) {
		if (x.b == y.b)  return x.a > y.a;
		return x.b > y.b;
	}
}a[MAXN];
struct SGT{
	#define ls (p << 1)
	#define rs (p << 1 | 1)
	#define mid ((l + r) >> 1)
	inline void pushup(int p) { maxn[p] = max(maxn[ls], maxn[rs]); }
	inline void pushdown(int p) {
		maxn[ls] = max(maxn[ls], lazy[p]), maxn[rs] = max(maxn[rs], lazy[p]);
		lazy[ls] = max(lazy[ls], lazy[p]), lazy[rs] = max(lazy[rs], lazy[p]);
		lazy[p] = 0;
	}
	void update(int p, int l, int r, int x, int val) {
		if (l == r)  return maxn[p] = max(maxn[p], val), lazy[p] = max(maxn[p], val), void();
		if (lazy[p])  pushdown(p);
		if (x <= mid)  update(ls, l, mid, x, val);
		else  update(rs, mid + 1, r, x, val);
		pushup(p);
	}
	int query(int p, int l, int r, int s, int t) {
		if (s <= l && t >= r)  return maxn[p];
		if (lazy[p])  pushdown(p);
		int res(0);
		if (s <= mid)  res = max(res, query(ls, l, mid, s, t));
		if (t > mid)  res = max(res, query(rs, mid + 1, r, s, t));
		return res;
	}
}Miku;
signed main() {
	ios::sync_with_stdio(false), cin.tie(nullptr), cout.tie(nullptr);
	read(n);
	for (int i(1); i <= n; ++i)  read(a[i].a), read(a[i].b), read(a[i].h), w[++tot] = a[i].a, w[++tot] = a[i].b;
	sort(w + 1, w + tot + 1);
	tot = unique(w + 1, w + tot + 1) - w - 1;
	for (int i(1); i <= n; ++i)  a[i].a = lower_bound(w + 1, w + tot + 1, a[i].a) - w, a[i].b = lower_bound(w + 1, w + tot + 1, a[i].b) - w;
	sort(a + 1, a + n + 1);
	for (int i(1); i <= n; ++i) {
		int x = Miku.query(1, 1, tot, 1, a[i].b - 1);
		Miku.update(1, 1, tot, a[i].a, x + a[i].h);
	}
	cout << Miku.query(1, 1, tot, 1, tot) << endl;
	return 0;
}

标签:lazy,rs,int,题解,CF777E,maxn,ls,max
From: https://www.cnblogs.com/Kazdale/p/17794042.html

相关文章

  • NOIP2023模拟5联测26 题解
    NOIP2023模拟5联测26题解感觉我这场的官方题解写的是真的挺好的,所以我只能作少量补充。你可以直接去看官方题解,如果你想的话。T1x题解\(n=2\)没啥可说的。\(\color{white}{这档分你要是没拿到那你还是蛮强的。}\)\(n=3\)的时候,我们需要比较\((a_1^{a_2})^{a_3}\)与......
  • [TopCoder 13001] BigO 题解
    [TopCoder13001]BigO题解题目描述给定一张有向图,当\(L\)趋近于无穷大时,长度为\(L\)的路径条数有\(S\)条,此时若\(S=O(L^k)\),输出\(k\),否则如果没有多项式的大O表示法,输出\(-1\)。指数情况首先如果一张图中存在如下强连通分量,则\(S=O(2^L)\)。因为每次到1......
  • P7650 题解
    非常好题目,第一步都想不出来。可以观察出来最优方案必定是从大往小将\(x\)放到\(x+1\)前,有可能不动,中间的比他小的一定要放到前面去。考虑用dp计算最小值。这里是这道题最重要的一步:相对位置的变化非常不好描述,考虑将所有数固定。一次操作改为:不影响其他其他数的位置,将一......
  • 题解 P4285 [SHOI2008] 汉诺塔
    具体思路设\(f_{i,x}\)表示\(i\)个盘子从\(x\)柱子出发的步数。设\(g_{i,x}\)表示\(i\)个盘子从\(x\)柱子出发到哪个柱子。记\(y=g_{i-1,x}\),\(z=6-x-y\)。其中,\(y\)代表将前\(i-1\)个盘子从\(x\)柱子移到的柱子,\(z\)代表剩下的那个柱子。分类讨论。若......
  • P2230 Tinux系统 题解
    传送门提供一种基于贪心的解法。首先是将\(p\)从小到大排序考虑到该系统是一棵树,所以对于系统中的每个点,我们记:\(tr_{son}\)表示该点(目录)的儿子的位置\(tr_{fa}\)表示该点(目录)的父亲的位置\(tr_{siz}\)表示该点(目录)包含的点的个数\(tr_{cnt}\)表示该点(目录)有......
  • YACS 2023年10月月赛 甲组 题解
    目前只有T2,其他题目我在看。题目链接1题目链接2题目链接3T2很简单的一道题,将图分为若干个连通块,然后分别求最小生成树。从货车运输中得到的结论,最小生成树等价于最小边权上限生成树,也就是它也能够保证选出边中最大的边权最小。而题目中明确说了这个最小生成树的权值是其中......
  • [NOI2010] 超级钢琴 题解
    [NOI2010]超级钢琴题解说点闲话原本不想写这个题解的但是看到我的代码居然长度为2048B->刚好2KiB,然后还跟题号相同QAQ题目翻译给你一段序列,求出其中从第\(1\)大到第\(k\)大的子区间的和。思路解析首先可以想到一个简单的暴力,对于每一个区间开头\(i\),和区间结尾\(j\),都求......
  • 2023 CSP-J2 T1,2,3题解
    今年的\(CSP−J\)对本蒟蒻来说有点难度。。。A[CSP-J2023]小苹果题目描述小Y的桌子上放着\(n\)个苹果从左到右排成一列,编号为从\(1\)到\(n\)。小苞是小Y的好朋友,每天她都会从中拿走一些苹果。每天在拿的时候,小苞都是从左侧第\(1\)个苹果开始、每隔\(2\)个......
  • [TJOI2013] 松鼠聚会 题解
    [TJOI2013]松鼠聚会题解切比雪夫距离切比雪夫距离指的是在平面上的两个点\((x_1,y_1)\),\((x_2,y_2)\)之间横纵坐标之差绝对值中的大者。用公式表示则是\(f(a,b)=max(|x_a-x_b|,|y_a-y_b|)\)。切比雪夫距离与曼哈顿距离之间可以相互转换切比雪夫—>曼哈顿:\((x_1,y_1)\),\((x......
  • [NOIP 2013提高组]货车运输 题解
    [NOIP2013提高组]货车运输题解前置知识Kruskal重构树(内含讲解)+任意一种LCA题目翻译\(n\)座城市,\(m\)条道路,\(q\)次询问,每次求两个点\(x,y\)之间所有路径的最小值的最大值。题目分析其实学了Kruskal重构树差不多看到这个题目就知道怎么写了。其实就是Kruskal重构树的板子,......