QOJ.ac
QOJ
ID | 题目 | 提交者 | 结果 | 用时 | 内存 | 语言 | 文件大小 | 提交时间 | 测评时间 |
---|---|---|---|---|---|---|---|---|---|
#725990 | #6533. Traveling in Cells | He_ng | AC ✓ | 3185ms | 30588kb | C++20 | 3.4kb | 2024-11-08 21:06:40 | 2024-11-08 21:06:41 |
Judging History
answer
/*
对区间的价值用树状数组维护
对颜色用线段树维护,即对每种颜色建立一棵线段树,动态开点保证空间,对于颜色i, 区间[l, r].sum 表示的是区间中颜色i的数量
*/
#include <bits/stdc++.h>
using namespace std;
#define ll long long
typedef vector<int> Vec;
const int N = 1e5 + 10, MAX = 1e5;
int n, q;
int v[N], c[N];
int T[N], tot; // T[i]:颜色为i的线段树的根
struct node{
int ls, rs, sum;
}tr[N * 200];
void update(int& p, int loc, int k, int l = 1, int r = MAX){ // 对于该颜色更新点loc的价值+1
if(!p) p = ++ tot;
tr[p].sum += k;
if(l == r) return ;
int mid = (l + r) >> 1;
if(loc <= mid) update(tr[p].ls, loc, k, l, mid);
else update(tr[p].rs, loc, k, mid + 1, r);
}
int query(int p, int ql, int qr, int l = 1, int r = MAX){ // 对于颜色i查询区间[ql, qr]该颜色的个数
if(!p) return 0;
if(ql <= l && r <= qr) return tr[p].sum;
int mid = (l + r) >> 1, ans = 0;
if(ql <= mid) ans += query(tr[p].ls, ql, qr, l, mid);
if(qr > mid) ans += query(tr[p].rs, ql, qr, mid + 1, r);
return ans;
}
ll val[N]; // 树状数组维护单点修改和区间求和
int lowbit(int x){ return x & -x; }
void update(int r, int k){
for(int i = r; i <= n; i += lowbit(i)) val[i] += k;
}
ll get_sum(int l, int r){
ll ans = 0;
for(int i = r; i; i -= lowbit(i)) ans += val[i];
for(int i = l - 1; i; i -= lowbit(i)) ans -= val[i];
return ans;
}
Vec ci; // 每次查询的颜色集合
bool check(int len, int l, int r){
int sum = 0;
for(auto x : ci){
sum += query(T[x], l, r); // 对于所有集合中的颜色查询[l, r].sum
}
return sum == len;
}
void get_ans(){
int x, k;
cin >> x >> k;
ci.clear();
for(int i = 1, y; i <= k; i ++){
cin >> y;
ci.push_back(y);
}
sort(ci.begin(), ci.end());
ci.erase(unique(ci.begin(), ci.end()), ci.end()); // 去重
int l = 1, r = n;
int Lr = x;
while(l <= Lr){ // 二分找最远能到的左边界
int mid = (l + Lr) >> 1;
if(check(x - mid + 1, mid, x)) Lr = mid - 1;
else l = mid + 1;
}
int Rl = x;
while(Rl <= r){ // 二分找最远合法的右边界
int mid = (Rl + r) >> 1;
if(check(mid - x + 1, x, mid)) Rl = mid + 1;
else r = mid - 1;
}
cout << get_sum(l, r) << "\n"; // 输出求和
}
void clear(){
for(int i = 0; i <= tot; i ++) tr[i] = {0, 0, 0};
for(int i = 1; i <= n; i ++) T[i] = val[i] = 0;
tot = 0;
}
void solve(){
cin >> n >> q;
clear();
for(int i = 1; i <= n; i ++){
cin >> c[i];
update(T[c[i]], i, 1);
}
for(int i = 1; i <= n; i ++){
cin >> v[i];
update(i, v[i]);
}
for(int i = 1; i <= q; i ++){
int op, p, x;
cin >> op;
if(op == 1){ // 更改颜色
cin >> p >> x;
update(T[c[p]], p, -1);
c[p] = x;
update(T[c[p]], p, 1);
}
else if(op == 2){ // 更改价值
cin >> p >> x;
update(p, x - v[p]);
v[p] = x;
}
else get_ans();
}
}
int main(){
ios::sync_with_stdio(false);
cin.tie(0); cout.tie(0);
int t;
cin >> t;
while(t --){
solve();
}
return 0;
}
详细
Test #1:
score: 100
Accepted
time: 0ms
memory: 3668kb
input:
2 5 10 1 2 3 1 2 1 10 100 1000 10000 3 3 1 3 3 3 2 2 3 2 5 20000 2 3 200 3 3 2 1 3 3 3 3 1 2 3 1 3 4 2 1 100000 1 2 2 3 1 2 1 2 4 1 1 2 3 4 1000000 1000000 1000000 1000000 3 4 4 1 2 3 4
output:
100 110 1200 21211 100010 4000000
result:
ok 6 numbers
Test #2:
score: 0
Accepted
time: 354ms
memory: 3740kb
input:
20000 15 15 1 1 3 3 2 3 3 3 3 3 2 3 2 3 3 634593973 158136379 707704004 998369647 831633445 263092797 937841412 451774682 552617416 483763379 50360475 794662797 74247465 537217773 901809831 3 6 4 1 3 5 10 3 5 7 1 2 3 4 5 9 10 3 4 3 3 8 9 2 13 608033129 3 15 2 3 5 1 9 3 3 8 4 1 3 7 10 2 6 727472865 3...
output:
2689089686 8377825475 1706073651 1439027604 2689089686 792730352 8904867081 8904867081 8270273108 831633445 692051585 2782432626 697783016 883944422 184057757 287523250 184057757 696388752 184057757 1675459344 2667693025 2614711258 4006992373 1767091974 5348541057 5348541057 390631780 2290216252 942...
result:
ok 200062 numbers
Test #3:
score: 0
Accepted
time: 669ms
memory: 3688kb
input:
2000 150 150 8 3 8 8 8 6 8 4 2 7 6 8 8 5 8 7 7 8 5 6 8 8 6 8 8 8 8 7 8 6 6 8 8 8 6 2 3 4 8 8 7 8 5 8 2 6 8 7 8 8 6 8 6 8 3 8 8 8 8 4 7 8 7 3 7 6 7 5 5 8 6 8 8 6 3 8 6 7 6 8 8 7 4 8 6 7 8 7 7 7 7 8 8 8 8 2 5 2 8 8 6 7 6 3 8 8 7 8 8 8 6 6 8 6 6 7 5 8 8 8 7 8 7 7 6 8 8 8 8 8 8 6 5 7 5 5 8 7 8 7 7 7 6 5...
output:
4449391171 3290849667 852793841 5178673994 995994209 11431868919 4327723427 5071541023 3032743466 962345334 2997656427 4534278452 3851900075 3611231417 5071541023 1477584218 1299005818 1299005818 2145605244 854143763 886347565 2081234124 2333808475 2455955801 4179722063 2328504333 1473735464 4107685...
result:
ok 199987 numbers
Test #4:
score: 0
Accepted
time: 1711ms
memory: 7232kb
input:
10 30000 30000 3 4 2 4 4 4 4 3 4 3 4 3 4 3 4 4 2 4 4 4 4 4 3 3 3 4 3 4 3 4 3 3 4 2 4 3 3 3 3 4 3 4 4 4 4 2 3 3 4 2 3 4 4 4 4 1 4 4 4 4 4 4 4 4 3 3 3 4 4 4 4 4 2 3 4 4 4 4 3 4 4 3 3 3 4 4 3 4 4 2 3 4 4 4 4 3 2 4 3 4 3 2 4 4 3 4 2 2 4 4 4 4 2 4 3 2 4 4 3 4 4 4 2 4 4 3 2 3 2 3 3 3 4 2 4 3 4 1 4 3 4 4 4...
output:
6959437173 934970676 72461245502 8365928740 8384151048 984567228 12482909122 1904927816 15134139942 3759040688 92670874909 332468911 5936663371 3562978848 1300592004 10314009201 5581540905 131246926443 15087184135864 4077066271 1124704817 1520626740 4388174158 744377942 2770411457 6231852240 1508724...
result:
ok 200135 numbers
Test #5:
score: 0
Accepted
time: 1981ms
memory: 10988kb
input:
3 100000 100000 6 6 2 6 5 3 6 5 4 6 4 6 6 6 6 5 2 5 2 6 6 6 1 6 5 6 4 5 6 6 5 4 5 4 3 4 5 5 6 6 5 6 6 5 2 5 6 5 4 2 5 6 6 6 5 2 5 6 6 4 5 6 3 3 6 5 6 5 5 5 5 4 4 4 4 3 6 5 4 5 6 5 6 6 6 6 3 6 5 6 5 4 3 5 6 4 5 3 6 5 3 5 6 4 6 5 4 5 5 5 2 5 4 6 6 3 5 5 5 5 5 4 5 5 6 5 5 6 6 6 5 5 4 6 5 4 4 2 6 6 6 5 ...
output:
753014823 938372065 5655899645 168297301 14372254310 1066586326 3520855082 2591792266 2321844837 64378192092 250581310 1845085639 1402247975 198007248 2157074263 2743531397 3433471688 10332600792 1085086491 4845484125 50019185900042 4036199358 154762798 50019185900042 1221387905 11240790307 10537215...
result:
ok 199749 numbers
Test #6:
score: 0
Accepted
time: 3154ms
memory: 19804kb
input:
3 100000 100000 173 276 418 362 183 321 401 316 193 426 212 126 206 409 382 443 405 412 259 233 356 355 340 41 354 447 421 464 436 436 329 239 427 415 452 424 174 294 220 413 293 456 140 304 438 462 418 345 160 296 443 234 455 452 396 347 438 413 235 416 363 186 340 285 340 457 392 359 451 310 431 1...
output:
832547880 1825993219 676042867 310750190 650714631 657481975 1279322 838513014 453432678 940357183 846050641 631145680 278723792 689448062 154699248 45678908 56518237 839298643 611124630 499104412 324172054 742064269 626600147 728123335 602272914 45485542 868574266 876207167 342300121 917221167 7055...
result:
ok 200119 numbers
Test #7:
score: 0
Accepted
time: 1132ms
memory: 28356kb
input:
3 100000 100000 66046 49249 42478 61684 59308 38366 66208 38769 50465 63701 50193 47811 50312 56793 58616 63383 58390 17546 23446 57532 59030 63009 62771 46338 52747 54677 68893 58360 56617 42330 65075 51193 65417 67035 54247 54323 39404 61892 42821 30094 67958 46206 53273 28507 65864 42364 64063 46...
output:
787181803 340358691 794440759 970166774 501256821 822531703 505349238 299646179 317091968 718901636 589846615 490283989 1183290 98835675 715091970 941598117 81757251 249078591 559980949 587721512 408541247 542135558 217103011 916103998 422219165 786665928 215595722 309683697 275650079 660176857 9707...
result:
ok 199750 numbers
Test #8:
score: 0
Accepted
time: 1540ms
memory: 30588kb
input:
3 100000 100000 2 2 3 1 1 3 1 3 1 1 1 1 1 3 3 2 3 1 1 3 3 3 2 1 2 3 2 3 1 1 2 2 2 3 1 1 3 3 3 3 1 3 1 1 3 2 3 1 1 2 3 3 2 1 3 1 1 1 2 3 3 2 3 3 1 1 2 2 2 1 1 3 1 1 2 2 1 3 3 3 2 1 1 2 1 2 3 3 3 2 2 3 3 2 3 2 1 3 3 3 2 2 3 1 3 2 3 2 3 1 2 2 1 2 1 3 3 3 2 2 3 1 3 2 1 1 1 2 1 2 2 1 3 1 2 1 1 3 3 2 3 3 ...
output:
50035938417434 50036115992265 50036315519498 3975347985 50036470174447 50036191297549 7222739016 50036248757817 1886106914 50037215621946 50037215621946 50037215621946 50037789462602 50037789462602 50038171558883 50038171558883 50038171558883 50037356071541 50037356071541 840665598 50037454922987 19...
result:
ok 144306 numbers
Test #9:
score: 0
Accepted
time: 1885ms
memory: 29056kb
input:
3 100000 100000 60522 14575 36426 79445 48772 90081 33447 90629 3497 47202 7775 94325 63982 4784 68417 2156 31932 35902 95728 78537 23857 30739 86918 29211 39679 38506 63340 86568 61868 60016 87940 96263 24593 1449 36991 90310 23355 77068 11431 8580 91757 49218 74934 94328 63676 29355 96221 99080 95...
output:
49028798194951 49028798194951 49028798194951 445374817 49028798194951 49028798194951 49028798194951 49028798194951 49029113499144 49029113499144 49029113499144 568084096 49029252709603 49029252709603 49029252709603 49029252709603 49029252709603 49029252709603 49029252709603 142834402 644706458 49029...
result:
ok 151536 numbers
Test #10:
score: 0
Accepted
time: 3185ms
memory: 11620kb
input:
3 100000 100000 2 3 1 2 3 1 2 3 1 2 3 1 2 3 1 2 3 1 2 3 1 2 3 1 2 3 1 2 3 1 2 3 1 2 3 1 2 3 1 2 3 1 2 3 1 2 3 1 2 3 1 2 3 1 2 3 1 2 3 1 2 3 1 2 3 1 2 3 1 2 3 1 2 3 1 2 3 1 2 3 1 2 3 1 2 3 1 2 3 1 2 3 1 2 3 1 2 3 1 2 3 1 2 3 1 2 3 1 2 3 1 2 3 1 2 3 1 2 3 1 2 3 1 2 3 1 2 3 1 2 3 1 2 3 1 2 3 1 2 3 1 2 ...
output:
50042766706436 50042766706436 50042766706436 50042766706436 50042766706436 50042766706436 50042766706436 50042766706436 50042766706436 50042766706436 50042766706436 50042766706436 50042766706436 50042766706436 50042766706436 50042766706436 50042766706436 50042766706436 50042766706436 50042766706436 ...
result:
ok 300000 numbers