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

CF2161H Cycle Sort

先把序列转 01,考虑对 01 序列编一些做法。

这里造成修改只能是 \(a_{t\bmod n}=1,b_{t\bmod m}=0\),于是我们可以直接扔掉 \(a=0\)\(b=1\) 的位。剩下每个 \(b_j=1\),就是对于 \(t=j+cM\),都有可能使 \(a_{t\bmod n}\leftarrow 0\),对于一个 \(j\),这样的修改只能进行一次。特别地,如果 \(a_i=0\),我们认为有一个 \(t=-\infty\) 的修改。

一个想法是把这些修改挂到每个 \(a\) 上。具体地,对于初始 \(b_j=1\),将修改挂到 \(j\bmod n\) 上。然后每次对于一个点 \(i\),如果其上有 \(\ge 2\) 个标记,就把除最小值外的推到 \((i+m)\bmod n\),并且把修改的时间 \(+m\)。如果一个修改的时间 \(\ge K\),那么说明这个是不会有影响的,就可以直接确定 \(b=0\)。不妨把序列按 \(\bmod \gcd(n,m)\) 分类,然后按照 \(0,m\bmod n,\cdots,((n-1)m)\bmod n\) 的顺序重排,这样每次就是往后 \((i+1)\bmod n\)

然后考虑怎么动态做。每次变化是把一个 \(1\to 0\),也就是新增一个修改。可以发现,如果原来一个修改最终时刻会被推到 \(\ge K\),那么它在之后也没用了。

考虑维护出所有有用的修改。记 \(c_i\) 为有多少个修改一开始被放在 \(i\),那么向后推就是在做类似括号匹配的东西。取出前缀和 \(s_i=\sum\limits_{j\le i}(c_j-1)\),整个序列会被非严格前缀 \(\min\) 划分为若干段,每段 \([l,r]\) 内是匹配的括号序列。同时可以发现,\(l\) 中时间最大的修改一定会被推到 \(r\) 匹配。

那么对于一个新增的修改,可以把它直接加入,判一下所在的段是否满足条件,不满足条件时把左端点处的时间最大的修改删除即可。这个可以线段树维护。复杂度 \(O(n\log n)\)

#include <bits/stdc++.h>
using namespace std;
using ll = long long;const int inf = 1e9;
const int kN = 2e5 + 5, kS = kN * 12;
int n, m, L;
ll K;
int a[kN], b[kN], c[kN], d[kN];
int va[kN], vb[kN], vc[kN], vd[kN];
int na[kN], rk[kN], ord[kN];
priority_queue<int> q[kN];struct Info {int mn, id;Info() { mn = 0, id = -1; }Info(int _mn, int _id) {mn = _mn;id = _id;}
};
Info operator + (Info x, Info y) {return Info(min(x.mn, y.mn),max((x.mn <= y.mn) ? x.id : -inf,(x.mn >= y.mn) ? y.id : -inf));
}#define ls (o << 1)
#define rs (o << 1 | 1)struct SGT {Info info[kS];int tag[kS];void Up(int o) { info[o] = info[ls] + info[rs]; }void Adt(int o, int t) { info[o].mn += t, tag[o] += t; }void Dn(int o) {if(int &t = tag[o]) {Adt(ls, t), Adt(rs, t), t = 0;}}void Init(int o, int l, int r) {tag[o] = 0;if(l == r) return void(info[o] = Info(-1 - l, l));int mid = (l + r) >> 1;Init(ls, l, mid);Init(rs, mid + 1, r);Up(o);}void Update(int o, int l, int r, int x, int y, int 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);}Info Query(int o, int l, int r, int x, int y) {if((l > y) || (r < x)) return Info(0, -1);if((l >= x) && (r <= y)) return info[o];Dn(o);int mid = (l + r) >> 1;return Query(ls, l, mid, x, y) + Query(rs, mid + 1, r, x, y);}int Find(int o, int l, int r, int x, int v) {if(info[o].mn > v) return r + 1;if(l == r) return r;Dn(o);int mid = (l + r) >> 1;if(mid < x) return Find(rs, mid + 1, r, x, v);int lft = Find(ls, l, mid, x, v);return (lft > mid) ? Find(rs, mid + 1, r, x, v) : lft;}
} sgt;void Work(int n, int m, int *a, int *b, int *c, int *d, ll K) {L = n + n + n;sgt.Init(1, 0, L);fill_n(q, n, priority_queue<int> ());for(int i = 0; i < n; i++) {int p = (ll)i * m % n;na[i] = a[p];rk[p] = i;ord[i] = p;}vector<pair<int, int>> vec;for(int i = 0; i < n; i++) {vec.emplace_back(a[i], i);}for(int i = 0; i < m; i++) {vec.emplace_back(b[i], i + n);}sort(vec.begin(), vec.end());auto Update = [&](int p, int v) {sgt.Update(1, 0, L, p, L, v);sgt.Update(1, 0, L, p + n, L, v);sgt.Update(1, 0, L, p + n + n, L, v);};auto AddToken = [&](int p, int tok) -> int {q[p].push(tok);Update(p, 1), p += n;Info info = sgt.Query(1, 0, L, 0, p - 1);int l = info.id + 1;int r = sgt.Find(1, 0, L, l, info.mn);int top = q[l % n].top();if((r <= L) && ((top == -inf) || (top + (ll)(r - l) * m < K))) {return -1 - r;}q[l % n].pop();Update(l % n, -1);return top;};for(auto k : vec) {int val, id, sq = 0;tie(val, id) = k;if(id >= n) id -= n, sq = 1;int p, tok;if(!sq) {p = rk[id], tok = -inf;}else {p = rk[id % n], tok = id;}int v = AddToken(p, tok);if(v >= 0) d[v] = val;else c[ord[(-1 - v) % n]] = val;}
}void Solve() {cin >> n >> m >> K;for(int i = 0; i < n; i++) cin >> a[i];for(int i = 0; i < m; i++) cin >> b[i];int g = __gcd(n, m);for(int r = 0; r < g; r++) {int cn = 0, cm = 0;for(int i = r; i < n; i += g) va[cn++] = a[i];for(int i = r; i < m; i += g) vb[cm++] = b[i];Work(cn, cm, va, vb, vc, vd, K / g + (K % g > r));for(int i = 0, j = r; i < cn; i++, j += g) {c[j] = vc[i];}for(int i = 0, j = r; i < cm; i++, j += g) {d[j] = vd[i];}}for(int i = 0; i < n; i++) {cout << c[i] << " \n" [i == n - 1];}for(int i = 0; i < m; i++) {cout << d[i] << " \n" [i == m - 1];}
}int main() {// freopen("1.in", "r", stdin);// freopen("1.out", "w", stdout);ios::sync_with_stdio(0), cin.tie(0);int t;cin >> t;while(t--) Solve();return 0;
}
http://www.jsqmd.com/news/70928/

