首页 > 其他分享 >洛谷 P5996 [PA2014] Muzeum

洛谷 P5996 [PA2014] Muzeum

时间:2024-01-11 17:02:14浏览次数:31  
标签:P5996 洛谷 二元 Muzeum typedef long 警察 手办 define

洛谷传送门

考虑最大权闭合子图,第 \(i\) 个手办建点 \(i\),第 \(i\) 个警察建点 \(i'\)。我们有一些边:\(\forall i, (S, i, v_i), (i', T, v_i)\),以及对于能看见第 \(i\) 个手办的第 \(j\) 个警察,有 \((i, j', \infty)\)。手办的 \(\sum v_i\) 减去最小割(最大流)即为答案。

考虑转换坐标系,\((x, y) \to (hx + wy, hx - wy)\)。那么第 \(i\) 个警察能看见第 \(j\) 个手办当且仅当 \(x_i \ge x_j \land y_i \le y_j\)。

但是显然最大流复杂度会炸。考虑模拟最大流。下面部分和 CF1895G Two Characters, Two Colors 有点类似。

首先显然把警察和手办都按 \(x\) 排序。那么我们扫警察时可以先处理 \(x\) 这维的偏序。

我们可以先让 \(v_i\) 的流量从 \(S\) 流到 \(i\)。然后用一个二元组 \((y, v)\) 表示一个纵坐标为 \(y\) 的点还有 \(v\) 单位流量。那么我们扫警察时把所有 \(x\) 比它小的二元组加入。

然后我们现在对于一个警察,它还能往汇点流 \(v_i\) 的流量。考虑贪心地从 \(y\) 坐标不小于它且最小的二元组获取流量。因为 \(y\) 越小的二元组可能的连边就越少,我们从 \(y\) 更大的二元组获取流量不会变优。

所以我们用 set 维护这些二元组,就可以直接 lower_bound 找对应的二元组了。

时间复杂度 \(O((n + m) \log m)\)。

code
// Problem: P5996 [PA2014] Muzeum
// Contest: Luogu
// URL: https://www.luogu.com.cn/problem/P5996
// Memory Limit: 125 MB
// Time Limit: 1000 ms
// 
// Powered by CP Editor (https://cpeditor.org)

#include <bits/stdc++.h>
#define pb emplace_back
#define fst first
#define scd second
#define mkp make_pair
#define mems(a, x) memset((a), (x), sizeof(a))

using namespace std;
typedef long long ll;
typedef double db;
typedef unsigned long long ull;
typedef long double ldb;
typedef pair<ll, ll> pii;

const int maxn = 200100;

ll n, m, A, B;
struct node {
	ll x, y, z;
} a[maxn], b[maxn];

void solve() {
	scanf("%lld%lld%lld%lld", &n, &m, &A, &B);
	ll ans = 0;
	for (int i = 1; i <= n; ++i) {
		scanf("%lld%lld%lld", &a[i].x, &a[i].y, &a[i].z);
		ll x = a[i].x * B + a[i].y * A, y = a[i].x * B - a[i].y * A;
		a[i].x = x;
		a[i].y = y;
		ans += a[i].z;
	}
	for (int i = 1; i <= m; ++i) {
		scanf("%lld%lld%lld", &b[i].x, &b[i].y, &b[i].z);
		ll x = b[i].x * B + b[i].y * A, y = b[i].x * B - b[i].y * A;
		b[i].x = x;
		b[i].y = y;
	}
	sort(a + 1, a + n + 1, [&](const node &a, const node &b) {
		return a.x < b.x;
	});
	sort(b + 1, b + m + 1, [&](const node &a, const node &b) {
		return a.x < b.x;
	});
	multiset<pii> S;
	for (int i = 1, j = 1; i <= m; ++i) {
		while (j <= n && a[j].x <= b[i].x) {
			S.emplace(a[j].y, a[j].z);
			++j;
		}
		ll d = b[i].z;
		while (d && S.size()) {
			auto it = S.lower_bound(mkp(b[i].y, 0));
			if (it == S.end()) {
				break;
			}
			pii p = *it;
			S.erase(it);
			ll mn = min(d, p.scd);
			d -= mn;
			p.scd -= mn;
			ans -= mn;
			if (p.scd) {
				S.insert(p);
			}
		}
	}
	printf("%lld\n", ans);
}

int main() {
	int T = 1;
	// scanf("%d", &T);
	while (T--) {
		solve();
	}
	return 0;
}

标签:P5996,洛谷,二元,Muzeum,typedef,long,警察,手办,define
From: https://www.cnblogs.com/zltzlt-blog/p/17958922

相关文章

  • 双向广搜->字符变换(洛谷P1032)
    题意:给起始和终止串A和B,以及不超过6个字符串变换规则,求A->B能否在10步以内变换完成。分析:暴力bfs每次有6条路可以走,时间复杂度是6^10大概6e8的时间复杂度,会TLE。于是这题是一道经典的双向bfs。直接开两个队列,两个map,暴力搜1~5步即可。双向bfs的时间复杂度是2*(6^5)=1e4......
  • 洛谷 P7409 SvT
    洛谷传送门考虑对反串建SAM,设\([i,n]\)的后缀对应SAM的点是\(a_i\)。那么\(\text{lcp}(s[i:n],s[j:n])=\text{len}(\text{lca}(a_i,a_j))\)。于是问题变成了,给定一些点,统计两两\(\text{lca}\)点权之和。考虑建虚树,枚举每个点\(u\)作为\(\text{lca}\)的......
  • 洛谷火柴人
    importjava.io.BufferedReader;importjava.io.InputStreamReader;importjava.io.StreamTokenizer;publicclassMain{staticintn;staticintnumber=0;staticint[]arr=newint[20000];staticboolean[]st=newboolean[20000];sta......
  • 【LGR-170-Div.3】洛谷基础赛 #6 & Cfz Round 3 & Caféforces #2
    这套题感觉质量很高A.Battle\[x\equivr(\bmodP)\]\[P\midx-r\]因此只有第一次操作是有效的voidsolve(){ intn,m,p; cin>>n>>m>>p; m-=m%p; if(!m)puts("Alice"); else{ n-=n%p; if(!n)puts("Bob"); else......
  • 洛谷 P5311 [Ynoi2011] 成都七中
    洛谷传送门转化一下题意,变成求\(x\)在只经过编号\(\in[l,r]\)的点,能走到多少种颜色。考虑建出点分树。一个结论是原树上的一个连通块,一定存在一个点,使得它在点分树上的子树完全包含这个连通块的所有点。证明考虑点分治的过程,一个连通块如果没被其中一个点剖开就一定在同一......
  • 洛谷 P9058 [Ynoi2004] rpmtdq
    洛谷传送门类比P9062[Ynoi2002]AdaptiveHsearch&Lsearch处理区间最近点对的思路,尝试只保留可能有贡献的点对。处理树上路径容易想到点分治。设点\(u\)到分治中心的距离为\(a_u\)。我们有\(\text{dis}(u,v)\lea_u+a_v\)。考虑一个点对\((u,v)\)什么时候一定没......
  • 洛谷B3611 【模板】传递闭包 floyd/bitset
    目录floydbitset优化题目链接:https://www.luogu.com.cn/problem/B3611参考题解:https://www.luogu.com.cn/blog/53022/solution-b3611floyd#include<bits/stdc++.h>usingnamespacestd;constintmaxn=101;intn,f[maxn][maxn];intmain(){scanf("%d"......
  • 洛谷B3647 【模板】Floyd 题解 floyd算法 求 多源多汇最短路
    题目链接:https://www.luogu.com.cn/problem/B3647floyd算法:https://oi-wiki.org/graph/shortest-path/#floyd-算法示例程序:#include<bits/stdc++.h>usingnamespacestd;constintmaxn=101;intn,m,f[maxn][maxn];intmain(){scanf("%d%d",&n......
  • 【题解】洛谷P1496 火烧赤壁 (离散化)
    P1496火烧赤壁-洛谷|计算机科学教育新生态(luogu.com.cn)我们首先先看数据,n<=20000,数据不多,但是范围大(-10^9<=Ai,Bi<=10^9),这时,就可以用离散化了。但是在这里我们会遇到区间重合的问题(也可以使用区间合并),如下图本题的题意是让我们求出燃烧位置的长度之和。区间重合时只......
  • 【题解】洛谷P1068 [NOIP2009 普及组] 分数线划定 (map)
    ##题目描述世博会志愿者的选拔工作正在A市如火如荼的进行。为了选拔最合适的人才,A市对所有报名的选手进行了笔试,笔试分数达到面试分数线的选手方可进入面试。面试分数线根据计划录取人数的$150\%$划定,即如果计划录取$m$名志愿者,则面试分数线为排名第$m\times150\%$(向......