CF1372F Omkar and Modes 题解
来个乱搞。
思路#
考虑分治。
对于最裸的暴力。
我们可以调用 solve(l, r)
进行查询。
假如这个区间的众数的出现次数是区间长度,那么可以直接退出,否则我们可以继续分治。
我们把这个暴力进行加工一下。
我们知道
-
查询
的区间众数,若完全与 一样,那么可以继续分治下去。 -
若仅有出现次数不一样,那么意味着我们已经知道了这个数的出现位置,可以直接构造答案,从两侧继续分治。
-
若都不一样,我们再查询
的区间众数,可以仿照第一条第二条继续构造。
感觉是一个比较粗糙的做法,但又好像比较难卡。
这个做法的上下界我也不会算,如果有人可以 Hack 也比较正常。
Code#
#include <bits/stdc++.h>
using namespace std;
#define x first
#define y second
// #define int long long
#define mp(x, y) make_pair(x, y)
#define eb(...) emplace_back(__VA_ARGS__)
#define fro(i, x, y) for(int i = (x); i <= (y); i++)
#define pre(i, x, y) for(int i = (x); i >= (y); i--)
inline void JYFILE19();
typedef long long i64;
typedef pair<int, int> PII;
bool ST;
const int N = 1e6 + 10;
const int mod = 998244353;
int n, m, a[N];
map<PII, PII> mp;
inline PII ask(int l, int r) {
if(mp.count({l, r})) {
return mp[{l, r}];
}
cout << "? " << l << " " << r << endl;
int x, f;
cin >> x >> f;
return mp[{l, r}] = {x, f};
}
inline void solve(int l, int r) {
if(l > r) return;
int mid = (l + r) >> 1, x, f;
tie(x, f) = ask(l, r);
if(f == r - l + 1) {
fro(i, l, r) a[i] = x;
return;
}
int y, g, ls, rs;
tie(y, g) = ask(l, mid);
if(x == y && g != f) {
ls = mid - g + 1, rs = ls + f - 1;
fro(i, ls, rs) a[i] = x;
solve(l, ls - 1);
solve(rs + 1, r);
return;
}
if(x == y) {
solve(l, mid);
solve(mid + 1, r);
return;
}
tie(y, g) = ask(mid + 1, r);
if(x == y && g != f) {
rs = mid + g, ls = rs - f + 1;
fro(i, ls, rs) a[i] = x;
solve(l, ls - 1);
solve(rs + 1, r);
return;
}
solve(l, mid);
solve(mid + 1, r);
return;
}
signed main() {
JYFILE19();
cin >> n;
solve(1, n);
cout << "! ";
fro(i, 1, n) {
cout << a[i] << " ";
}
cout <<"\n";
return 0;
}
bool ED;
inline void JYFILE19() {
// freopen("", "r", stdin);
// freopen("", "w", stdout);
ios::sync_with_stdio(0), cin.tie(0);
double MIB = fabs((&ED-&ST)/1048576.), LIM = 32;
cerr << "MEMORY: " << MIB << endl, assert(MIB<=LIM);
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· 写一个简单的SQL生成工具
· AI 智能体引爆开源社区「GitHub 热点速览」
· C#/.NET/.NET Core技术前沿周刊 | 第 29 期(2025年3.1-3.9)