QOJ.ac
QOJ
ID | Problem | Submitter | Result | Time | Memory | Language | File size | Submit time | Judge time |
---|---|---|---|---|---|---|---|---|---|
#456289 | #8547. Whose Land? | rqoi031 | RE | 0ms | 16068kb | C++20 | 4.4kb | 2024-06-27 17:09:09 | 2024-06-27 17:09:10 |
Judging History
answer
#include<stdio.h>
#include<algorithm>
#include<cstring>
#include<utility>
#include<map>
constexpr int N(100000),K(20),Q(500000);
struct edge {
int v,next;
};
edge e[(N<<1)+5];
int en,last[N+5];
inline void add_edge(const int &u,const int &v) {
e[++en]={v,last[u]};
last[u]=en;
}
int fa[N+5];
int bfn[N+5];
int que[N+5];
int lp[N+5][K+1],rp[N+5][K+1];
struct qry {
int id,l,r;
};
qry qq[Q+5];
int ans[Q+5];
namespace BIT {
int sum[N+5];
inline void clear(const int &n) {
std::memset(sum+1,0,n*sizeof(int));
}
inline void modify(int x,const int &y) {
while(x) {
sum[x]+=y;
x-=x&-x;
}
}
inline int query(const int &n,int x) {
int y(0);
while(x<=n) {
y+=sum[x];
x+=x&-x;
}
return y;
}
}
namespace ODT {
std::map<int,std::pair<int,int>> map;
inline void clear(const int &n) {
map.clear();
map.emplace(1,std::make_pair(n,0));
}
inline void erase(const int &l,const int &r,const int &c) {
BIT::modify(c,-(r-l+1));
}
inline void color(const int &l,const int &r,const int &c) {
BIT::modify(c,r-l+1);
}
inline void cover(const int &l,const int &r,const int &c) {
if(l>r) {
return;
}
// segments crossing left boundary
auto it(map.upper_bound(l));
if(it!=map.begin()) {
--it;
if(it->second.first>=r) {
erase(l,r,it->second.second);
if(it->second.first>r) {
map.emplace(r+1,it->second);
}
}
else if(it->second.first>=l) {
erase(l,it->second.first,it->second.second);
}
if(it->first<l) {
it->second.first=l-1;
}
else {
map.erase(it);
}
}
// segments crossing right boundary
it=map.upper_bound(r);
if(it!=map.begin()) {
--it;
if(it->first>l) {
erase(it->first,r,it->second.second);
if(it->second.first>r) {
map.emplace(r+1,it->second);
}
map.erase(it);
}
}
// segments inside
for(it=map.lower_bound(l);it!=map.end()&&it->first<=r;it=map.erase(it)) {
erase(it->first,it->second.first,it->second.second);
}
// insert the new segment
color(l,r,c);
map.emplace(l,std::make_pair(r,c));
}
}
void solve() {
int n,k,q;
scanf("%d%d%d",&n,&k,&q);
std::memset(last+1,0,n*sizeof(int));
for(int i=1;i<n;i++) {
int u,v;
scanf("%d%d",&u,&v);
add_edge(u,v);
add_edge(v,u);
}
int cnt(0);
int qb(1),qe(1);
fa[1]=0,que[1]=1;
while(qb<=qe) {
const int u(que[qb++]);
bfn[u]=++cnt;
for(int i=last[u];i;i=e[i].next) {
const int v(e[i].v);
if(v==fa[u]) {
continue;
}
fa[v]=u,que[++qe]=v;
}
}
for(int i=n;i>=1;i--) {
lp[i][0]=rp[i][0]=bfn[i];
for(int j=1;j<=k;j++) {
lp[i][j]=n+1,rp[i][j]=0;
}
for(int j=last[i];j;j=e[j].next) {
const int v(e[j].v);
if(v==fa[i]) {
continue;
}
for(int l=1;l<=k;l++) {
lp[i][l]=std::min(lp[i][l],lp[v][l-1]);
rp[i][l]=std::max(rp[i][l],rp[v][l-1]);
}
}
}
for(int i=1;i<=q;i++) {
scanf("%d%d",&qq[i].l,&qq[i].r);
qq[i].id=i;
}
std::sort(qq+1,qq+q+1,[](const qry &x,const qry &y)->bool {
return x.r<y.r;
});
BIT::clear(n),ODT::clear(n);
for(int i=1,j=1;i<=n;i++) {
for(int j=0,u=i;j<=k&&u!=0;j++,u=fa[u]) {
ODT::cover(bfn[u],bfn[u],i);
ODT::cover(lp[u][k-j],rp[u][k-j],i);
if(j<k) {
ODT::cover(lp[u][k-j-1],rp[u][k-j-1],i);
}
}
while(j<=q&&qq[j].r==i) {
ans[qq[j].id]=BIT::query(n,qq[j].l);
++j;
}
}
for(int i=1;i<=q;i++) {
printf("%d\n",ans[i]);
}
}
int main() {
int t;
scanf("%d",&t);
while(t--) {
solve();
}
return 0;
}
Details
Tip: Click on the bar to expand more detailed information
Test #1:
score: 100
Accepted
time: 0ms
memory: 16068kb
input:
2 5 1 2 1 2 1 3 2 4 2 5 2 2 2 3 8 2 3 1 2 1 3 2 4 2 5 4 6 5 7 7 8 2 2 2 5 3 4
output:
4 5 7 8 6
result:
ok 5 number(s): "4 5 7 8 6"
Test #2:
score: -100
Runtime Error
input:
1000 500 1 500 291 2 406 9 207 13 71 15 351 17 442 18 496 19 104 20 208 23 448 34 80 42 187 44 352 45 290 46 116 47 318 50 226 52 129 55 83 59 100 60 54 61 73 65 63 66 454 67 43 71 26 74 68 26 320 75 388 76 425 79 170 81 350 83 48 85 153 86 221 90 290 95 130 96 82 98 124 82 36 99 213 100 121 101 132...
output:
493 492 494 392 465 486 498 315 494 497 486 486 490 477 493 500 430 130 488 452 388 446 488 442 493 431 489 500 445 24 416 500 488 496 452 446 501 492 441 487 56 483 487 439 495 484 424 491 475 405 477 492 492 495 488 492 496 489 487 495 445 501 447 481 498 422 500 363 455 484 483 493 388 500 500 49...