結果
| 問題 |
No.5010 Better Mo's Algorithm is Needed!! (Unweighted)
|
| コンテスト | |
| ユーザー |
|
| 提出日時 | 2022-12-17 11:37:10 |
| 言語 | C++17(gcc12) (gcc 12.3.0 + boost 1.87.0) |
| 結果 |
AC
|
| 実行時間 | 93 ms / 5,000 ms |
| コード長 | 2,196 bytes |
| コンパイル時間 | 4,572 ms |
| 実行使用メモリ | 14,472 KB |
| スコア | 16,079,433,607 |
| 最終ジャッジ日時 | 2022-12-17 11:38:06 |
| 合計ジャッジ時間 | 53,324 ms |
|
ジャッジサーバーID (参考情報) |
judge11 / judge13 |
| 純コード判定しない問題か言語 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| other | AC * 120 |
ソースコード
#pragma GCC optimize("O3")
#pragma GCC optimize("unroll-loops")
#include <bits/stdc++.h>
//#include <atcoder/all>
using namespace std;
//using namespace atcoder;
#define ll long long int
constexpr double time_limit = 4.8;
struct Input {
int n, q, wt, st;
vector<ll> w;
vector<pair<int,int>> lr;
void input() {
ios::sync_with_stdio(false);
cin.tie(nullptr);
cin >> n >> q >> wt >> st;
w.resize(n);
for (int i = 0; i < n; ++i) {
cin >> w[i];
}
lr.resize(q);
for (int i = 0; i < q; ++i) {
cin >> lr[i].first >> lr[i].second;
}
}
};
struct Solver {
int n, q, wt, st;
vector<ll> w;
vector<pair<int,int>> lr;
vector<ll> cs; // cumulative sum of w
vector<int> p;
Solver(const Input& input) {
n = input.n;
q = input.q;
wt = input.wt;
st = input.st;
w = input.w;
lr = input.lr;
// initialize cs
cs.resize(n + 1, 0);
for (int i = 0; i < n; ++i) {
cs[i + 1] = cs[i] + w[i];
}
}
void mo() {
int sqrt_n = (int)sqrt(n) + 1;
vector<vector<pair<int,int>>> groups(sqrt_n + 1);
for (int i = 0; i < q; ++i) {
auto [l, r] = lr[i];
groups[sqrt_n * cs[l] / cs.back()].push_back({r, i});
}
p.clear();
p.reserve(q);
bool flag = false;
for (vector<pair<int,int>>& group : groups) {
if (group.empty()) {
continue;
}
sort(group.begin(), group.end());
if (flag) {
reverse(group.begin(), group.end());
}
for (auto [_, i] : group) {
p.push_back(i);
}
flag ^= true;
}
}
void print() {
for (int i = 0; i < q; ++i) {
cout << p[i] + 1;
if (i == q - 1) {
cout << "\n";
} else {
cout << " ";
}
}
}
};
int main() {
Input input;
input.input();
Solver solver(input);
solver.mo();
solver.print();
return 0;
}