QOJ.ac

QOJ

IDProblemSubmitterResultTimeMemoryLanguageFile sizeSubmit timeJudge time
#456289#8547. Whose Land?rqoi031RE 0ms16068kbC++204.4kb2024-06-27 17:09:092024-06-27 17:09:10

Judging History

你现在查看的是最新测评结果

  • [2024-06-27 17:09:10]
  • 评测
  • 测评结果:RE
  • 用时:0ms
  • 内存:16068kb
  • [2024-06-27 17:09:09]
  • 提交

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...

result: