Submission #374050

#TimeUsernameProblemLanguageResultExecution timeMemory
374050denkendoemeerSynchronization (JOI13_synchronization)C++14
100 / 100
405 ms32236 KiB
#include<bits/stdc++.h>
#define ll long long
const int inf=1e9;
using namespace std;
int x[100005],y[100005],z[100005],l[100005],in[100005],out[100005],c[100005],aib[100005];
vector<int>g[100005],s[100005];
int n,u,m,q;
void update(int poz,int val)
{
    while(poz<=n){
        aib[poz]+=val;
        poz+=poz&-poz;
    }
}
int query(int poz)
{
    int sum=0;
    while(poz){
        sum+=aib[poz];
        poz-=poz&-poz;
    }
    return sum;
}
void dfs(int nod,int t)
{
    s[nod].emplace_back(t);
    in[nod]=++u;
    int i;
    for(i=0;i<s[s[nod][i]].size();i++)
        s[nod].emplace_back(s[s[nod][i]][i]);
    for(auto &it:g[nod])
        if (it!=t)
            dfs(it,nod);
    out[nod]=u+1;
}
int calc(int nod)
{
    int x=query(in[nod]);
    int i;
    for(i=20;i>=0;i--)
        if (i<s[nod].size() && x==query(in[s[nod][i]]))
            nod=s[nod][i];
    return nod;
}
int main()
{
    //freopen(".in","r",stdin);
    //freopen(".out","w",stdout);
    int i;
    scanf("%d%d%d",&n,&m,&q);
    for(i=1;i<n;i++){
        scanf("%d%d",&x[i],&y[i]);
        g[x[i]].emplace_back(y[i]);
        g[y[i]].emplace_back(x[i]);
    }
    dfs(1,0);
    for(i=1;i<n;i++)
        if (s[x[i]][0]==y[i])
            swap(x[i],y[i]);
    for(i=1;i<=n;i++)
        z[i]=1,update(in[i],1),update(out[i],-1);
    for(i=1;i<=m;i++){
        int a,b;
        scanf("%d",&a);
        b=calc(x[a]);
        if (c[a]==0){
            update(in[y[a]],-1);
            update(out[y[a]],1);
            z[b]+=z[y[a]]-l[a];
        }
        if (c[a]==1){
            update(in[y[a]],1);
            update(out[y[a]],-1);
            z[y[a]]=l[a]=z[b];
        }
        c[a]=1-c[a];
    }
    for(i=1;i<=n;i++)
        z[i]=z[calc(i)];
    for(i=1;i<=q;i++){
        int a;
        scanf("%d",&a);
        printf("%d\n",z[a]);
    }
return 0;
}

Compilation message (stderr)

synchronization.cpp: In function 'void dfs(int, int)':
synchronization.cpp:29:14: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   29 |     for(i=0;i<s[s[nod][i]].size();i++)
      |             ~^~~~~~~~~~~~~~~~~~~~
synchronization.cpp: In function 'int calc(int)':
synchronization.cpp:41:14: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   41 |         if (i<s[nod].size() && x==query(in[s[nod][i]]))
      |             ~^~~~~~~~~~~~~~
synchronization.cpp: In function 'int main()':
synchronization.cpp:50:10: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
   50 |     scanf("%d%d%d",&n,&m,&q);
      |     ~~~~~^~~~~~~~~~~~~~~~~~~
synchronization.cpp:52:14: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
   52 |         scanf("%d%d",&x[i],&y[i]);
      |         ~~~~~^~~~~~~~~~~~~~~~~~~~
synchronization.cpp:64:14: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
   64 |         scanf("%d",&a);
      |         ~~~~~^~~~~~~~~
synchronization.cpp:82:14: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
   82 |         scanf("%d",&a);
      |         ~~~~~^~~~~~~~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...