当前位置: 首页 > news >正文

P9528 [JOIST 2022] 蚂蚁与方糖 / Ants and Sugar

这是一个二分图匹配的形式,转成最小割之后要求不存在两个异色点距离 \(\le L\) 且都没割掉。

考虑未被割掉点,贡献形如的是选若干点,异色点距离 \(>L\)。这个可以转化成确定黑点区间 \([l_i,r_i]\) 后,禁用 \([l_i-L,r_i+L]\) 的白点,然后前缀和优化成和 \(l,r\) 相关,形如 \((a_r-b_{r+L})+(b_{l-L}-a_l)\) 的形式,事实上这个可以直接线段树维护。

记前者为 \(A_r\),后者为 \(B_l\)。具体地,类似动态 dp,记录 \(f_{0/1,0/1}\) 表示左右的状态。对于 \(a\) 的修改是容易的,因为我们只关心 \(A,B\) 选的 \(a\) 系数和,这个只和两个 01 mask 有关。

而对于 \(b\) 的修改相对困难一些。因为这个可以拆成区间 \(A,B\) 加和一个区间的 \(B\) 加,前者同上,但是后者我们需要知道划分的连续段数。

观察到后者修改区间长度其实是 \(\le 2L\) 的,这意味着最优解只有一个区间,那么连续段数就容易算了。

#include <bits/stdc++.h>
using namespace std;
using ll = long long;const ll inf = 1e18;
const int kN = 5e5 + 5, kC = kN * 3, kS = kC * 4;
int n, t;
ll L;
struct Opr {int op, x, y;
} opr[kN];
int pos[kC];int P(int x) {return lower_bound(pos + 1, pos + t + 1, x) - pos - 1;
}struct M {ll a[2][2];M(ll _v = -inf) {a[0][0] = a[0][1] = a[1][0] = a[1][1] = _v;}M(ll w, ll x, ll y, ll z) {a[0][0] = w;a[0][1] = x;a[1][0] = y;a[1][1] = z;}
};
M operator * (const M &x, const M &y) {M res (-inf);for(int i : {0, 1}) {for(int j : {0, 1}) {res.a[i][j] = max({x.a[i][0] + y.a[0][j], x.a[i][1] + y.a[1][j], x.a[i][j], y.a[i][j]});}}return res;
}
M& operator += (M &x, const M &y) {for(int i : {0, 1}) {for(int j : {0, 1}) {x.a[i][j] += y.a[i][j];}}return x;
}
bool operator == (const M &x, const M &y) {for(int i : {0, 1}) {for(int j : {0, 1}) {if(x.a[i][j] != y.a[i][j]) return 0;}}return 1;
}#define ls (o << 1)
#define rs (o << 1 | 1)
struct SGT {M info[kS], tag[kS];SGT() {fill_n(info, kS, M (-inf));fill_n(tag, kS, M (0));}void Up(int o) { info[o] = info[ls] * info[rs]; }void Build(int o, int l, int r) {if(l == r) {info[o].a[0][1] = info[o].a[1][0] = 0;return ;}int mid = (l + r) >> 1;Build(ls, l, mid);Build(rs, mid + 1, r);Up(o);}void Adt(int o, const M &t) { info[o] += t, tag[o] += t; }void Dn(int o) {if(tag[o] == M(0)) return ;Adt(ls, tag[o]);Adt(rs, tag[o]);tag[o] = M(0);}void Update(int o, int l, int r, int x, int y, const M &v) {if((l > y) || (r < x)) return ;if((l >= x) && (r <= y)) return Adt(o, v);Dn(o);int mid = (l + r) >> 1;Update(ls, l, mid, x, y, v);Update(rs, mid + 1, r, x, y, v);Up(o);}
} sgt;int main() {// freopen("1.in", "r", stdin);// freopen("1.out", "w", stdout);ios::sync_with_stdio(0), cin.tie(0);cin >> n >> L;pos[++t] = -1 - L;for(int i = 1; i <= n; i++) {cin >> opr[i].op >> opr[i].x >> opr[i].y;pos[++t] = opr[i].x;pos[++t] = opr[i].x - L;pos[++t] = opr[i].x + L;}sort(pos + 1, pos + t + 1);t = unique(pos + 1, pos + t + 1) - pos - 1;ll suma = 0;sgt.Build(1, 1, t);for(int i = 1; i <= n; i++) {int x = opr[i].x, y = opr[i].y;if(opr[i].op == 1) {sgt.Update(1, 1, t, P(x), t, M(0, -y, y, 0));suma += y;}else {int p = P(x - L), q = P(x + L);sgt.Update(1, 1, t, q, t, M(0, y, -y, 0));sgt.Update(1, 1, t, p, q - 1, M(-y, 0, -y, -y));}cout << suma - max(0ll, sgt.info[1].a[0][0]) << "\n";}return 0;
}
http://www.jsqmd.com/news/81549/

相关文章:

  • 环保与实用兼具:塑料方便袋生产厂的靠谱之选 - 工业推荐榜
  • https://codeforces.com/problemset/problem/1487/C
  • 从零到千亿:用Megatron-LM解锁大语言模型训练的终极密码
  • Ink/Stitch:重新定义刺绣设计的开源革命
  • 2025年评价高的防松抗振紧固件/不锈钢紧固件厂家推荐及选择参考 - 行业平台推荐
  • 7个Vim插件开发技巧:从入门到精通的完整指南
  • Go语言深度学习革命:ONNX-Go让AI模型部署变得如此简单
  • Symfony Translation组件版本升级完整教程:快速安全地更新你的多语言应用
  • 28、系统信息收集与sudo程序使用指南
  • 2025年口碑好的紧固件/轨道交通紧固件厂家选购全指南(完整版) - 品牌宣传支持者
  • Qwen3-VL-30B-A3B-FP8:2025多模态AI工业化突破,从实验室走向产业应用
  • PHP程序员正能量自我实现预言的知识体系
  • 如何快速掌握LLM命令行工具:开发者的完整实战指南
  • 25、磁盘分区监控与主机自动ping脚本详解
  • 原木家具资深厂商如何选?行业秘籍大揭秘 - mypinpai
  • 口腔健康系统|口腔医疗|基于java和小程序的口腔健康系统小程序设计与完成(源码+数据库+文档)
  • Qwen3-VL轻量化部署:智能推理引擎重塑多模态应用新体验
  • 原木家具加工厂排名大揭秘:性价比之选在这里 - myqiye
  • Gittyup:轻松掌握Git历史的终极图形化客户端
  • 环保方便袋与塑料方便袋制造企业怎么选?这篇给你答案 - 工业推荐榜
  • Capacitor跨平台开发终极指南:一站式构建iOS、Android与Web应用
  • 39、控制 SSA 磁盘识别灯的脚本详解
  • 五轴走心机/六轴走心机哪家质量好/哪家售后好/哪家口碑好? - 品牌推荐大师
  • 博客搬家了
  • 43、浮点数数学运算与 bc 实用工具详解
  • 环保方便袋与塑料方便袋厂家优选指南 - 工业品牌热点
  • CF1334F Strange Function - Harvey
  • 42、浮点数数学运算与 bc 实用工具详解
  • 47、Shell脚本:菜单创建与消息发送
  • 如何快速配置音频优化工具:Mac用户的完整指南