답안 #1001733

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
1001733 2024-06-19T07:21:04 Z amine_aroua Inside information (BOI21_servers) C++17
50 / 100
331 ms 63108 KB
#include <bits/stdc++.h>
//#pragma GCC optimize("O3")
//#pragma GCC optimize("unroll-loops")
using namespace std;
#define int long long
#define pb push_back
#define nl '\n'
#define fore(i, y) for(int i = 0; i < y; i++)
#define forr(i, x, y) for(int i = x;i<=y;i++)
#define forn(i, y, x) for(int i = y; i >= x; i--)
const int N = 3e5 + 10;
vector<pair<int ,int>> adj[N];
int subtree[N] ;
int belongs[N];
bool forbidden[N];
int join[N] , up[N];
bool decre[N] , incre[N];
void dfs_subtree(int x ,int p)
{
    subtree[x] = 1;
    for(auto [u,i] :adj[x])
    {
        if(u == p || forbidden[u])
            continue;
        dfs_subtree(u , x);
        subtree[x]+=subtree[u];
    }
}
int dfs_down(int x , int p ,int n)
{
    for(auto [u,i] : adj[x])
    {
        if(u == p || forbidden[u])
            continue;
        if(subtree[u] > n/2)
            return dfs_down(u , x , n);
    }
    return x;
}
vector<int> nodes;
void dfs_belong(int x , int p , int child , int edge_p , int edge_join)
{
    nodes.pb(x);
    belongs[x] = child;
    up[x] = edge_p;
    join[x] = edge_join;
    for(auto [u , i] : adj[x])
    {
        if(u == p || forbidden[u])
            continue;
        dfs_belong(u , x , child , i , edge_join);
    }
}
void dfs_incre(int x , int p , int edge_p)
{
    incre[x] = 1;
    for(auto [u,i] : adj[x])
    {
        if(u == p || forbidden[u])
            continue;
        if(i <= edge_p)
            continue;
        dfs_incre(u , x , i);
    }
}
void dfs_decre(int x , int p , int edge_p)
{
    decre[x] = 1;
    for(auto [u,i] : adj[x])
    {
        if(u == p || forbidden[u])
            continue;
        if(i >= edge_p)
            continue;
        dfs_decre(u , x , i);
    }
}
int ans[N];
vector<vector<int>> queries_in_subtree[N];
void rec(int root , vector<vector<int>> queries)
{
    vector<int>().swap(nodes);
    vector<vector<int>>().swap(queries_in_subtree[root]);
    dfs_subtree(root , -1);
    int centroid = dfs_down(root ,-1 , subtree[root]);
    incre[centroid] = 1;
    decre[centroid] = 1;
    belongs[centroid] = centroid;
    for(auto [child,i] : adj[centroid])
    {
        if(!forbidden[child])
        {
            dfs_belong(child , centroid , child , i , i);
            dfs_incre(child , centroid , i);
            dfs_decre(child , centroid , i);
        }
    }
    for(auto query : queries)
    {
        int a = query[0] , b = query[1] , id = query[2];
        if(belongs[a] != belongs[b])
        {
            if(a == centroid)
            {
                ans[id] = (decre[b] && join[b] < id);
            }
            else if(b == centroid)
            {
                ans[id] = (incre[a] && up[a] < id);
            }
            else
                ans[id] = (incre[a] && decre[b] && join[a] > join[b] && up[a] < id);
        }
        else
        {
            queries_in_subtree[belongs[a]].pb(query);
        }
    }
    for(auto node : nodes)
        decre[node] = incre[node] = 0;
    forbidden[centroid] = 1;
    for(auto [u,i] : adj[centroid])
    {
        if(!forbidden[u])
            rec(u , queries_in_subtree[u]);
    }
}
signed main() {
    ios::sync_with_stdio(0);
    cin.tie(0);
    cout.tie(0);
    int n , q;
    cin>>n>>q;
    vector<vector<int>> queries;
    vector<char> type;
    fore(i , n + q - 1)
    {
        char c;
        cin>>c;
        type.pb(c);
        if(c == 'S')
        {
            int a , b;
            cin>>a>>b;
            adj[a].pb({b , i});
            adj[b].pb({a , i});
        }
        if(c == 'Q')
        {
            int a , d;
            cin>>a>>d;
            if(a == d)
                ans[i] = 1;
            else
                queries.pb({a , d , i});
        }
    }
    rec(1 , queries);
    fore(i , n + q - 1)
    {
        if(type[i] == 'Q')
        {
            cout<<(ans[i] ? "yes" : "no")<<nl;
        }
    }
}
# 결과 실행 시간 메모리 Grader output
1 Correct 40 ms 31036 KB Output is correct
2 Correct 60 ms 34048 KB Output is correct
3 Correct 94 ms 39284 KB Output is correct
4 Correct 60 ms 35680 KB Output is correct
5 Correct 57 ms 35612 KB Output is correct
6 Correct 39 ms 30464 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 40 ms 31036 KB Output is correct
2 Correct 60 ms 34048 KB Output is correct
3 Correct 94 ms 39284 KB Output is correct
4 Correct 60 ms 35680 KB Output is correct
5 Correct 57 ms 35612 KB Output is correct
6 Correct 39 ms 30464 KB Output is correct
7 Incorrect 37 ms 30936 KB Extra information in the output file
8 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 36 ms 29708 KB Output is correct
2 Correct 76 ms 44396 KB Output is correct
3 Correct 77 ms 44396 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 36 ms 29708 KB Output is correct
2 Correct 76 ms 44396 KB Output is correct
3 Correct 77 ms 44396 KB Output is correct
4 Incorrect 31 ms 28416 KB Extra information in the output file
5 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 42 ms 34072 KB Output is correct
2 Correct 330 ms 56312 KB Output is correct
3 Correct 297 ms 56736 KB Output is correct
4 Correct 157 ms 62876 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 42 ms 34072 KB Output is correct
2 Correct 330 ms 56312 KB Output is correct
3 Correct 297 ms 56736 KB Output is correct
4 Correct 157 ms 62876 KB Output is correct
5 Incorrect 39 ms 32780 KB Extra information in the output file
6 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 40 ms 32768 KB Output is correct
2 Correct 141 ms 49144 KB Output is correct
3 Correct 273 ms 46972 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 40 ms 32768 KB Output is correct
2 Correct 141 ms 49144 KB Output is correct
3 Correct 273 ms 46972 KB Output is correct
4 Incorrect 36 ms 31236 KB Extra information in the output file
5 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 41 ms 34060 KB Output is correct
2 Correct 319 ms 56320 KB Output is correct
3 Correct 331 ms 57052 KB Output is correct
4 Correct 160 ms 63108 KB Output is correct
5 Correct 38 ms 33012 KB Output is correct
6 Correct 151 ms 48892 KB Output is correct
7 Correct 256 ms 47108 KB Output is correct
8 Correct 160 ms 49272 KB Output is correct
9 Correct 289 ms 49996 KB Output is correct
10 Correct 309 ms 49148 KB Output is correct
11 Correct 268 ms 50612 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 41 ms 34060 KB Output is correct
2 Correct 319 ms 56320 KB Output is correct
3 Correct 331 ms 57052 KB Output is correct
4 Correct 160 ms 63108 KB Output is correct
5 Correct 38 ms 33012 KB Output is correct
6 Correct 151 ms 48892 KB Output is correct
7 Correct 256 ms 47108 KB Output is correct
8 Correct 160 ms 49272 KB Output is correct
9 Correct 289 ms 49996 KB Output is correct
10 Correct 309 ms 49148 KB Output is correct
11 Correct 268 ms 50612 KB Output is correct
12 Incorrect 40 ms 32932 KB Extra information in the output file
13 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 38 ms 30988 KB Output is correct
2 Correct 48 ms 34056 KB Output is correct
3 Correct 97 ms 39504 KB Output is correct
4 Correct 61 ms 35596 KB Output is correct
5 Correct 56 ms 35672 KB Output is correct
6 Correct 39 ms 30464 KB Output is correct
7 Correct 34 ms 29696 KB Output is correct
8 Correct 80 ms 44400 KB Output is correct
9 Correct 69 ms 44396 KB Output is correct
10 Correct 38 ms 34060 KB Output is correct
11 Correct 283 ms 56444 KB Output is correct
12 Correct 325 ms 56828 KB Output is correct
13 Correct 175 ms 62920 KB Output is correct
14 Correct 44 ms 32772 KB Output is correct
15 Correct 138 ms 48892 KB Output is correct
16 Correct 257 ms 47096 KB Output is correct
17 Correct 164 ms 49276 KB Output is correct
18 Correct 257 ms 50044 KB Output is correct
19 Correct 264 ms 49068 KB Output is correct
20 Correct 224 ms 50548 KB Output is correct
21 Correct 94 ms 47292 KB Output is correct
22 Correct 100 ms 48636 KB Output is correct
23 Correct 198 ms 53600 KB Output is correct
24 Correct 175 ms 53936 KB Output is correct
25 Correct 303 ms 54056 KB Output is correct
26 Correct 234 ms 43644 KB Output is correct
27 Correct 212 ms 43664 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 38 ms 30988 KB Output is correct
2 Correct 48 ms 34056 KB Output is correct
3 Correct 97 ms 39504 KB Output is correct
4 Correct 61 ms 35596 KB Output is correct
5 Correct 56 ms 35672 KB Output is correct
6 Correct 39 ms 30464 KB Output is correct
7 Correct 34 ms 29696 KB Output is correct
8 Correct 80 ms 44400 KB Output is correct
9 Correct 69 ms 44396 KB Output is correct
10 Correct 38 ms 34060 KB Output is correct
11 Correct 283 ms 56444 KB Output is correct
12 Correct 325 ms 56828 KB Output is correct
13 Correct 175 ms 62920 KB Output is correct
14 Correct 44 ms 32772 KB Output is correct
15 Correct 138 ms 48892 KB Output is correct
16 Correct 257 ms 47096 KB Output is correct
17 Correct 164 ms 49276 KB Output is correct
18 Correct 257 ms 50044 KB Output is correct
19 Correct 264 ms 49068 KB Output is correct
20 Correct 224 ms 50548 KB Output is correct
21 Correct 94 ms 47292 KB Output is correct
22 Correct 100 ms 48636 KB Output is correct
23 Correct 198 ms 53600 KB Output is correct
24 Correct 175 ms 53936 KB Output is correct
25 Correct 303 ms 54056 KB Output is correct
26 Correct 234 ms 43644 KB Output is correct
27 Correct 212 ms 43664 KB Output is correct
28 Incorrect 37 ms 30732 KB Extra information in the output file
29 Halted 0 ms 0 KB -