尧图网站建设 尧图网络
  • 首页
  • 关于我们
  • 服务项目
  • 案例展示
  • 建站流程
  • 资讯中心
  • 联系我们
首页/资讯中心/详情

题解:CF1548E Gregor and the Two Painters

题解:CF1548E Gregor and the Two Painters
📅 发布时间:2026/6/20 14:10:09

很好的题!

题意:给出每行权值 \(a_i\),每列权值 \(b_j\),定义点 \((i,j)\) 权值为 \(a_i+b_j\),问权值 \(\le x\) 的点组成的连通块个数。

做法:

这个题需要用到一个数连通块的技巧,我们对于每个连通块钦定一个代表元,那么我们就只用数有多少个代表元就可以了。这个题中,我们令连通块中权值最小且尽量靠左,如果相同靠左那么就靠上,这样的点为代表元。

那么考虑一个点 \((i,j)\) 如何才能成为代表元,首先要求他肯定权值要 \(\le x\),其次我们考虑 \(la_i,ra_i\),分别代表 \(a\) 序列 \(i\) 前面第一个小于等于 \(a_i\) 的位置,\(ra_i\) 是后面第一个小于的位置,类似定义 \(lb_i,rb_i\),那么为了让 \((i,j)\) 走不到 \((la_i,j),(ra_i,j),(i,lb_j),(i,rb_j)\)。可能你会疑惑为什么只需要这四个点,手完一下发现 \(x\in[la_i+1,ra_i-1],y\in[lb_i+1,rb_i-1]\) 这样的点一定不会比 \((i,j)\) 优,而这四个点是比 \((i,j)\) 优且最容易得到的。

以 \((la_i,j)\) 举例,我们就得要求 \(mxla = \max\limits_{t=la_i}^ia_t+b_j>x\),否则就越过去了,同理写出来四个限制,当然对于 \(a,b\) 的两个限制完全可以合在一起,这样就只有两个限制,即假设 \(va_i = \min(\max\limits_{t=la_i}^ia_t,\max\limits_{t=i}^{ra_i}a_t)\),\(vb_j\) 类似定义,那么就要求:

\[a_i+b_j\le x,a_i+vb_j>x,va_i+b_j>x \]

把 \(j\) 相关的全部扔到右边去,然后就是一个二位偏序,复杂度 \(O(n\log n)\)。

代码:

