제출 #1026100

#제출 시각아이디문제언어결과실행 시간메모리
102610012345678Inside information (BOI21_servers)C++17
50 / 100
125 ms35668 KiB
#include <bits/stdc++.h>

using namespace std;

const int nx=250005, kx=18;

int n, k, a[nx], b[nx], cnt[nx], lvl[nx], pa[nx][kx], up[nx], dn[nx], pw[nx], t, in[nx], out[nx];
char opr[nx];
vector<pair<int, int>> d[nx];

void dfs(int u, int p)
{
    lvl[u]=lvl[p]+1;
    in[u]=++t;
    up[u]=p;
    if (pw[u]<pw[p]) up[u]=up[p];
    dn[u]=p;
    if (pw[u]>pw[p]) dn[u]=dn[p];
    pa[u][0]=p;
    for (int i=1; i<kx; i++) pa[u][i]=pa[pa[u][i-1]][i-1];
    for (auto [v, w]:d[u]) if (v!=p) pw[v]=w, dfs(v, u);
    out[u]=t;
}

pair<int, int> query1(int idx)
{
    //cout<<"query "<<a[idx]<<' '<<b[idx]<<'\n';
    if (in[a[idx]]<=in[b[idx]]&&in[b[idx]]<=out[a[idx]]) return {a[idx], 0};
    int tmp=a[idx];
    for (int i=kx-1; i>=0; i--) if (!(in[pa[tmp][i]]<=in[b[idx]]&&in[b[idx]]<=out[pa[tmp][i]])) tmp=pa[tmp][i];
    if (lvl[up[a[idx]]]>lvl[pa[tmp][0]]) return {-1, 0};
    return {pa[tmp][0], pw[tmp]};
}

int main()
{
    cin.tie(NULL)->sync_with_stdio(false);
    cin>>n>>k;
    for (int i=1; i<n+k; i++)
    {
        cin>>opr[i];
        cnt[i]=cnt[i-1];
        if (opr[i]=='S') cin>>a[i]>>b[i], cnt[i]++, d[a[i]].push_back({b[i], cnt[i]}), d[b[i]].push_back({a[i], cnt[i]});
        if (opr[i]=='Q') cin>>b[i]>>a[i];
        if (opr[i]=='C') cin>>a[i];
    }
    dfs(1, 1);
    //for (int i=1; i<=n; i++) cout<<"dfs "<<i<<' '<<up[i]<<' '<<dn[i]<<' '<<in[i]<<' '<<out[i]<<'\n';
    for (int i=1; i<n+k; i++)
    {
        if (opr[i]=='Q')
        {
            auto [u, lst]=query1(i);
            //cout<<"debug "<<i<<' '<<u<<' '<<lst<<'\n';
            if (u==-1) cout<<"no\n";
            else
            {
                if (u==b[i]&&lst<=cnt[i]) cout<<"yes\n";
                else if (u==b[i]&&lst>cnt[i]) cout<<"no\n";
                else
                {
                    int vl=pw[b[i]], tmp=b[i];
                    if (lvl[dn[b[i]]]>lvl[u]||pw[b[i]]>cnt[i]) cout<<"no\n";
                    else
                    {
                        for (int j=kx-1; j>=0; j--) if (lvl[pa[tmp][j]]>lvl[u]) tmp=pa[tmp][j];
                        if (lst<pw[tmp]) cout<<"yes\n";
                        else cout<<"no\n";
                    }
                }
            }
        }
        if (opr[i]=='C') cout<<0<<'\n';
    }
}

컴파일 시 표준 에러 (stderr) 메시지

servers.cpp: In function 'int main()':
servers.cpp:62:25: warning: unused variable 'vl' [-Wunused-variable]
   62 |                     int vl=pw[b[i]], tmp=b[i];
      |                         ^~
#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...
#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...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...