提出 #74619466
ソースコード 拡げる
#include <iostream>
#include <vector>
#include <algorithm>
#include <cmath>
using namespace std;
struct Emp { int x, v, id; };
struct Query { int l, r, id; };
int main() {
ios::sync_with_stdio(0); cin.tie(0);
int n, q; cin >> n >> q;
vector<Emp> e(n);
vector<int> vals;
for(int i=0; i<n; ++i) {
cin >> e[i].x >> e[i].v;
vals.push_back(e[i].v);
}
sort(e.begin(), e.end(), [](Emp a, Emp b){ return a.x < b.x; });
sort(vals.begin(), vals.end());
vals.erase(unique(vals.begin(), vals.end()), vals.end());
for(int i=0; i<n; ++i) e[i].v = lower_bound(vals.begin(), vals.end(), e[i].v) - vals.begin();
vector<Query> qs(q);
for(int i=0; i<q; ++i) {
int l, r; cin >> l >> r;
qs[i].l = lower_bound(e.begin(), e.end(), l, [](Emp a, int val){ return a.x < val; }) - e.begin();
qs[i].r = upper_bound(e.begin(), e.end(), r, [](int val, Emp a){ return val < a.x; }) - e.begin() - 1;
qs[i].id = i;
}
int bs = max(1, (int)(n / sqrt(q + 1)));
sort(qs.begin(), qs.end(), [bs](Query a, Query b){
if(a.l/bs != b.l/bs) return a.l < b.l;
return (a.l/bs % 2) ? (a.r < b.r) : (a.r > b.r);
});
vector<long long> ans(q);
vector<int> cnt(vals.size(), 0);
long long pairs = 0, k = 0;
auto add = [&](int i) {
pairs += (k - cnt[e[i].v]); // total elements - those with same score = those with different score
// Actually, we specifically need pairs where V_j > V_i.
// This is complex for Mo's. Let's use the simpler formula:
// Sum of ranks = sum over all i (count of j such that V_j > V_i) + k
};
// Correction: Standard Competition Rank sum logic
// Let f(v) be frequency of score v in range.
// Sum = sum_{v} f(v) * ( (sum_{u > v} f(u)) + 1 )
vector<int> f(vals.size(), 0);
vector<int> bit(vals.size() + 1, 0);
auto update_bit = [&](int idx, int val) {
for(++idx; idx <= vals.size(); idx += idx & -idx) bit[idx] += val;
};
auto query_bit = [&](int idx) {
int s = 0;
for(++idx; idx > 0; idx -= idx & -idx) s += bit[idx];
return s;
};
long long current_sum = 0;
auto add_mo = [&](int i) {
int small = query_bit(e[i].v - 1);
int large = k - query_bit(e[i].v);
current_sum += large; // i is the smaller one in 'large' pairs
current_sum += small; // existing smaller ones now have a new 'larger' neighbor
k++;
f[e[i].v]++;
update_bit(e[i].v, 1);
};
auto rem_mo = [&](int i) {
update_bit(e[i].v, -1);
f[e[i].v]--;
k--;
int small = query_bit(e[i].v - 1);
int large = k - query_bit(e[i].v);
current_sum -= large;
current_sum -= small;
};
int L = 0, R = -1;
for(auto& qry : qs) {
while(R < qry.r) add_mo(++R);
while(L > qry.l) add_mo(--L);
while(R > qry.r) rem_mo(R--);
while(L < qry.l) rem_mo(L++);
ans[qry.id] = current_sum + k;
}
for(long long x : ans) cout << x << "\n";
return 0;
}
提出情報
| 提出日時 | |
|---|---|
| 問題 | E - 社内ランキング |
| ユーザ | pranavaryaRS |
| 言語 | C++23 (GCC 15.2.0) |
| 得点 | 466 |
| コード長 | 3205 Byte |
| 結果 | AC |
| 実行時間 | 595 ms |
| メモリ | 8276 KiB |
コンパイルエラー
./Main.cpp: In lambda function:
./Main.cpp:56:24: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
56 | for(++idx; idx <= vals.size(); idx += idx & -idx) bit[idx] += val;
| ~~~~^~~~~~~~~~~~~~
./Main.cpp: In function 'int main()':
./Main.cpp:42:10: warning: variable 'add' set but not used [-Wunused-but-set-variable]
42 | auto add = [&](int i) {
| ^~~
ジャッジ結果
| セット名 | Sample | All | ||||
|---|---|---|---|---|---|---|
| 得点 / 配点 | 0 / 0 | 466 / 466 | ||||
| 結果 |
|
|
| セット名 | テストケース |
|---|---|
| Sample | sample01.txt, sample02.txt, sample03.txt, sample04.txt, sample05.txt |
| All | sample01.txt, sample02.txt, sample03.txt, sample04.txt, sample05.txt, in01.txt, in02.txt, in03.txt, in04.txt, in05.txt, in06.txt, in07.txt, in08.txt, in09.txt, in10.txt, in11.txt, in12.txt, in13.txt, in14.txt, in15.txt, in16.txt, in17.txt, in18.txt, in19.txt, in20.txt, in21.txt, in22.txt, in23.txt, in24.txt, in25.txt, in26.txt, in27.txt, in28.txt, in29.txt, in30.txt, in31.txt, in32.txt, in33.txt, in34.txt, in35.txt, in36.txt, in37.txt, in38.txt, in39.txt, in40.txt, in41.txt, in42.txt, in43.txt, in44.txt, in45.txt, in46.txt, in47.txt, in48.txt, in49.txt, in50.txt, in51.txt, in52.txt, in53.txt, in54.txt, in55.txt, in56.txt, in57.txt, in58.txt, in59.txt, in60.txt, in61.txt, in62.txt, in63.txt, in64.txt, in65.txt, in66.txt, in67.txt, in68.txt, in69.txt, in70.txt, in71.txt, in72.txt, in73.txt, in74.txt, in75.txt, in76.txt, in77.txt, in78.txt, in79.txt, in80.txt, in81.txt, in82.txt |
| ケース名 | 結果 | 実行時間 | メモリ |
|---|---|---|---|
| in01.txt | AC | 1 ms | 3556 KiB |
| in02.txt | AC | 1 ms | 3544 KiB |
| in03.txt | AC | 1 ms | 3560 KiB |
| in04.txt | AC | 1 ms | 3552 KiB |
| in05.txt | AC | 1 ms | 3556 KiB |
| in06.txt | AC | 107 ms | 6964 KiB |
| in07.txt | AC | 590 ms | 8204 KiB |
| in08.txt | AC | 590 ms | 8112 KiB |
| in09.txt | AC | 26 ms | 7056 KiB |
| in10.txt | AC | 72 ms | 8108 KiB |
| in11.txt | AC | 595 ms | 8164 KiB |
| in12.txt | AC | 245 ms | 7108 KiB |
| in13.txt | AC | 30 ms | 6208 KiB |
| in14.txt | AC | 13 ms | 5196 KiB |
| in15.txt | AC | 14 ms | 6200 KiB |
| in16.txt | AC | 590 ms | 8256 KiB |
| in17.txt | AC | 39 ms | 8108 KiB |
| in18.txt | AC | 42 ms | 8124 KiB |
| in19.txt | AC | 178 ms | 7052 KiB |
| in20.txt | AC | 1 ms | 3608 KiB |
| in21.txt | AC | 38 ms | 8264 KiB |
| in22.txt | AC | 21 ms | 7100 KiB |
| in23.txt | AC | 102 ms | 6976 KiB |
| in24.txt | AC | 343 ms | 8116 KiB |
| in25.txt | AC | 342 ms | 8212 KiB |
| in26.txt | AC | 104 ms | 6968 KiB |
| in27.txt | AC | 348 ms | 6960 KiB |
| in28.txt | AC | 26 ms | 6188 KiB |
| in29.txt | AC | 18 ms | 5252 KiB |
| in30.txt | AC | 47 ms | 8208 KiB |
| in31.txt | AC | 513 ms | 8184 KiB |
| in32.txt | AC | 1 ms | 3556 KiB |
| in33.txt | AC | 1 ms | 3544 KiB |
| in34.txt | AC | 1 ms | 3608 KiB |
| in35.txt | AC | 1 ms | 3524 KiB |
| in36.txt | AC | 32 ms | 7100 KiB |
| in37.txt | AC | 138 ms | 6964 KiB |
| in38.txt | AC | 1 ms | 3664 KiB |
| in39.txt | AC | 1 ms | 3632 KiB |
| in40.txt | AC | 1 ms | 3664 KiB |
| in41.txt | AC | 1 ms | 3568 KiB |
| in42.txt | AC | 1 ms | 3548 KiB |
| in43.txt | AC | 1 ms | 3544 KiB |
| in44.txt | AC | 1 ms | 3544 KiB |
| in45.txt | AC | 1 ms | 3688 KiB |
| in46.txt | AC | 45 ms | 8124 KiB |
| in47.txt | AC | 36 ms | 7012 KiB |
| in48.txt | AC | 207 ms | 8272 KiB |
| in49.txt | AC | 350 ms | 7112 KiB |
| in50.txt | AC | 228 ms | 6964 KiB |
| in51.txt | AC | 39 ms | 7096 KiB |
| in52.txt | AC | 33 ms | 6968 KiB |
| in53.txt | AC | 375 ms | 7692 KiB |
| in54.txt | AC | 43 ms | 8220 KiB |
| in55.txt | AC | 36 ms | 6940 KiB |
| in56.txt | AC | 45 ms | 8276 KiB |
| in57.txt | AC | 46 ms | 8216 KiB |
| in58.txt | AC | 42 ms | 8204 KiB |
| in59.txt | AC | 51 ms | 8120 KiB |
| in60.txt | AC | 233 ms | 6964 KiB |
| in61.txt | AC | 204 ms | 6252 KiB |
| in62.txt | AC | 593 ms | 8104 KiB |
| in63.txt | AC | 584 ms | 7392 KiB |
| in64.txt | AC | 6 ms | 4748 KiB |
| in65.txt | AC | 6 ms | 4780 KiB |
| in66.txt | AC | 1 ms | 3524 KiB |
| in67.txt | AC | 1 ms | 3664 KiB |
| in68.txt | AC | 1 ms | 3556 KiB |
| in69.txt | AC | 1 ms | 3508 KiB |
| in70.txt | AC | 1 ms | 3608 KiB |
| in71.txt | AC | 1 ms | 3524 KiB |
| in72.txt | AC | 1 ms | 3504 KiB |
| in73.txt | AC | 1 ms | 3608 KiB |
| in74.txt | AC | 16 ms | 6196 KiB |
| in75.txt | AC | 16 ms | 6188 KiB |
| in76.txt | AC | 1 ms | 3560 KiB |
| in77.txt | AC | 1 ms | 3620 KiB |
| in78.txt | AC | 1 ms | 3532 KiB |
| in79.txt | AC | 1 ms | 3548 KiB |
| in80.txt | AC | 1 ms | 3504 KiB |
| in81.txt | AC | 192 ms | 8260 KiB |
| in82.txt | AC | 510 ms | 8120 KiB |
| sample01.txt | AC | 1 ms | 3532 KiB |
| sample02.txt | AC | 1 ms | 3544 KiB |
| sample03.txt | AC | 1 ms | 3532 KiB |
| sample04.txt | AC | 1 ms | 3548 KiB |
| sample05.txt | AC | 1 ms | 3544 KiB |