#include <bits/stdc++.h>
using namespace std;
#define int long long
const int maxn = 4e5 + 5, inf = 2e9;
int n, m, x, a[maxn], b[maxn], nw;
int st[maxn][21], lg[maxn];
void init(int v[], int n) {for (int i = 1; i <= n; i++)st[i][0] = v[i];for (int j = 1; (1 << j) <= n; j++)for (int i = 1; i + (1 << j) - 1 <= n; i++)st[i][j] = max(st[i][j - 1], st[i + (1 << j - 1)][j - 1]);lg[0] = -1;for (int i = 1; i <= n; i++)lg[i] = lg[i >> 1] + 1;
}
int query(int l, int r) {if(l == 0 || r == nw + 1)return inf;int k = lg[r - l + 1];return max(st[l][k], st[r - (1 << k) + 1][k]);
}
struct node {int x, y, id;friend bool operator<(node x, node y) {return (x.x != y.x ? x.x > y.x : x.id > y.id);}
} t[maxn];
int stk[maxn], l[maxn], r[maxn], top, tot;
void solve1() {top = 0;nw = n;stk[0] = 0;for (int i = 1; i <= n; i++) {while(top && a[stk[top]] > a[i])top--;l[i] = stk[top];stk[++top] = i;}top = 0;stk[0] = n + 1;for (int i = n; i >= 1; i--) {while(top && a[stk[top]] >= a[i])top--;r[i] = stk[top];stk[++top] = i;}for (int i = 1; i <= n; i++) {int val = min(query(l[i], i), query(i, r[i]));//	cout << i << " " << val << " " << r[i] << endl;t[++tot] = {val, a[i], 0};}
}
void solve2() {stk[0] = 0;nw = m;top = 0;for (int i = 1; i <= m; i++) {while(top && b[stk[top]] > b[i])top--;l[i] = stk[top];stk[++top] = i;}top = 0;stk[0] = m + 1;for (int i = m; i >= 1; i--) {while(top && b[stk[top]] >= b[i])top--;r[i] = stk[top];stk[++top] = i;}for (int i = 1; i <= m; i++) {int val = min(query(l[i], i), query(i, r[i]));//	cout << i << " " << val << " " << l[i] << " " << r[i] << " " << query(i, r[i]) << endl;t[++tot] = {x - b[i], x - val, 1};}
}
#define lowbit(x) (x & (-x))
struct Tree_array {int tr[maxn], n;void add(int x, int val) {while(x <= n)tr[x] += val, x += lowbit(x);}int query(int x) {int ans = 0;while(x > 0)ans += tr[x], x -= lowbit(x);return ans;}int queryseg(int l, int r) {return query(r) - query(l - 1);}
} tree;
int ans = 0;
void solve() {tree.n = x;sort(t + 1, t + tot + 1);for (int i = 1; i <= tot; i++) {//	cout << t[i].x << " " << t[i].y << " " << t[i].id << endl;if(t[i].id == 1)ans += tree.queryseg(t[i].y + 1, t[i].x);elsetree.add(t[i].y, 1);}
}
signed main() {cin >> n >> m >> x;for (int i = 1; i <= n; i++)cin >> a[i];for (int i = 1; i <= m; i++)cin >> b[i];init(a, n);solve1();init(b, m);solve2();solve();cout << ans << endl;return 0;
}

相关新闻

  • Gitee DevOps:重塑中国软件开发效率的新范式
  • C语言数组与函数实践应用项目--扫雷游戏 - 指南
  • 油猴脚本-自动刷新网页

最新新闻

  • 北京外国语大学考研辅导班TOP推荐:核心指南与深度拆解 - michalwang
  • 嘉湖黄金回收大摸底!平湖海宁嘉善三地亲测,这三家店让街坊们彻底放心 - 百福黄金回收
  • 综合能力实训笔记——2026.6.4
  • Python setuptools高危漏洞解析:供应链攻击与安全加固实践
  • 视频压缩革命:如何用开源工具CompressO让文件体积缩小90%而不失画质
  • 2026 年大同厨卫屋顶防水修缮三家对比测评 吉修匠 99.8 分稳居榜首 - 吉修匠

日新闻

  • 信任的进化:技术实现详解——如何用JavaScript构建博弈论模拟器
  • Terrakube自定义工作流:如何集成OPA、Infracost等工具扩展IaC能力
  • grunt-concurrent快速入门:5分钟学会并行运行Grunt任务

周新闻

  • 3步解锁iOS设备:applera1n激活锁绕过完全指南
  • 39 2026 人工智能证书终极盘点,普通人选 AI 证书可以从这些方向入手
  • Redis 暴露公网有多危险?从端口检查到补救步骤

月新闻

  • 【总结】入门篇:50句话让你记住架构核心概念
  • WeChatMsg技术方案解析:实现Mac微信数据自主管理的完整解决方案
  • WeChatMsg:革新性微信数据备份方案,打造你的专属数字记忆库

关于尧图

  • 公司简介
  • 团队介绍
  • 企业文化
  • 荣誉资质

服务项目

  • 定制开发
  • 电商建站
  • UI 设计
  • 运维服务

快速链接

  • 案例展示
  • 建站流程
  • 常见问题
  • 资讯中心

联系方式

  • 📍北京市朝阳区互联网产业园 A 座 10 层
  • 📞400-888-8888
  • ✉️contact@rkmt.cn
  • 🕐周一至周日 9:00-21:00

© 2024 北京尧图网络科技有限公司 版权所有 | 京 ICP 备 XXXXXXXX 号