QOJ.ac
QOJ
ID | 题目 | 提交者 | 结果 | 用时 | 内存 | 语言 | 文件大小 | 提交时间 | 测评时间 |
---|---|---|---|---|---|---|---|---|---|
#248873 | #6656. 先人类的人类选别 | zzpcd | RE | 0ms | 0kb | C++17 | 2.7kb | 2023-11-11 22:23:24 | 2023-11-11 22:23:25 |
answer
#include<bits/stdc++.h>
using namespace std;
const int MN = 5e5 + 5;
using ll = long long;
int n, m, a[MN];
int num[MN], N;
struct que{
int x, l, r;
}q[MN];
namespace zkw{
struct Node{
ll v;
int num;
int ls, rs;
}T[MN * 20];
int N, rt[MN];
void add(int& x, int y, int l, int r, int pos) {
if(!x) x = ++N;
if(l == r) {
T[x] = T[y];
T[x].num++;
T[x].v += num[pos];
return;
}
int mid = l + r >> 1;
if(pos <= mid)
add(T[x].ls, T[y].ls, l, mid, pos),
T[x].rs = T[y].rs;
else
add(T[x].rs, T[y].rs, mid + 1, r, pos),
T[x].ls = T[y].ls;
T[x].num = T[T[x].ls].num + T[T[x].rs].num;
T[x].v = T[T[x].ls].v + T[T[x].rs].v;
}
void add2(int& x, int l, int r, int pos) {
if(!x) x = ++N;
if(l == r) {
T[x].num++;
T[x].v += num[pos];
return;
}
int mid = l + r >> 1;
if(pos <= mid)
add2(T[x].ls, l, mid, pos);
else
add2(T[x].rs, mid + 1, r, pos);
T[x].num = T[T[x].ls].num + T[T[x].rs].num;
T[x].v = T[T[x].ls].v + T[T[x].rs].v;
}
ll query(int x, int y, int l, int r, int k) {
if(l == r) {
return (ll)k * num[l];
}
int mid = l + r >> 1;
if(k <= T[T[x].rs].num + T[T[y].rs].num)
return query(T[x].rs, T[y].rs, mid + 1, r, k);
return T[T[x].rs].v + T[T[y].rs].v + query(T[x].ls, T[y].ls, l, mid, k - (T[T[x].rs].num + T[T[y].rs].num));
}
}
using zkw::rt;
int main() {
ios::sync_with_stdio(false);
cin.tie(nullptr);
cout.tie(nullptr);
cin >> n >> m;
for(int i = 1; i <= n; i++) {
cin >> a[i];
num[i] = a[i];
}
N = n + m;
for(int i = 1; i <= m; i++) {
cin >> q[i].x >> q[i].l >> q[i].r;
num[i + n] = q[i].x;
}
sort(num + 1, num + 1 + N);
N = unique(num + 1, num + 1 + N) - num - 1;
for(int i = 1; i <= n; i++)
zkw::add(rt[i], rt[i - 1], 1, N, lower_bound(num + 1, num + 1 + N, a[i]) - num);
for(int i = 1; i <= m; i++) {
auto [x, l, r] = q[i];
zkw::add2(rt[n + 1], 1, N, lower_bound(num + 1, num + 1 + N, x) - num);
// cerr << zkw::query(rt[1], rt[n + 1], 1, N, 1) << "\n";
// cerr << zkw::T[rt[1]].v << "\n";
cout << zkw::query(rt[r], rt[n + 1], 1, N, r) - zkw::query(rt[l - 1], rt[n + 1], 1, N, l - 1) << "\n";
}
}
/*
6 8
1 6 1 3 5 4
2 3 6
3 3 4
2 4 4
6 3 5
4 1 1
4 2 3
2 4 6
1 3 3
6 1
1 6 1 3 5 4
2 1 6
*/
詳細信息
Test #1:
score: 0
Runtime Error
input:
499998 499999 225823 463012 151183 217174 254116 87516 430524 123887 1361 369166 194997 386501 152639 163995 82309 151761 31404 226965 394185 101304 79621 99315 150936 156155 31208 399526 358496 220267 192773 347327 92807 441843 423834 173327 131913 369822 399380 107225 354942 357415 472293 22050 24...
output:
38670782768 56411250894 160558925669 31017692594 31047656751 12261574062 35178454865 171298651740 17299092617 9886436131 2270437628 78316193835 82534522085 43496577175 181201153334 1167516537 98745366750 49320840081 8611919810 35069702617 10382223975 19193470052 38981882732 96397121827 11256749667 5...