제출 #1165234

#제출 시각아이디문제언어결과실행 시간메모리
1165234salmonJanjetina (COCI21_janjetina)C++20
0 / 110
1 ms2704 KiB
#include <bits/stdc++.h>
using namespace std;

int N,K;
bool visited[100100];
vector<vector<pair<int,int>>> v;
vector<pair<int,int>> adjlst[100100];
int u,v1,w;
int sise[100100];
int ft[100100];
int parent[100100];

int query(int i){
	i++;
	int v = 0;
	while(i != 0){
		v += ft[i];
		i -= (i&(-i));
	}
	return v;
}

void update(int i, int N){
	i++;
	while(i <= N){
		ft[i]++;
		i += (i&(-i));
	}
}

void dfs(int i, int p){
    sise[i] = 1;
    parent[i] = p;

    for(pair<int,int> ii : adjlst[i]){
        if(visited[ii.first] || ii.first == p) continue;
        dfs(ii.first,i);
        sise[i] += sise[ii.first];
    }
}

void digfs(int i, int p, int vi, int de, int it){
	v[it].push_back({vi,de});

    for(pair<int,int> ii : adjlst[i]){
        if(visited[ii.first] || ii.first == p) continue;
        digfs(ii.first,i,max(ii.second,vi),de+1,it);
    }
}

long long decomp(int i){
    dfs(i,-1);

    int n = sise[i];
    int c = i;

    while(true){
        int temp = c;
        for(pair<int,int> ii : adjlst[c]){
            if(visited[ii.first] || ii.first == parent[c]) continue;
            if(sise[ii.first] >= n/2){
                c = ii.first;
                break;
            }
        }
        if(temp == c) break;
    }
    
    vector<pair<int,int>> vt;

    int cont = 0;
    long long int ans = 0;
    for(pair<int,int> ii : adjlst[c]){
        if(visited[ii.first]) continue;
        v.push_back({});
        digfs(ii.first,c,ii.second,1,cont);
        sort(v[cont].begin(),v[cont].end());
        cont++;
        
		int m = 0;
		
		for(pair<int,int> ii : v[cont - 1]){
			m = max(m,ii.second);
		}
		
		for(pair<int,int> ii : v[cont - 1]){
			if(ii.first -ii.second >= 0) ans -= query(ii.first - ii.second);
			update(ii.second,m);

			vt.push_back(ii);
		}
		
		for(int i = 0; i <= m; i++) ft[i] = 0;
    }

    sort(vt.begin(),vt.end());

	int m = 0;
		
	for(pair<int,int> ii : vt){
		m = max(m,ii.second);
	}

	update(0,m);

	for(pair<int,int> ii : vt){
		if(ii.first -ii.second >= 0) ans += query(ii.first - ii.second);
		update(ii.second,m);
	}
	
	for(int i = 0; i <= m; i++) ft[i] = 0;
	
	v.clear();
	
	visited[c] = true;
	
	for(pair<int,int> ii : adjlst[c]){
		if(visited[ii.first]) continue;
		ans += decomp(ii.first);
	}
	
	return ans;
}

int main(){

    scanf(" %d",&N);
    scanf(" %d",&K);

    for(int i = 0; i < N - 1; i++){
        scanf(" %d",&u);
        scanf(" %d",&v1);
        scanf(" %d",&w);
        w -= K;
        adjlst[u].push_back({v1,w});
        adjlst[v1].push_back({u,w});
    }

    for(int i = 1; i <= N; i++) visited[i] = false;

    printf("%lld",decomp(1) * 2);
}

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

Main.cpp: In function 'int main()':
Main.cpp:127:10: warning: ignoring return value of 'int scanf(const char*, ...)' declared with attribute 'warn_unused_result' [-Wunused-result]
  127 |     scanf(" %d",&N);
      |     ~~~~~^~~~~~~~~~
Main.cpp:128:10: warning: ignoring return value of 'int scanf(const char*, ...)' declared with attribute 'warn_unused_result' [-Wunused-result]
  128 |     scanf(" %d",&K);
      |     ~~~~~^~~~~~~~~~
Main.cpp:131:14: warning: ignoring return value of 'int scanf(const char*, ...)' declared with attribute 'warn_unused_result' [-Wunused-result]
  131 |         scanf(" %d",&u);
      |         ~~~~~^~~~~~~~~~
Main.cpp:132:14: warning: ignoring return value of 'int scanf(const char*, ...)' declared with attribute 'warn_unused_result' [-Wunused-result]
  132 |         scanf(" %d",&v1);
      |         ~~~~~^~~~~~~~~~~
Main.cpp:133:14: warning: ignoring return value of 'int scanf(const char*, ...)' declared with attribute 'warn_unused_result' [-Wunused-result]
  133 |         scanf(" %d",&w);
      |         ~~~~~^~~~~~~~~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...