Submission #892735

# Submission time Handle Problem Language Result Execution time Memory
892735 2023-12-25T19:37:18 Z alexander707070 Tourism (JOI23_tourism) C++14
17 / 100
5000 ms 39388 KB
#include<bits/stdc++.h>
#define MAXN 100007
using namespace std;

const int bucket_sz=500;

struct qr{
    int l,r,id;
}qs[MAXN];

struct node{
    int l,r;
}w[MAXN];

struct event{
    int type,ind,val,tim;
};

stack<event> st;

int n,m,q,a,b,tt,dist[MAXN],bucket[MAXN],l,r,cnt[MAXN],tim,sum,last,ans[MAXN];
int c[MAXN],num[MAXN],ret[MAXN],fr[MAXN];
vector<int> v[MAXN],euler;

void dfs(int x,int p,int d){
    tt++; num[x]=tt; ret[tt]=x;
    dist[x]=d;

    fr[x]=int(euler.size());
    euler.push_back(num[x]);

    for(int i=0;i<v[x].size();i++){
        if(v[x][i]==p)continue;
        dfs(v[x][i],x,d+1);

        euler.push_back(num[x]);
    }
}

bool li[4*MAXN][20];
int dp[4*MAXN][20];

int lg[4*MAXN],power[20];

void calc(){
    power[0]=1;
    for(int i=1;i<20;i++)power[i]=power[i-1]*2;
    lg[1]=0;
    for(int i=2;i<=4*n;i++)lg[i]=lg[i/2]+1;
}

int rmq(int i,int j){
    if(j==0)return euler[i];

    if(li[i][j])return dp[i][j];
    li[i][j]=true;

    dp[i][j]=min( rmq(i,j-1) , rmq(i+power[j-1],j-1) );
    return dp[i][j];
}

int lca(int x,int y){
    if(fr[x]>fr[y])swap(x,y);
    x=fr[x]; y=fr[y];

    return ret[ min( rmq(x,lg[y-x+1]) , rmq(y-power[lg[y-x+1]]+1,lg[y-x+1]) ) ];
}

int distance(int x,int y){
    if(x==0 or y==n+1)return 0;

    return dist[x]+dist[y]-2*dist[lca(x,y)];
}

bool cmp(qr fr,qr sc){
    if(bucket[fr.l]!=bucket[sc.l])return bucket[fr.l]<bucket[sc.l];
    return fr.r>sc.r;   
}

void insertv(int x,int y,int z){
    sum-=distance(ret[y],ret[z]);
    sum+=distance(ret[y],ret[x]);
    sum+=distance(ret[x],ret[z]);

    w[x].l=y; w[x].r=z;
    w[y].r=x; w[z].l=x;
}

void erasev(int x){
    st.push({1,w[x].l,x,tim});
    st.push({2,w[x].r,x,tim});

    w[w[x].l].r=w[x].r;
    w[w[x].r].l=w[x].l;
}

void rem(int x){
    if(x==0){
        tim++; return;
    }

    tim++;
    x=num[c[x]];
    cnt[x]--;

    if(cnt[x]!=0)return;

    st.push({3,0,sum,tim});

    sum-=distance(ret[w[x].l],ret[x]);
    sum-=distance(ret[x],ret[w[x].r]);
    sum+=distance(ret[w[x].l],ret[w[x].r]);

    erasev(x);
}

void undo(){
    while(!st.empty() and st.top().tim==tim){
        if(st.top().type==1){
            w[st.top().ind].r=st.top().val;
        }
        if(st.top().type==2){
            w[st.top().ind].l=st.top().val;
        }
        if(st.top().type==3){
            sum=st.top().val;
        }

        st.pop();
    }
    tim--;
}

void reset(){
    tim=sum=0;
    while(!st.empty())st.pop();
    for(int i=1;i<=n;i++)cnt[i]=0;
}

int edge(){
    int lx=w[0].r,rx=w[n+1].l;
    return distance(ret[lx],ret[rx]);
}

