답안 #217084

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
217084 2020-03-28T23:14:01 Z 2fat2code Traffickers (RMI18_traffickers) C++14
0 / 100
803 ms 524292 KB
#include <bits/stdc++.h>
#define ll long long
#define ld long double
#define all(a) (a).begin(), (a).end()
//#pragma GCC optimize("O3")
//#pragma GCC optimize("Ofast")
//#pragma GCC taraget("sse,sse2,sse3,ssse3,sse4,popcnt,abm,mmx,avx,tune=native")
#define sz() size()
#define fr first
#define sc second
#define pi pair<int,int>
#define pii pair<pair<int,int>,int>
#define mp make_pair
//#define int long long
#define rc(s) return cout<<s,0
#define rcc(s) cout<<s,exit(0)
using namespace std;

const int mod=1e9+7;
const int modp=1999999973;
const int modulo=998244353;

int n,q,parinte[30005],lca[30005][17],tin[30005],tout[30005];
int aib[21][21][60005],depth[30005],first[30005],last[30005];
vector<int>nod[30005],euler;

void DFS(int s,int par,int lvl){
    euler.push_back(s);
    parinte[s]=par;
    depth[s]=lvl;
    for(auto it:nod[s]){
        if(it!=par){
            DFS(it,s,lvl+1);
            euler.push_back(s);
        }
    }
}

void DFStimp(int s,int par,int &timp){
    tin[s]=timp;
    ++timp;
    for(auto it:nod[s]){
        if(it!=par){
            DFStimp(it,s,timp);
        }
    }
    tout[s]=timp;
    ++timp;
}

int lowestca(int x,int y){
    if(x==y) return x;
    else{
        if(tin[x]<tin[y] && tout[x]>tout[y]) return x;
        if(tin[y]<tin[x] && tout[y]>tout[x]) return y;
        else{
            while(true){
                bool b=true;
                for(int i=0;i<=15;i++){
                    int x1=lca[x][i];
                    int y1=lca[x][i+1];
                    if(tin[y1]<tin[y] && tout[y1]>tout[y]){
                        if(tin[x1]>tin[y] || tout[x1]<tout[y]){
                            x=x1;
                            b=false;
                            break;
                        }
                    }
                }
                if(b==true) return lca[x][0];
            }
        }
    }
}

void update(int pos,int val,int arr[]){
    while(pos<=euler.size()){
        arr[pos]+=val;
        pos+=(pos&-pos);
    }
    return;
}

int sum(int pos,int arr[]){
    int sum=0;
    while(pos){
        sum+=arr[pos];
        pos-=(pos&-pos);
    }
    return sum;
}

void querytip12(int x,int y,int tip){
    int lc = lowestca(x,y);
    int distanta = depth[x] + depth[y] - 2*depth[lc] + 1;
    vector<int>path;
    int curr = x;
    path.push_back(curr);
    while(curr!=lc){
        curr = parinte[curr];
        path.push_back(curr);
    }
    curr=y;
    vector<int>tz;
    tz.push_back(curr);
    while(curr!=lc){
        curr=parinte[curr];
        tz.push_back(curr);
    }
    tz.pop_back();
    if(tz.size()){
        for(int i=tz.size()-1;i>=0;i--) path.push_back(tz[i]);
    }
    for(int i=0;i<=19;i++){
        int nod=path[i%path.size()];
        if(tip==1){
            update(first[nod],1,aib[path.size()][i]);
            update(last[nod]+1,-1,aib[path.size()][i]);
        }
        else{
            update(first[nod],-1,aib[path.size()][i]);
            update(last[nod]+1,1,aib[path.size()][i]);
        }
    }
}

int query3(int x,int y,int t1,int t2){
    int cant[20];
    for(int i=0;i<=19;i++) cant[i]=0;
    while(t1%20!=0 && t1<t2){
        cant[t1%20]++;
        t1++;
    }
    while(t2%20!=19 && t2>t1){
        cant[t2%20]++;
        t2--;
    }
    if(t1==t2) cant[t1%20]++;
    else{
        int c=(t2-t1+1);
        for(int i=0;i<=19;i++) cant[i]+=(c/20);
    }
    int ans=0;
    int lc=lowestca(x,y);
    for(int i=0;i<=19;i++){
        for(int j=1;j<=20;j++){
            int cnt=cant[i]*(sum(first[x],aib[j][i])+sum(first[y],aib[j][i])-sum(first[lc],aib[j][i])-sum(first[parinte[lc]],aib[j][i]));
            ans+=cnt;
        }
    }
    return ans;
}

