답안 #998823

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
998823 2024-06-14T17:20:18 Z imarn Tourism (JOI23_tourism) C++14
0 / 100
58 ms 10664 KB
#include<bits/stdc++.h>
#pragma GCC optimize("O3")
#pragma GCC target("avx2")
#define ll long long
#define pii pair<int,int>
#define pll pair<ll,ll>
#define plx pair<ll,int>
#define f first
#define s second
#define pb push_back
#define all(x) x.begin(),x.end()
#define vi vector<int>
#define vl vector<ll>
#define vvi vector<vi>
using namespace std;
const int mxn=1e5+5,blc=505;
vector<int>g[mxn];
int tin[mxn],tout[mxn],cnt=0,pr[mxn][19],d[mxn]{0};
void dfs(int u,int p,int l){
    d[u]=l;pr[u][0]=p;tin[u]=++cnt;
    for(int i=1;i<19;i++)pr[u][i]=pr[pr[u][i-1]][i-1];
    for(auto v:g[u]){
        if(v==p)continue;dfs(v,u,l+1);
    }tout[u]=cnt;
}
int get(int a,int b){
    if(d[a]>d[b])swap(a,b);
    for(int i=18;i>=0;i--)if(d[b]-(1<<i)>=d[a])b=pr[b][i];
    if(a==b)return a;
    for(int i=18;i>=0;i--)if(pr[a][i]!=pr[b][i])a=pr[a][i],b=pr[b][i];
    return pr[a][0];
}
bool cmp(pair<pii,int>a,pair<pii,int>b){
    if(a.f.f/blc==b.f.f/blc)return a.f.s<b.f.s;
    else return a.f.f<b.f.f;
}multiset<pii>ms;
int ans=0;
int cal(int a,int b){
    return d[a]+d[b]-2*d[get(a,b)];
}
void add(int t,int u){
    if(ms.empty()){ms.insert({t,u});return;}
    if(ms.size()==1){
        ms.insert({t,u});
        ans += 2*(cal(ms.begin()->s,(--ms.end())->s));
        return;
    }
    if(t>(--ms.end())->f||t<ms.begin()->f){
        ans-=cal(ms.begin()->s,(--ms.end())->s);
        ans+=cal(ms.begin()->s,u);
        ans+=cal((--ms.end())->s,u);
        ms.insert({t,u});
        return;
    }
    ms.insert({t,u});
    auto it = ms.lower_bound({t,u});
    auto it2=++it;it--;auto it3=--it;it++;
    ans-=cal(it2->s,it3->s);
    ans+=cal(it2->s,it->s);
    ans+=cal(it3->s,it->s);
}
void del(int t,int u){
    if(ms.size()==1){
        ms.erase({t,u});return;
    }
    if(ms.size()==2){
        ans-=2*(cal(ms.begin()->s,(--ms.end())->s));
        ms.erase({t,u});return;
    }auto it = ms.lower_bound({t,u});
    if(it==ms.begin()){
        ans-=cal(it->s,(--ms.end())->s);
        ans-=cal(it->s,next(it)->s);
        ans+=cal(next(it)->s,(--ms.end())->s);
        ms.erase({t,u});return;
    }
    if(it==(--ms.end())){
        ans-=cal(it->s,prev(--ms.end())->s);
        ans-=cal(it->s,ms.begin()->s);
        ans+=cal(ms.begin()->s,prev(--ms.end())->s);
        ms.erase({t,u});return;
    }auto it2=--it;it++;auto it3=++it;it--;
    ans-=cal(it2->s,it->s);ans-=cal(it3->s,it->s);
    ans+=cal(it2->s,it3->s);ms.erase({t,u});

}
int main(){
    ios_base::sync_with_stdio(0);cin.tie(0);
    int n,m,q;cin>>n>>m>>q;
    for(int i=1;i<=n-1;i++){
        int u,v;cin>>u>>v;g[u].pb(v),g[v].pb(u);
    }dfs(1,1,0);int a[m+1];vector<pair<pii,int>>qr(q);
    for(int i=1;i<=m;i++)cin>>a[i];
    for(int i=0;i<q;i++)cin>>qr[i].f.f>>qr[i].f.s,qr[i].s=i;
    sort(qr.begin(),qr.end(),cmp);int res[q];
    int cl=1,cr=0;
    for(auto it : qr){
        while(cr<it.f.s)cr++,add(tin[a[cr]],a[cr]);
        while(cl>it.f.f)cl--,add(tin[a[cl]],a[cl]);
        while(cr>it.f.s)del(tin[a[cr]],a[cr]),cr--;
        while(cl<it.f.f)del(tin[a[cl]],a[cl]),cl++;
        res[it.s]=ans/2+1;
    }for(int i=0;i<q;i++)cout<<res[i]<<'\n';
}

Compilation message

tourism.cpp: In function 'void dfs(int, int, int)':
tourism.cpp:23:9: warning: this 'if' clause does not guard... [-Wmisleading-indentation]
   23 |         if(v==p)continue;dfs(v,u,l+1);
      |         ^~
tourism.cpp:23:26: note: ...this statement, but the latter is misleadingly indented as if it were guarded by the 'if'
   23 |         if(v==p)continue;dfs(v,u,l+1);
      |                          ^~~
# 결과 실행 시간 메모리 Grader output
1 Correct 1 ms 4952 KB Output is correct
2 Correct 1 ms 2908 KB Output is correct
3 Incorrect 1 ms 4956 KB Output isn't correct
4 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 1 ms 4952 KB Output is correct
2 Correct 1 ms 2908 KB Output is correct
3 Incorrect 1 ms 4956 KB Output isn't correct
4 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 1 ms 4952 KB Output is correct
2 Runtime error 4 ms 9964 KB Execution killed with signal 11
3 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 1 ms 2908 KB Output is correct
2 Incorrect 58 ms 10664 KB Output isn't correct
3 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 1 ms 4952 KB Output is correct
2 Runtime error 3 ms 5720 KB Execution killed with signal 11
3 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 1 ms 4952 KB Output is correct
2 Correct 1 ms 2908 KB Output is correct
3 Incorrect 1 ms 4956 KB Output isn't correct
4 Halted 0 ms 0 KB -