qoj.4878 Easy Problem 做题记录

news/2025/10/23 18:44:07/文章来源:https://www.cnblogs.com/Sktn0089/p/19161393

高手。link

惯性思维很容易想到 Hall 定理 + 线段树 去处理,我一直想了 2h+,事实上有另外一种思路。

由于保留的所有区间都覆盖了位置 \(i\),我们考虑贪心做最大匹配:从左到右扫描每个位置,优先用 \(r\) 小的区间做匹配。

这样有个好处,我们可以把匹配的位置分为 \(\le i\)\(\ge i + 1\) 两部分,这两部分有很大的独立性。

我们考虑从左到右扫描线,从右到左进行贪心匹配(即优先匹配 \(l\) 更大的区间)。考虑 \(\ge i + 1\) 的部分,根据 Hall 定理判定匹配的合法性,开一棵线段树维护每个前缀的左部点数量减去右部点数量的最大值。如果最大值 \(\ge 0\),考虑找到第一个最大值的位置 \(p\),再找到 \(r_j\le p\) 的满足 \(l_j\) 最小(优先级最小)的区间 \(j\),然后将对应的匹配移到 \(\le i\) 的部分。删掉的匹配数为最大值减去 \([i + 1, l_j - 1]\) 的最大值,重复此流程即可。

分析复杂度。发现每次更新一次匹配,线段树上至少有一个节点的右儿子最大值从大于左儿子最大值变为不超过左儿子最大值,所以总时间复杂度为 \(\mathcal O(n\log^2 n)\)


  • 理清思路,不要被假做法害了。

  • 如果实在想不到就换个方向,换可小可大。