int32_t main(){
    ios_base::sync_with_stdio(false);cin.tie(0);cerr.tie(0);cout.tie(0);
    srand(chrono::steady_clock::now().time_since_epoch().count());
 //   ifstream cin("input.in");
    cin >> n;
    for(int i=1;i<n;i++){
        int x,y;
        cin >> x >> y;
        nod[x].push_back(y);
        nod[y].push_back(x);
    }
    DFS(1,-1,0);
    int cnt=0;
    for(auto it:euler){
        ++cnt;
        if(first[it]==0){
            first[it]=cnt;
            last[it]=cnt;
        }
        else last[it]=cnt;
    }
    for(int i=1;i<=n;i++) lca[i][0]=parinte[i];
    for(int j=1;j<=16;j++){
        for(int i=1;i<=n;i++){
            lca[i][j]=lca[lca[i][j-1]][j-1];
        }
    }
    int timp=0;
    tin[0]=1e18;
    tout[0]=1e18;
    DFStimp(1,-1,timp);
    cin >> q;
    for(int i=1;i<=q;i++){
        int x,y;
        cin >> x >> y;
        querytip12(x,y,1);
    }
    cin >> q;
    int type=0;
    for(int i=1;i<=q;i++){
        cin >> type;
        if(type!=3){
            int x,y;
            cin >> x >> y;
            if(type==1) querytip12(x,y,1);
            if(type==2) querytip12(x,y,2);
        }
        else{
            int x,y,z,t;
            cin >> x >> y >> z >> t;
            cout << query3(x,y,z,t) << '\n';
        }
    }
}

Compilation message

traffickers.cpp: In function 'void update(int, int, int*)':
traffickers.cpp:77:14: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
     while(pos<=euler.size()){
           ~~~^~~~~~~~~~~~~~
traffickers.cpp: In function 'void querytip12(int, int, int)':
traffickers.cpp:95:9: warning: unused variable 'distanta' [-Wunused-variable]
     int distanta = depth[x] + depth[y] - 2*depth[lc] + 1;
         ^~~~~~~~
traffickers.cpp: In function 'int32_t main()':
traffickers.cpp:182:12: warning: overflow in implicit constant conversion [-Woverflow]
     tin[0]=1e18;
            ^~~~
traffickers.cpp:183:13: warning: overflow in implicit constant conversion [-Woverflow]
     tout[0]=1e18;
             ^~~~
# 결과 실행 시간 메모리 Grader output
1 Runtime error 763 ms 524292 KB Execution killed with signal 9 (could be triggered by violating memory limits)
2 Runtime error 756 ms 524292 KB Execution killed with signal 9 (could be triggered by violating memory limits)
3 Runtime error 754 ms 524292 KB Execution killed with signal 9 (could be triggered by violating memory limits)
# 결과 실행 시간 메모리 Grader output
1 Runtime error 765 ms 524288 KB Execution killed with signal 9 (could be triggered by violating memory limits)
2 Runtime error 738 ms 524292 KB Execution killed with signal 9 (could be triggered by violating memory limits)
3 Runtime error 759 ms 524292 KB Execution killed with signal 9 (could be triggered by violating memory limits)
4 Runtime error 745 ms 524292 KB Execution killed with signal 9 (could be triggered by violating memory limits)
5 Runtime error 777 ms 524292 KB Execution killed with signal 9 (could be triggered by violating memory limits)
6 Runtime error 772 ms 524292 KB Execution killed with signal 9 (could be triggered by violating memory limits)
7 Runtime error 758 ms 524292 KB Execution killed with signal 9 (could be triggered by violating memory limits)
8 Runtime error 757 ms 524292 KB Execution killed with signal 9 (could be triggered by violating memory limits)
9 Runtime error 764 ms 524292 KB Execution killed with signal 9 (could be triggered by violating memory limits)
# 결과 실행 시간 메모리 Grader output
1 Runtime error 776 ms 524288 KB Execution killed with signal 9 (could be triggered by violating memory limits)
2 Runtime error 803 ms 524292 KB Execution killed with signal 9 (could be triggered by violating memory limits)
3 Runtime error 777 ms 524292 KB Execution killed with signal 9 (could be triggered by violating memory limits)
4 Runtime error 739 ms 524292 KB Execution killed with signal 9 (could be triggered by violating memory limits)
5 Runtime error 775 ms 524292 KB Execution killed with signal 9 (could be triggered by violating memory limits)
6 Runtime error 771 ms 524292 KB Execution killed with signal 9 (could be triggered by violating memory limits)
7 Runtime error 769 ms 524292 KB Execution killed with signal 9 (could be triggered by violating memory limits)
8 Runtime error 769 ms 524288 KB Execution killed with signal 9 (could be triggered by violating memory limits)