QOJ.ac
QOJ
ID | Problem | Submitter | Result | Time | Memory | Language | File size | Submit time | Judge time |
---|---|---|---|---|---|---|---|---|---|
#141402 | #6533. Traveling in Cells | cy1999 | TL | 2124ms | 26488kb | C++20 | 5.8kb | 2023-08-17 11:38:35 | 2023-08-17 11:38:38 |
Judging History
answer
#include <bits/stdc++.h>
using namespace std ;
typedef long long ll ;
const int N = 100010 ;
int n , q , T , k;
int c[N] , v[N] , a[N] ;
bool tag ;
struct SGTt {
#define ls p*2
#define rs p*2+1
struct tree {
map<int , int> cnt ;
ll sum ;
} t[N * 4] ;
set<int> merge(set<int> x , set<int> y ) {
if(x.size() > y.size()) {
auto it = y.begin() ; for( ; it != y.end() ; it ++ ) {
x.insert(*it) ;
}
return x ;
} else {
auto it = x.begin() ;
for( ; it != x.end() ; it ++) {
y.insert(*it) ;
}
return y ;
}
}
void pushup(tree &p , tree x , tree y) {
if(x.cnt.size() > y.cnt.size()) {
p = x ;
auto it = y.cnt.begin() ; for( ; it != y.cnt.end() ; it ++ ) {
p.cnt[it->first] += it->second ;
}
} else {
p = y ;
auto it = x.cnt.begin() ;
for( ; it != x.cnt.end() ; it ++) {
p.cnt[it->first] += it->second ;
}
}
p.sum = x.sum + y.sum ;
}
void build(int p , int l , int r) {
t[p].cnt.clear() ;
if(l == r) {
t[p].cnt[c[l]] = 1 ;
t[p].sum = v[l] ;
return ;
}
int mid = (l + r) >> 1 ;
build(ls , l , mid) ; build(rs , mid + 1 , r) ;
pushup(t[p] , t[ls] , t[rs]) ;
}
tree query(int p , int l , int r , int ql , int qr){
tree res ;
if(tag) return res ;
if(ql <= l && r <= qr) {
return t[p] ;
}
int mid = (l + r) >> 1 ;
if(ql > mid) {
tree res1 = query(rs , mid + 1 , r , ql , qr) ;
if(res1.cnt.size() > k) return tag = 1 , res ;
return res1 ;
}
if(qr <= mid) {
tree res1 = query(ls , l , mid , ql , qr) ;
if(res1.cnt.size() > k) return tag = 1 , res ;
return res1 ;
}
tree res1 = query(ls , l , mid , ql , qr) , res2 = query(rs , mid + 1 , r , ql , qr) ;
pushup(res , res1 , res2) ;
if(res.cnt.size() > k) {
tag = 1 ;
}
return res ;
}
void ERASE(tree &p , int cx) {
p.cnt[cx] -- ;
if(p.cnt[cx] <= 0) {
p.cnt.erase(cx) ;
}
}
void del(int p , int l , int r , int x) {
ERASE(t[p] , c[x]) ;
if(l == r) {
return ;
}
int mid = (l + r) >> 1 ;
if(x <= mid) {
del(ls , l , mid , x) ;
} else {
del(rs , mid + 1 , r , x) ;
}
}
void ADD(tree &p , int cx) {
p.cnt[cx] ++ ;
}
void add(int p , int l , int r , int x) {
ADD(t[p] , c[x]) ;
if(l == r) return ;
int mid = (l + r) >> 1 ;
if(x <= mid) add(ls , l , mid , x) ;
else add(rs , mid + 1 , r , x) ;
}
void change(int p , int l , int r , int x) {
if(l == r) {
t[p].sum = v[x] ;
return ;
}
int mid = (l + r) >> 1;
if(x <= mid) change(ls , l , mid , x) ;
else change(rs , mid + 1 , r , x ) ;
t[p].sum = t[ls].sum + t[rs].sum ;
}
ll ask(int p , int l , int r , int ql , int qr) {
if(ql <= l && r <= qr) {
return t[p].sum ;
}
ll res = 0 ; int mid = (l + r) >> 1 ;
if(ql <= mid) res += ask(ls , l , mid , ql , qr);
if(qr > mid) res += ask(rs , mid + 1 , r , ql , qr) ;
return res ;
}
tree res ;
} seg ;
bool check(map<int , int> x , map<int , int> y) {
auto it = x.begin() ;
for( ; it != x.end() ; it ++) {
if(it->second <= 0) continue ;
if(y.find(it->first) == y.end()) return 0 ;
}
return 1 ;
}
int main() {
// freopen("data.in" , "r" , stdin) ;
// freopen("mine.out" , "w" , stdout) ;
cin >> T ;
while(T --) {
scanf("%d%d" , &n , &q) ;
for(int i = 1 ; i <= n ; i ++) scanf("%d" , &c[i]) ;
for(int i = 1 ; i <= n ; i ++) scanf("%d" , &v[i]) ;
seg.build(1 , 1 , n) ;
while(q --) {
int opt ; scanf("%d" , &opt) ;
if(opt == 1) {
int p , x ; scanf("%d%d" , &p , &x) ;
seg.del(1 , 1 , n , p) ;
c[p] = x ; seg.add(1 , 1 , n , p) ;
} else if(opt == 2) {
int p , x ; scanf("%d%d" , &p , &x) ;
v[p] = x ; seg.change(1 , 1 , n , p) ;
} else {
int x ; scanf("%d%d" , &x , &k) ;
map<int , int> sa ;
for(int i = 1 ; i <= k ; i ++) {
scanf("%d" , &a[i]) ;
sa[a[i]] ++ ;
}
int posl , posr ;
int l = x , r = n ;
while(l < r) {
int mid = (l + r + 1) >> 1 ;
tag = 0 ; seg.res = seg.query(1 , 1 , n , x , mid) ;
if(tag == 0 && check(seg.res.cnt , sa)) l = mid ;
else r = mid - 1 ;
}
posr = l ;
r = x , l = 1 ;
while(l < r) {
int mid = (l + r) >> 1;
tag = 0 ; seg.res = seg.query(1 , 1 , n , mid , x) ;
if(tag == 0 && check(seg.res.cnt , sa)) r = mid ;
else l = mid + 1 ;
}
posl = l ;
ll ans = seg.ask(1 , 1 , n , posl , posr) ;
printf("%lld\n" , ans) ;
}
}
}
}
/*
1
10 3
6 3 6 1 1 6 1 1 9 5
13110 1530 2229 4123 2326 30416 20749 4039 1078 2630
1 6 1
1 10 5
3 9 4 9 3 1 4
*/
Details
Tip: Click on the bar to expand more detailed information
Test #1:
score: 100
Accepted
time: 2ms
memory: 25604kb
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: 764ms
memory: 26488kb
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: 2124ms
memory: 25636kb
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: -100
Time Limit Exceeded
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...