Always keep a beginn|

Creeper_l

园龄:1年3个月粉丝:9关注:13

P7219 [JOISC2020] 星座 3 题解

会发现题目的坐标其实是平面直角坐标系。

我们按 \(y\) 坐标从小到大考虑所有的星星,假设当前考虑到了星星 \(i\)。我们先计算出之前所有能够影响到 \(i\) 的星星的代价和为 \(cost\)(可以用树状数组维护)。然后分类讨论。

\(c_i \le cost\),那么肯定直接将 \(i\) 直接涂黑,因为它更容易影响到后面的星星,并且删除它的代价更小。

\(cost < c_i\),我们可以用一种类似于反悔贪心的思路。先假设把 \(cost\) 全部涂黑,然后在树状数组中的 \([l,r]\) 区间加上 \(c_i-cost\)\([l,r]\) 表示 \(i\) 能影响到的区间),这样之后考虑星星 \(j\) 的时候,如果需要涂黑星星 \(i\),那么 \(cost\) 中的一部分代价也会被加回去(但是不一定全部都加回去,因为 \(cost\) 中的一些星星也会影响 \(j\))。如果不需要涂黑 \(i\),那么肯定也不会计算到 \([l,r]\) 的贡献。

然后就做完了,维护每颗星星的 \([l,r]\) 可以用并查集做。时间复杂度 \(O(n \log n)\)

#include <bits/stdc++.h>
using namespace std;
#define int long long
typedef pair <int,int> pii;
const int MAXN = 2e5 + 10;
int n,a[MAXN],m,x[MAXN],y[MAXN],c[MAXN];
vector <pii> v[MAXN];
vector <int> f[MAXN];  
int tree[MAXN],ans = 0,fal[MAXN],far[MAXN];
inline int Lowbit(int x) {return x & -x;}
inline void Add(int x,int c) {for(;x <= n;x += Lowbit(x)) tree[x] += c;}
inline int Query(int x) {int r = 0;for(;x;x -= Lowbit(x)) r += tree[x];return r;}
inline int Findl(int x) {if(fal[x] == x) return x;return fal[x] = Findl(fal[x]);}
inline int Findr(int x) {if(far[x] == x) return x;return far[x] = Findr(far[x]);}
signed main() {
	cin >> n;
	for(int i = 1;i <= n;i++) cin >> a[i];
	for(int i = 0;i <= n + 1;i++) fal[i] = far[i] = i;
	for(int i = 1;i <= n;i++) f[a[i]].emplace_back(i); 
	cin >> m;
	for(int i = 1;i <= m;i++) 
		cin >> x[i] >> y[i] >> c[i],
		v[y[i]].emplace_back(make_pair(x[i],c[i]));
	for(int i = 1;i <= n;i++) {
		for(pii j : v[i]) {
			int cost = Query(j.first);
			if(j.second <= cost) ans += j.second;
			else ans += cost,
				Add(Findl(j.first) + 1,j.second - cost),
				Add(Findr(j.first),cost - j.second);
		}
		for(int j : f[i]) 
			fal[Findl(j)] = Findl(j - 1),
			far[Findr(j)] = Findr(j + 1);
	} cout << ans; return 0;
}

本文作者:Creeper_l

本文链接:https://www.cnblogs.com/Creeperl/p/18238333

版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。

posted @   Creeper_l  阅读(7)  评论(0编辑  收藏  举报
  1. 1 イエスタデイ(翻自 Official髭男dism) 茶泡饭,春茶,kobasolo
  2. 2 世间美好与你环环相扣 柏松
  3. 3 True love tired
  4. 4 一笑江湖 (DJ弹鼓版) 闻人听書_
  5. 5 最好的安排 曲婉婷
  6. 6 星星在唱歌 司南
  7. 7 山川 李荣浩
  8. 8 On My Way Alan Walker
  9. 9 百战成诗 王者荣耀·100英雄官方群像献礼歌
  10. 10 雪 Distance Capper / 罗言
  11. 11 Edamame bbno$ / Rich Brian
  12. 12 半生雪 七叔-叶泽浩
  13. 13 Catch My Breath Kelly Clarkson
  14. 14 Love Is Gone SLANDER / Dylan Matthew
  15. 15 Endless Summer Alan Walker / Zak Abel
  16. 16 悬溺 葛东琪
  17. 17 风吹丹顶鹤 葛东琪
  18. 18 Normal No More TYSM
  19. 19 哪里都是你 队长
  20. 20 Stronger Kelly Clarkson
  21. 21 廖俊涛
  22. 22 消愁 毛不易
  23. 23 The Runner Yubik
  24. 24 踏山河 七叔-叶泽浩
  25. 25 Waiting For Love Avicii
  26. 26 在你的身边 盛哲
  27. 27 Dream It Possible Delacey
  28. 28 凄美地 郭顶
  29. 29 满天星辰不及你 ycc
  30. 30 侧脸 于果
  31. 31 阿拉斯加海湾 蓝心羽
  32. 32 虞兮叹 闻人听書_
  33. 33 离别开出花 就是南方凯
  34. 34 盗墓笔记·十年人间 李常超 (Lao乾妈)
Waiting For Love - Avicii
00:00 / 00:00
An audio error has occurred, player will skip forward in 2 seconds.
评论
收藏
关注
推荐
深色
回顶
收起
点击右上角即可分享
微信分享提示