답안 #223632

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
223632 2020-04-15T20:50:36 Z 2fat2code Traffickers (RMI18_traffickers) C++17
컴파일 오류
0 ms 0 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 int long long
#define pii pair<pair<int,int>,int>
#define mp make_pair
#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;

const int nmax=30005;

int n,q,parinte[nmax],lca[nmax][23],aib[21][21][2*nmax],first[nmax],last[nmax],height[nmax];
vector<int>nod[nmax],euler;


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



int findLCA(int x, int y){
	if(x==y) return x;
    if(tin[x]<tin[y] && tout[x]>tout[y]) return x;
    if(tin[y]<tin[x] && tout[y]>tout[x]) return y;
    while(true){
        bool bl=false;
        for(int j=0;j<=21;j++){
            int x1=lca[x][j];
            int y1=lca[x][j+1];
            if(tin[x1]>tin[y] || tout[x1]<tout[y]){
                if(tin[y1]<tin[y] && tout[y1]>tout[y]){
                    x=x1;
                    bl=true;
                    break;
                }
            }
        }
        if(bl==false) break;
    }
    return lca[x][0];
}

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

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


void query12(int x,int y,int type){
    int lc=findLCA(x,y);
    vector<int>path;
    while(x!=lc){
        path.push_back(x);
        x=parinte[x];
    }
    vector<int>tz;
    while(y!=lc){
        tz.push_back(y);
        y=parinte[y];
    }
    tz.push_back(y);
  if(tz.size())  for(int i=tz.size()-1;i>=0;i--) path.push_back(tz[i]);
    for(int i=0;i<path.size();i++){
        int nod = path[i];
        if(type==1){
            update(first[nod],1,aib[i][path.size()]);
            update(last[nod]+1,-1,aib[i][path.size()]);
        }
        else{
            update(first[nod],-1,aib[i][path.size()]);
            update(last[nod]+1,1,aib[i][path.size()]);
        }
    }
}


int query3(int x,int y,int timp){
    if(timp==-1) return 0LL;
    int lc=findLCA(x,y);
    int ans=0;
    for(int i=1;i<=20;i++){
        int cmp=(timp+1)/i;
        bool bo=false;
        for(int j=0;j<i;j++){
            if((timp+1)%i>j){
                bo=true;
                cmp++;
            }
            ans+=cmp*(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]));
            if(bo==true){
                bo=false;
                cmp--;
            }
        }
    }
    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);
    }
    int timp=0;
    DFS(1,-1,timp);
    int pop=0;
    for(auto it:euler){
        pop++;
        if(first[it]==0){
            first[it]=pop;
            last[it]=pop;
        }
        else last[it]=pop;
    }
    for(int i=1;i<=n;i++) lca[i][0]=parinte[i];
    for(int i=1;(1<<i)<=n;i++){
        for(int j=1;j<=n;j++) lca[j][i]=lca[lca[j][i-1]][i-1];
    }
    parinte[1]=0;
    cin >> q;
    for(int i=1;i<=q;i++){
        int x,y;
        cin >> x >> y;
        query12(x,y,1);
    }
    cin >> q;
    int t=0;
    for(int i=1;i<=q;i++){
        cin >> t;
        if(t==1 || t==2){
            int x,y;
            cin >> x >> y;
            query12(x,y,t);
        }
        else{
            int x,y,t1,t2;
            cin >> x >> y >> t1 >> t2;
            --t1;
            cout << query3(x,y,t2) - query3(x,y,t1) << '\n';
        }
    }
}

Compilation message

traffickers.cpp: In function 'void DFS(long long int, long long int, long long int&)':
traffickers.cpp:32:5: error: 'tin' was not declared in this scope
     tin[s]=(++timp);
     ^~~
traffickers.cpp:32:5: note: suggested alternative: 'tan'
     tin[s]=(++timp);
     ^~~
     tan
traffickers.cpp:39:5: error: 'tout' was not declared in this scope
     tout[s]=(++timp);
     ^~~~
traffickers.cpp:39:5: note: suggested alternative: 'stdout'
     tout[s]=(++timp);
     ^~~~
     stdout
traffickers.cpp: In function 'long long int findLCA(long long int, long long int)':
traffickers.cpp:46:8: error: 'tin' was not declared in this scope
     if(tin[x]<tin[y] && tout[x]>tout[y]) return x;
        ^~~
traffickers.cpp:46:8: note: suggested alternative: 'tan'
     if(tin[x]<tin[y] && tout[x]>tout[y]) return x;
        ^~~
        tan
traffickers.cpp:46:25: error: 'tout' was not declared in this scope
     if(tin[x]<tin[y] && tout[x]>tout[y]) return x;
                         ^~~~
traffickers.cpp:46:25: note: suggested alternative: 'stdout'
     if(tin[x]<tin[y] && tout[x]>tout[y]) return x;
                         ^~~~
                         stdout
traffickers.cpp:47:8: error: 'tin' was not declared in this scope
     if(tin[y]<tin[x] && tout[y]>tout[x]) return y;
        ^~~
traffickers.cpp:47:8: note: suggested alternative: 'tan'
     if(tin[y]<tin[x] && tout[y]>tout[x]) return y;
        ^~~
        tan
traffickers.cpp:47:25: error: 'tout' was not declared in this scope
     if(tin[y]<tin[x] && tout[y]>tout[x]) return y;
                         ^~~~
traffickers.cpp:47:25: note: suggested alternative: 'stdout'
     if(tin[y]<tin[x] && tout[y]>tout[x]) return y;
                         ^~~~
                         stdout
traffickers.cpp:53:16: error: 'tin' was not declared in this scope
             if(tin[x1]>tin[y] || tout[x1]<tout[y]){
                ^~~
traffickers.cpp:53:16: note: suggested alternative: 'tan'
             if(tin[x1]>tin[y] || tout[x1]<tout[y]){
                ^~~
                tan
traffickers.cpp:53:34: error: 'tout' was not declared in this scope
             if(tin[x1]>tin[y] || tout[x1]<tout[y]){
                                  ^~~~
traffickers.cpp:53:34: note: suggested alternative: 'stdout'
             if(tin[x1]>tin[y] || tout[x1]<tout[y]){
                                  ^~~~
                                  stdout
traffickers.cpp: In function 'void update(long long int, long long int, long long int*)':
traffickers.cpp:67:14: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
     while(pos<=euler.size()){
           ~~~^~~~~~~~~~~~~~
traffickers.cpp: In function 'void query12(long long int, long long int, long long int)':
traffickers.cpp:97:18: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
     for(int i=0;i<path.size();i++){
                 ~^~~~~~~~~~~~