相关文章:

  • 上海单片机开发哪家好?实邦电子值得考虑吗? - 速递信息
  • 2025成都火锅排行榜TOP10,本地人私藏清单大公开!老火锅/烧菜火锅/火锅/美食/特色美食/火锅店/社区火锅火锅哪家好吃口碑推荐榜 - 品牌推荐师
  • 上海实邦电子:以嵌入式开发为核心,赋能产品智能化升级 - 速递信息
  • 2025国内稳定性较好的、灵敏度高的、智能高效的镀层检测生产商/知名品牌/优质厂家排名/靠谱厂家/推荐品牌/头部企业 - 品牌推荐大师1
  • 微信小程序定制开发公司哪家专业,定制功能迭代+用户体验优化团队推荐:工单小程序/名片小程序/商城小程序多领域小程序定制开发公司推荐 - 品牌2025
  • 2025 年 12 月 TPE 材料厂家权威推荐榜:TPE原料,TPE颗粒,TPE弹性体,环保高性能定制化供应商深度解析 - 品牌企业推荐师(官方)
  • 详细介绍:SSH 远程登录(Metasploitable 靶机实战)复习总结
  • AI 对大前端项目的冲击,【大前端++】来抵御
  • 2025年黑龙江自闭症学校机构权威榜单:黑龙江孤独症学校/黑龙江自闭症康复学校/黑龙江孤独症康复学校推荐指南 - 品牌推荐官
  • 使用MZM实现QPSK
  • 氧气分析仪生产商哪家好/制造商哪家强/优质供应商推荐/本地厂家/实力厂家/行业十大厂家/十大品牌推荐/烟气氧含量分析仪厂家排名/氧化锆氧量分析仪厂家口碑推荐 - 品牌推荐大师1
  • 2025成都火锅必吃榜:十大热门品牌深度解析,美食/火锅/成都火锅/地摊火锅/社区火锅/牛肉火锅/重庆火锅/老火锅成都火锅品牌有哪些 - 品牌推荐师
  • 系统调用-open()
  • 2025/12/10 今天学的day4的lecode59和54
  • 微信小程序定制开发公司哪家靠谱,合规开发+数据安全双保障服务商推荐:含微信小程序/支付宝小程序/抖音小程序多平台小程序定制开发公司推荐 - 品牌2025
  • 智商题
  • 2025成都火锅必吃榜,十大网红品牌实力推荐,特色美食/社区火锅/烧菜火锅/美食/火锅成都火锅品牌推荐排行榜 - 品牌推荐师
  • 2025年定制离焦镜标杆厂家推荐:童享OK镜,个性化视光解决方案引领者 - 海棠依旧大
  • Python蓝桥杯第二次学习
  • 2025年本地环氧地坪商家排行,看谁的大理石翻新养护更出色,可靠的大理石翻新养护忠博盛涛保洁专注产品质量 - 品牌推荐师
  • python _—— 使用hash函数实现一种类似字典的简易hash存储结构
  • 基于seekdb,教你从零开始构建智能搜书应用
  • 2025 年堪诺培欧探险乐园创始人最新推荐榜,聚焦技术落地能力与安全运营标准深度解析堪诺培欧探险乐园/丛林穿越攀趣探险核心创始人推荐 - 品牌鉴赏师
  • 2025年12月四川德阳结婚专用挂件、婚庆专用挂件、新婚挂饰、婚庆用品、婚礼摆件厂家深度调研 - 2025年11月品牌推荐榜
  • 2025年ai收银机源头厂家推荐榜单:收银机收款‌/银行收银机‌/餐饮收银机一体机源头厂家精选 - 品牌推荐官
  • 在廊坊婚介所的迷茫与重逢
  • 广州GEO优化服务商全景洞察:技术突围与精准选型指南 - 品牌评测官
  • 详细介绍:知乎知学堂/AGI课堂AI大模型全栈工程师培养计划,【第二期】+【第四期】
  • AI招聘系统选择全指南,AI得贤招聘官核心功能与候选人体验感拉满 - 博客万
  • 2025年砂金机器品牌权威推荐榜单:采金设备/采金机械/采金机器源头厂家精选 - 品牌推荐官