int main(){

    ios_base::sync_with_stdio(0);
    cin.tie(0);
    cout.tie(0);

    cin>>n>>m>>q;
    calc();

    for(int i=1;i<=n-1;i++){
        cin>>a>>b;
        v[a].push_back(b);
        v[b].push_back(a);
    }
    dfs(1,0,0);

    w[0].l=n+1;
    w[n+1].r=0;
    ret[n+1]=n+1;

    for(int i=1;i<=m;i++){
        cin>>c[i];
        bucket[i]=i/bucket_sz;
    }

    for(int i=1;i<=q;i++){
        cin>>qs[i].l>>qs[i].r;
        qs[i].id=i;
    }

    sort(qs+1,qs+q+1,cmp);

    for(int i=1;i<=q;i++){
        if(i==1 or bucket[qs[i].l]!=bucket[qs[i-1].l]){
            reset();
            for(int f=bucket[qs[i].l]*bucket_sz;f<=m;f++){
                cnt[num[c[f]]]++;
            }

            last=0;
            for(int f=1;f<=n;f++){
                if(cnt[f]==0)continue;
                insertv(f,last,n+1);
                last=f;
            }
            l=bucket[qs[i].l]*bucket_sz;
            r=m;
        }

        while(r>qs[i].r){
            rem(r); r--;
        }

        while(l<qs[i].l){
            rem(l); l++;
        }

        ans[qs[i].id]=(sum+edge())/2;

        while(l>bucket[qs[i].l]*bucket_sz){
            undo(); l--; cnt[num[c[l]]]++;
        }

    }

    for(int i=1;i<=q;i++){
        cout<<ans[i]+1<<"\n";
    }

    return 0;
}

Compilation message