点击查看代码
#include <bits/stdc++.h>
#define ll int
#define LL long long
#define uLL unsigned LL
#define fi first
#define se second
#define mkp make_pair
#define pir pair<ll, ll>
#define pb push_back
#define i128 __int128
using namespace std;
char buf[1 << 22], *p1, *p2;
// #define getchar() (p1 == p2 && (p2 = (p1 = buf) + fread(buf, 1, (1 << 22) - 10, stdin), p1 == p2)? EOF :
// *p1++)
template <class T>
const inline void rd(T &x) {char ch;bool neg = 0;while (!isdigit(ch = getchar()))if (ch == '-')neg = 1;x = ch - '0';while (isdigit(ch = getchar())) x = (x << 1) + (x << 3) + ch - '0';if (neg)x = -x;
}
const ll maxn = 1e5 + 10, M = 1e6 + 10, mod = 1e9 + 7;
const LL inf = 1e18;
ll power(ll a, ll b = mod - 2, ll p = mod) {ll s = 1;while (b) {if (b & 1)s = 1ll * s * a % p;a = 1ll * a * a % p, b >>= 1;}return s;
}
template <class T, class _T>
const inline ll pls(const T x, const _T y) { return x + y >= mod ? x + y - mod : x + y; }
template <class T, class _T>
const inline ll mus(const T x, const _T y) { return x < y ? x + mod - y : x - y; }
template <class T, class _T>
const inline void add(T &x, const _T y) { x = x + y >= mod ? x + y - mod : x + y; }
template <class T, class _T>
const inline void sub(T &x, const _T y) { x = x < y ? x + mod - y : x - y; }
template <class T, class _T>
const inline void chkmax(T &x, const _T y) { x = x < y ? y : x; }
template <class T, class _T>
const inline void chkmin(T &x, const _T y) { x = x < y ? x : y; }ll T, n, m, a[maxn], l[maxn], r[maxn], c[maxn], b[maxn];
LL sum;
vector <ll> vecl[maxn], vecr[maxn];struct SGT {LL tag[maxn << 2]; pair <LL, ll> mx[maxn << 2];void addtag(ll p, LL v) { mx[p].fi += v, tag[p] += v; }void pushdown(ll p) {addtag(p << 1, tag[p]), addtag(p << 1|1, tag[p]);tag[p] = 0;}void modify(ll p, ll l, ll r, ll x, ll v) {if(l >= x) return addtag(p, v);pushdown(p); ll mid = l + r >> 1;if(x <= mid) modify(p << 1, l, mid, x, v);modify(p << 1|1, mid + 1, r, x, v);mx[p] = max(mx[p << 1], mx[p << 1|1]);}void build(ll p, ll l, ll r) {mx[p] = mkp(0ll, -l), tag[p] = 0;if(l == r) return; ll mid = l + r >> 1;build(p << 1, l, mid), build(p << 1|1, mid + 1, r);}LL query(ll p, ll l, ll r, ll x) {if(r <= x) return mx[p].fi;if(x < l) return -inf;pushdown(p); ll mid = l + r >> 1;return max(query(p << 1, l, mid, x), query(p << 1|1, mid + 1, r, x));}
} tr1, tr2;set <pir> st[maxn];
struct _SGT {pir mn[maxn << 2];void modify(ll p, ll l, ll r, ll x, pir t, ll v) {if(l == r) {if(v == 1) st[l].insert(t);else st[l].erase(t);mn[p] = st[l].empty()? mkp(n + 1, 0) : *st[l].begin();return;} ll mid = l + r >> 1;if(x <= mid) modify(p << 1, l, mid, x, t, v);else modify(p << 1|1, mid + 1, r, x, t, v);mn[p] = min(mn[p << 1], mn[p << 1|1]);}pir query(ll p, ll l, ll r, ll x) {if(r <= x) return mn[p];ll mid = l + r >> 1;if(x <= mid) return query(p << 1, l, mid, x);return min(query(p << 1, l, mid, x), query(p << 1|1, mid + 1, r, x));}
} tr3;void solve() {rd(n), rd(m); sum = 0;tr1.build(1, 1, n), tr2.build(1, 1, n);for(ll i = 1; i <= n; i++) {rd(a[i]), vecl[i].clear(), vecr[i].clear();tr1.modify(1, 1, n, i, -a[i]);}for(ll i = 1; i <= m; i++) {rd(l[i]), rd(r[i]), rd(c[i]);vecl[l[i]].pb(i), vecr[r[i]].pb(i);}for(ll i = 1; i <= n; i++) st[i].clear();for(ll i = 1; i <= 4 * n; i++) tr3.mn[i] = mkp(n + 1, 0);for(ll i = 1; i <= n; i++) {for(ll j: vecr[i - 1]) {sum -= c[j];tr2.modify(1, 1, n, n - l[j] + 1, -c[j]);}tr1.modify(1, 1, n, i, a[i]);tr2.modify(1, 1, n, n - i + 1, -a[i]);for(ll j: vecl[i]) {sum += c[j], b[j] = c[j];tr1.modify(1, 1, n, r[j], c[j]);tr3.modify(1, 1, n, r[j], mkp(l[j], j), 1);}while(tr1.mx[1].fi > 0) {ll pos = -tr1.mx[1].se, id = tr3.query(1, 1, n, pos).se;LL tmp = max(0ll, tr1.query(1, 1, n, pos - 1));ll w = min((LL) b[id], tr1.mx[1].fi - tmp);b[id] -= w, tr1.modify(1, 1, n, r[id], -w);tr2.modify(1, 1, n, n - l[id] + 1, w);if(!b[id]) tr3.modify(1, 1, n, r[id], mkp(l[id], id), -1);}printf("%lld ", sum - max(0ll, tr2.mx[1].fi));} puts("");
}int main() {rd(T); while(T--) solve();return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/944593.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

LLM学习笔记DAY10

📘 大语言模型全面学习笔记 一、大语言模型评测体系 1.1 常见评测指标任务类型 评测指标 说明分类任务 精确率、召回率、F1 基于混淆矩阵计算语言建模 困惑度(PPL) 衡量文本建模概率文本生成 BLEU、ROUGE 衡量与参…

日志级别

日志级别日志级别(Log Levels) 🔊 五种日志级别(从低到高):级别 含义说明 使用场景TRACE 追踪,最详细 用于追踪程序执行的每一步,如方法入参、变量变化。DEBUG 调试,用于诊断问题 记录流程细节,如“用户登录…

noipd8t2 - Slayer

要理解这段代码,需结合题目要求和题解的逆变换 + 辗转相除思路,逐部分分析:题目核心与题解思路 回顾题目要求:给定两个线性变换 \(T1((x,y))=(x+y,y)\)、\(T2((x,y))=(x,x+y)\),对于每个查询向量 \((x,y)\),统计…

OJ模拟面试3(异步判题架构)

1、请详细描述一条判题消息从生产到消费的完整生命周期。你在生产者端、Broker端和消费者端分别做了哪些具体配置和编码保证? 这是一个考察消息队列端到端可靠性的经典问题。我的设计目标是:消息绝不能丢。生产者端 …

Edge浏览器网页设置深色模式(仅搜索结果界面)

偶然清除了Edge的浏览数据后发现搜索结果界面变成了白色,很不适应,于是在网络搜索,基本都非常相似,主要分为两种方法Edge浏览器网页设置深色模式/暗模式的小技巧_网页深色模式-CSDN博客①在Edge浏览器打开edge://f…

2025 年 AI 编程工具 TOP5 排名:谁在重新定义研发效率?

当 “写代码” 从 “手动敲” 变成 “AI 帮你想”,研发效率的天花板被彻底打破。2025 年最新出炉的 AI 编程工具排名,不仅是技术实力的较量,更是企业降本增效的 “选型指南”—— 这 5 款工具,已经帮数万家企业实现…

请求中断的原理与分类

本文分享自天翼云开发者社区《请求中断的原理与分类》.作者:尹****聪 1 中断的原理 在nginx中所有的http请求是流式的处理逻辑,当client发出一个请求后,nginx把请求代理到upstream上。如果upstream已经返回了200 OK…

LLM学习笔记DAY9

大语言模型学习笔记 一、大语言模型的局限性 1.1 规划能力不足示例:汉诺塔问题中步骤错误,缺乏校验与修正机制。 需引入规划策略与反思检查策略。1.2 知识时效性与计算能力不足示例:GPT-4回答“美国总统”错误,数值…

【Go】go学习笔记

# 一、Go基础 ## 1. 编译运行 ``` go // 构建二进制文件 go build hello.go ./hello.gogo run hello.go ```## 2. 数据类型 - 布尔型 - 数字类型 - 字符串 - 派生类型- 指针 pointer- 数组- 结构化类型 struct- channe…

破局内容运营效率:2025 微信编辑器 10 款深度测评

破局内容运营效率:2025 微信编辑器 10 款深度测评2025微信编辑器AI革命:全链路解决方案重塑内容生产 一、引言:运营者的效率焦虑与工具迭代机遇 2025年新媒体行业进入“精耕细作”阶段,一篇爆款推文不仅需要优质内…

Web3 行业 Solidity 高级后端开发工程师岗位要求

基本学历与经验要求学历:本科及以上,计算机科学、软件工程、密码学或相关专业优先。 工作经验:3-5 年后端开发经验,其中至少 2 年 Solidity 智能合约开发经验(强制),参与过实际 Web3 项目(如 DeFi、NFT、DAO、…

2025氮化硼陶瓷高温绝缘体/坩埚/套管/基板/高温构件/耐腐蚀构件推荐榜:福维科(山东)引领国产化,3 家企业凭技术实力登榜

在半导体、新能源等高精制造领域,对关键材料的性能要求持续升级,氮化硼陶瓷因兼具优异导热性、绝缘性与耐温性,成为支撑产业升级的核心材料之一。2025 年,随着高端制造国产化进程加快,具备核心技术与稳定产能的氮…

无需接入执行器,0 代码改造实现微服务任务调度

本篇文章通过分析现有解决方案的不足,提出一种新的轻量级解决方案,该方案无需业务改造,且支持多语言,能够有效解决分布式环境下的任务调度幂等执行以及批处理问题。作者:陈欣渝(恰橙) 概述 在现代分布式系统中,…

利用排列组合法实现TOPN路径计算

本文分享自天翼云开发者社区《利用排列组合法实现TOPN路径计算》.作者:罗****斌 1 背景在进行TOPN选路性能摸底时,发现其在100*100节点级别以上的两两互相探测情况下的选路性能不太理想,整体压测后分析发现,选路算…

达梦数据库获取判断字段中的json数据中的值

达梦数据库获取判断字段中的json数据中的值-- 版本支持情况: -- DM7.1.6及之前版本:不支持原生JSON类型,只能用VARCHAR/CLOB存储 -- DM7.6及以后版本:开始支持JSON相关功能 -- DM8.0及以后版本:完整支持JSO…

2025 废气处理/废气治理/环保/污水/分子筛/除臭设备推荐榜:上海深城以专利技术破局,3 家企业凭场景适配登榜,助力异味治理升级

随着工业生产与市政服务的精细化发展,除臭设备与 VOCs 异味治理需求持续增长,高效、低耗、无二次污染的解决方案成为行业核心诉求。2025 年,我们从技术创新性、案例落地能力、工艺成熟度等维度筛选企业,推出本次推…

API 搜索的下一代形态-Apipost智能搜索:只需用业务语言描述需求,就能精准定位目标接口!

在大型项目中,API 数量庞大、命名不一,导致“找接口”耗时费力。传统工具依赖关键词搜索,难以应对语义模糊或命名不规范的场景。Apipost AI 智能搜索功能,支持自然语言查询,如“和用户登录有关的接口”,系统可理…

2025包装机/全自动包装机/非标定制生产线厂家推荐昆仑智能装备,专业高效!

2025包装机/全自动包装机/非标定制生产线厂家推荐昆仑智能装备,专业高效! 一、包装机械行业面临的技术挑战与创新需求 随着制造业智能化转型的深入,包装机械领域正面临前所未有的技术挑战。根据行业调研数据显示,目…

2025拖鞋机/酒店拖鞋生产线厂家推荐昆仑智能,高效稳定自动化解决方案

2025年拖鞋机/酒店拖鞋生产线厂家推荐昆仑智能,高效稳定自动化解决方案 行业技术挑战与现状分析 在当今快速发展的酒店用品制造领域,拖鞋机和酒店拖鞋生产线面临着多重技术挑战。据行业数据显示,传统拖鞋生产设备的…

2025年口罩机厂家权威推荐榜单:全自动口罩机器,全自动KN95口罩机,高效智能生产线专业选购指南

2025年口罩机厂家权威推荐榜单:全自动口罩机器,全自动KN95口罩机,高效智能生产线专业选购指南 随着全球公共卫生意识的持续提升,口罩作为基础防护用品已从应急物资转变为常态化需求。在产业升级与技术迭代的双重驱…