tourism.cpp: In function 'void dfs(int, int, int)':
tourism.cpp:32:18: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   32 |     for(int i=0;i<v[x].size();i++){
      |                 ~^~~~~~~~~~~~
# Verdict Execution time Memory Grader output
1 Correct 1 ms 10588 KB Output is correct
2 Correct 1 ms 10588 KB Output is correct
3 Correct 2 ms 10588 KB Output is correct
4 Correct 2 ms 10588 KB Output is correct
5 Correct 2 ms 10588 KB Output is correct
6 Correct 3 ms 10588 KB Output is correct
7 Correct 3 ms 10588 KB Output is correct
8 Correct 2 ms 10588 KB Output is correct
9 Correct 4 ms 10584 KB Output is correct
10 Correct 5 ms 10588 KB Output is correct
11 Correct 3 ms 10588 KB Output is correct
12 Correct 2 ms 10840 KB Output is correct
13 Correct 2 ms 10588 KB Output is correct
14 Correct 2 ms 10588 KB Output is correct
15 Correct 4 ms 10588 KB Output is correct
16 Correct 4 ms 10588 KB Output is correct
17 Correct 3 ms 10588 KB Output is correct
18 Correct 3 ms 10588 KB Output is correct
19 Correct 3 ms 10588 KB Output is correct
20 Correct 3 ms 10588 KB Output is correct
21 Correct 4 ms 10588 KB Output is correct
22 Correct 3 ms 10588 KB Output is correct
23 Correct 3 ms 10588 KB Output is correct
24 Correct 3 ms 10588 KB Output is correct
25 Correct 3 ms 10588 KB Output is correct
26 Correct 3 ms 10588 KB Output is correct
27 Correct 2 ms 8636 KB Output is correct
28 Correct 2 ms 8540 KB Output is correct
29 Correct 4 ms 10588 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 1 ms 10588 KB Output is correct
2 Correct 1 ms 10588 KB Output is correct
3 Correct 2 ms 10588 KB Output is correct
4 Correct 2 ms 10588 KB Output is correct
5 Correct 2 ms 10588 KB Output is correct
6 Correct 3 ms 10588 KB Output is correct
7 Correct 3 ms 10588 KB Output is correct
8 Correct 2 ms 10588 KB Output is correct
9 Correct 4 ms 10584 KB Output is correct
10 Correct 5 ms 10588 KB Output is correct
11 Correct 3 ms 10588 KB Output is correct
12 Correct 2 ms 10840 KB Output is correct
13 Correct 2 ms 10588 KB Output is correct
14 Correct 2 ms 10588 KB Output is correct
15 Correct 4 ms 10588 KB Output is correct
16 Correct 4 ms 10588 KB Output is correct
17 Correct 3 ms 10588 KB Output is correct
18 Correct 3 ms 10588 KB Output is correct
19 Correct 3 ms 10588 KB Output is correct
20 Correct 3 ms 10588 KB Output is correct
21 Correct 4 ms 10588 KB Output is correct
22 Correct 3 ms 10588 KB Output is correct
23 Correct 3 ms 10588 KB Output is correct
24 Correct 3 ms 10588 KB Output is correct
25 Correct 3 ms 10588 KB Output is correct
26 Correct 3 ms 10588 KB Output is correct
27 Correct 2 ms 8636 KB Output is correct
28 Correct 2 ms 8540 KB Output is correct
29 Correct 4 ms 10588 KB Output is correct
30 Correct 23 ms 10840 KB Output is correct
31 Correct 32 ms 10912 KB Output is correct
32 Correct 31 ms 10844 KB Output is correct
33 Correct 31 ms 10844 KB Output is correct
34 Correct 33 ms 10988 KB Output is correct
35 Correct 4 ms 10840 KB Output is correct
36 Correct 4 ms 10844 KB Output is correct
37 Correct 4 ms 10936 KB Output is correct
38 Correct 37 ms 11060 KB Output is correct
39 Correct 31 ms 10840 KB Output is correct
40 Correct 36 ms 11096 KB Output is correct
41 Correct 4 ms 10844 KB Output is correct
42 Correct 4 ms 11068 KB Output is correct
43 Correct 4 ms 11032 KB Output is correct
44 Correct 32 ms 11004 KB Output is correct
45 Correct 32 ms 11000 KB Output is correct
46 Correct 31 ms 11036 KB Output is correct
47 Correct 4 ms 10844 KB Output is correct
48 Correct 4 ms 10840 KB Output is correct
49 Correct 4 ms 10976 KB Output is correct
50 Correct 40 ms 11100 KB Output is correct
51 Correct 30 ms 10844 KB Output is correct
52 Correct 31 ms 10844 KB Output is correct
53 Correct 30 ms 10844 KB Output is correct
54 Correct 31 ms 10844 KB Output is correct
55 Correct 30 ms 10840 KB Output is correct
56 Correct 6 ms 8536 KB Output is correct
57 Correct 2 ms 8796 KB Output is correct
58 Correct 39 ms 10844 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 1 ms 10588 KB Output is correct
2 Correct 2 ms 8540 KB Output is correct
3 Correct 6 ms 8540 KB Output is correct
4 Correct 2275 ms 25512 KB Output is correct
5 Correct 2117 ms 30756 KB Output is correct
6 Correct 2344 ms 34868 KB Output is correct
7 Correct 3759 ms 36860 KB Output is correct
8 Correct 4014 ms 36904 KB Output is correct
9 Correct 4059 ms 36876 KB Output is correct
10 Correct 3990 ms 36856 KB Output is correct
11 Correct 3800 ms 36872 KB Output is correct
12 Correct 470 ms 34204 KB Output is correct
13 Correct 472 ms 34208 KB Output is correct
14 Correct 488 ms 34204 KB Output is correct
15 Correct 42 ms 23492 KB Output is correct
16 Correct 4193 ms 36800 KB Output is correct
17 Correct 346 ms 9416 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 3 ms 10588 KB Output is correct
2 Correct 602 ms 25220 KB Output is correct
3 Correct 1238 ms 28104 KB Output is correct
4 Correct 864 ms 28624 KB Output is correct
5 Correct 54 ms 35272 KB Output is correct
6 Correct 71 ms 36804 KB Output is correct
7 Correct 186 ms 37828 KB Output is correct
8 Correct 423 ms 38084 KB Output is correct
9 Correct 1256 ms 38320 KB Output is correct
10 Correct 2566 ms 38280 KB Output is correct
11 Correct 2541 ms 38512 KB Output is correct
12 Correct 2566 ms 38584 KB Output is correct
13 Correct 2826 ms 38340 KB Output is correct
14 Correct 3242 ms 38472 KB Output is correct
15 Execution timed out 5060 ms 39388 KB Time limit exceeded
16 Halted 0 ms 0 KB -
# Verdict Execution time Memory Grader output
1 Correct 2 ms 10588 KB Output is correct
2 Correct 2 ms 8540 KB Output is correct
3 Correct 6 ms 8536 KB Output is correct
4 Correct 3057 ms 26924 KB Output is correct
5 Correct 3140 ms 29124 KB Output is correct
6 Correct 4477 ms 35920 KB Output is correct
7 Execution timed out 5013 ms 39076 KB Time limit exceeded
8 Halted 0 ms 0 KB -
# Verdict Execution time Memory Grader output
1 Correct 1 ms 10588 KB Output is correct
2 Correct 1 ms 10588 KB Output is correct
3 Correct 2 ms 10588 KB Output is correct
4 Correct 2 ms 10588 KB Output is correct
5 Correct 2 ms 10588 KB Output is correct
6 Correct 3 ms 10588 KB Output is correct
7 Correct 3 ms 10588 KB Output is correct
8 Correct 2 ms 10588 KB Output is correct
9 Correct 4 ms 10584 KB Output is correct
10 Correct 5 ms 10588 KB Output is correct
11 Correct 3 ms 10588 KB Output is correct
12 Correct 2 ms 10840 KB Output is correct
13 Correct 2 ms 10588 KB Output is correct
14 Correct 2 ms 10588 KB Output is correct
15 Correct 4 ms 10588 KB Output is correct
16 Correct 4 ms 10588 KB Output is correct
17 Correct 3 ms 10588 KB Output is correct
18 Correct 3 ms 10588 KB Output is correct
19 Correct 3 ms 10588 KB Output is correct
20 Correct 3 ms 10588 KB Output is correct
21 Correct 4 ms 10588 KB Output is correct
22 Correct 3 ms 10588 KB Output is correct
23 Correct 3 ms 10588 KB Output is correct
24 Correct 3 ms 10588 KB Output is correct
25 Correct 3 ms 10588 KB Output is correct
26 Correct 3 ms 10588 KB Output is correct
27 Correct 2 ms 8636 KB Output is correct
28 Correct 2 ms 8540 KB Output is correct
29 Correct 4 ms 10588 KB Output is correct
30 Correct 23 ms 10840 KB Output is correct
31 Correct 32 ms 10912 KB Output is correct
32 Correct 31 ms 10844 KB Output is correct
33 Correct 31 ms 10844 KB Output is correct
34 Correct 33 ms 10988 KB Output is correct
35 Correct 4 ms 10840 KB Output is correct
36 Correct 4 ms 10844 KB Output is correct
37 Correct 4 ms 10936 KB Output is correct
38 Correct 37 ms 11060 KB Output is correct
39 Correct 31 ms 10840 KB Output is correct
40 Correct 36 ms 11096 KB Output is correct
41 Correct 4 ms 10844 KB Output is correct
42 Correct 4 ms 11068 KB Output is correct
43 Correct 4 ms 11032 KB Output is correct
44 Correct 32 ms 11004 KB Output is correct
45 Correct 32 ms 11000 KB Output is correct
46 Correct 31 ms 11036 KB Output is correct
47 Correct 4 ms 10844 KB Output is correct
48 Correct 4 ms 10840 KB Output is correct
49 Correct 4 ms 10976 KB Output is correct
50 Correct 40 ms 11100 KB Output is correct
51 Correct 30 ms 10844 KB Output is correct
52 Correct 31 ms 10844 KB Output is correct
53 Correct 30 ms 10844 KB Output is correct
54 Correct 31 ms 10844 KB Output is correct
55 Correct 30 ms 10840 KB Output is correct
56 Correct 6 ms 8536 KB Output is correct
57 Correct 2 ms 8796 KB Output is correct
58 Correct 39 ms 10844 KB Output is correct
59 Correct 1 ms 10588 KB Output is correct
60 Correct 2 ms 8540 KB Output is correct
61 Correct 6 ms 8540 KB Output is correct
62 Correct 2275 ms 25512 KB Output is correct
63 Correct 2117 ms 30756 KB Output is correct
64 Correct 2344 ms 34868 KB Output is correct
65 Correct 3759 ms 36860 KB Output is correct
66 Correct 4014 ms 36904 KB Output is correct
67 Correct 4059 ms 36876 KB Output is correct
68 Correct 3990 ms 36856 KB Output is correct
69 Correct 3800 ms 36872 KB Output is correct
70 Correct 470 ms 34204 KB Output is correct
71 Correct 472 ms 34208 KB Output is correct
72 Correct 488 ms 34204 KB Output is correct
73 Correct 42 ms 23492 KB Output is correct
74 Correct 4193 ms 36800 KB Output is correct
75 Correct 346 ms 9416 KB Output is correct
76 Correct 3 ms 10588 KB Output is correct
77 Correct 602 ms 25220 KB Output is correct
78 Correct 1238 ms 28104 KB Output is correct
79 Correct 864 ms 28624 KB Output is correct
80 Correct 54 ms 35272 KB Output is correct
81 Correct 71 ms 36804 KB Output is correct
82 Correct 186 ms 37828 KB Output is correct
83 Correct 423 ms 38084 KB Output is correct
84 Correct 1256 ms 38320 KB Output is correct
85 Correct 2566 ms 38280 KB Output is correct
86 Correct 2541 ms 38512 KB Output is correct
87 Correct 2566 ms 38584 KB Output is correct
88 Correct 2826 ms 38340 KB Output is correct
89 Correct 3242 ms 38472 KB Output is correct
90 Execution timed out 5060 ms 39388 KB Time limit exceeded
91 Halted 0 ms 0 KB -