Submission #201388

# Submission time Handle Problem Language Result Execution time Memory
201388 2020-02-10T10:51:22 Z BorisBarca Putovanje (COCI20_putovanje) C++14
25 / 110
370 ms 79072 KB
/*
$$$$$$$\                      $$\           $$$$$$$\
$$  __$$\                     \__|          $$  __$$\
$$ |  $$ | $$$$$$\   $$$$$$\  $$\  $$$$$$$\ $$ |  $$ | $$$$$$\   $$$$$$\   $$$$$$$\ $$$$$$\
$$$$$$$\ |$$  __$$\ $$  __$$\ $$ |$$  _____|$$$$$$$\ | \____$$\ $$  __$$\ $$  _____|\____$$\
$$  __$$\ $$ /  $$ |$$ |  \__|$$ |\$$$$$$\  $$  __$$\  $$$$$$$ |$$ |  \__|$$ /      $$$$$$$ |
$$ |  $$ |$$ |  $$ |$$ |      $$ | \____$$\ $$ |  $$ |$$  __$$ |$$ |      $$ |     $$  __$$ |
$$$$$$$  |\$$$$$$  |$$ |      $$ |$$$$$$$  |$$$$$$$  |\$$$$$$$ |$$ |      \$$$$$$$\\$$$$$$$ |
\_______/  \______/ \__|      \__|\_______/ \_______/  \_______|\__|       \_______|\_______|
*/
#include <bits/stdc++.h>
 
using namespace std;
 
#define PB push_back
#define MP make_pair
#define INS insert
#define LB lower_bound
#define UB upper_bound
#define pii pair <int,int>
#define pll pair <long long, long long>
#define si pair<string, int>
#define is pair<int, string>
#define X first
#define Y second
#define _ << " " <<
#define sz(x) (int)x.size()
#define all(a) (a).begin(),(a).end()
#define FOR(i, a, b) for (int i = (a); i < (b); ++i)
#define FORD(i, a, b) for (int i = (a); i > (b); --i)
#define FORR(i, l, r) for (int i = (l); i <= (r); ++i)
#define FORP(i, a, b) for ((i) = (a); (i) < (b); ++i)
#define FORA(i, x) for (auto &i : x)
#define REP(i, n) FOR(i, 0, n)
#define BITS(x) __builtin_popcount(x)
#define SQ(a) (a) * (a)
#define TRACE(x) cout << #x " = " << (x) << '\n';
#define YES cout << "YES\n"
#define NO cout << "NO\n"
 
typedef long long ll;
typedef long double ld;
typedef vector <int> vi;
typedef vector <pii> vpi;
typedef vector <ll> vll;
typedef vector <pll> vpl;
typedef vector <double> vd;
typedef vector <ld> vld;
typedef vector<si> vsi;
typedef vector<is> vis;
typedef vector<string> vs;
//((float) t)/CLOCKS_PER_SEC
 
const int MOD = 1e9 + 7;
const double PI = acos(-1);
const int INF = 1e9 + 10;
const ll INFL = 1e18 + 10;
const int ABC = 30;
const int dx[] = {-1, 1, 0, 0};
const int dy[] = {0, 0, -1, 1};
const int dox[] = {-1, 1, 0, 0, -1, -1, 1, 1};
const int doy[] = {0, 0, -1, 1, -1, 1, -1, 1};
 
inline int sum(int a, int b){
	if (a + b < 0)
		return (a + b + MOD) % MOD;
	return (a + b) % MOD;
}
 
inline void add(int &a, int b){
	a = sum(a, b);
}
 
inline int mul(int a, int b){
	return (ll)a * (ll)b % MOD;
}
 
inline int sub(int a, int b){
	return (a - b + MOD) % MOD;
}
 
inline int pot(ll pot, int n){
	ll ret = 1;
	while (n){
		if (n & 1)
			ret = (ret * pot) % MOD;
			pot = (pot * pot) % MOD;
			n >>= 1;
		}
	return ret;
}
 
inline int divide(int a, int b){
	return mul(a, pot(b, MOD - 2));
}
 
ll lcm(ll a, ll b){
	return abs(a * b) / __gcd(a, b);
}
 
inline double ccw(pii A, pii B, pii C){
	return (A.X * B.Y) - (A.Y * B.X) + (B.X * C.Y) - (B.Y * C.X) + (C.X * A.Y) - (C.Y * A.X);
}
 
inline int CCW(pii A, pii B, pii C){
	double val = ccw(A, B, C);
	double eps = max(max(abs(A.X), abs(A.Y)), max(max(abs(B.X), abs(B.Y)), max(abs(C.X), abs(C.Y)))) / 1e9;
	if (val <= -eps)
		return -1;
	if (val >= eps)
		return 1;
	return 0;
}
 
void to_upper(string &x){
	REP(i, sz(x))
		x[i] = toupper(x[i]);
}
 
void to_lower(string &x){
	REP(i, sz(x))
		x[i] = tolower(x[i]);
}
 
string its(ll x){
	if (x == 0)
		return "0";
	string ret = "";
	while (x > 0){
		ret += (x % 10) + '0';
		x /= 10;
	}
	reverse(all(ret));
	return ret;
}
 
ll sti(string s){
	ll ret = 0;
	REP(i, sz(s)){
		ret *= 10;
		ret += (s[i] - '0');
	}
	return ret;
}
 
const int N = 2e5 + 10;
const int LOG = 22;
 
ll n, anc[LOG][N], dep[N], cnt[N];
unordered_map <int, ll> c1[N], c2[N];
vi e[N], razine[N];
 
void dfs(int node, int dad, int d){
	anc[0][node] = dad;
	dep[node] = d;
	razine[d].PB(node);
	FORA(nxt, e[node])
		if (nxt != dad)
			dfs(nxt, node, d + 1);
}

void dp(){
	FOR(i, 1, LOG)
		REP(j, n)
			anc[i][j] = anc[i - 1][anc[i - 1][j]];
}

void digni(int &node, int k){
	REP(i, LOG)
		if (k & (1LL << i))
			node = anc[i][node];
}

int lca(int x, int y){
	if (dep[x] > dep[y])
		digni(x, dep[x] - dep[y]);
	else if (dep[y] > dep[x])
		digni(y, dep[y] - dep[x]);
	if (x == y)
		return x;
	REP(i, LOG){
		if (x == y)
			break;
		x = anc[i][x];
		y = anc[i][y];
	}
	return x;
}

int main () {
	ios_base::sync_with_stdio(false);
	cin.tie(0);
	cout.tie(0);
	
	cin >> n;
	REP(i, n - 1){
		int x, y; cin >> x >> y;
		x--, y--;
		cin >> c1[x][y] >> c2[x][y];
		c1[y][x] = c1[x][y];
		c2[y][x] = c2[x][y];
		e[x].PB(y);
		e[y].PB(x);
	}
	
	dfs(0, -1, 0);
	dp();
	
	REP(i, n - 1){
		int l = lca(i, i + 1);
		cnt[i]++;
		cnt[i + 1]++;
		cnt[l] -= 2;
	}
	
	ll sol = 0;
	FORD(i, N - 1, -1){
		FORA(node, razine[i]){
			FORA(nxt, e[node]){
				if (dep[nxt] > dep[node]){
					sol += min(c2[node][nxt], cnt[nxt] * c1[node][nxt]);
					cnt[node] += cnt[nxt];
				}
			}
		}
	}
	cout << sol << '\n';
 
	return 0;
}

Compilation message

putovanje.cpp: In function 'int pot(ll, int)':
putovanje.cpp:85:3: warning: this 'if' clause does not guard... [-Wmisleading-indentation]
   if (n & 1)
   ^~
putovanje.cpp:87:4: note: ...this statement, but the latter is misleadingly indented as if it were guarded by the 'if'
    pot = (pot * pot) % MOD;
    ^~~
# Verdict Execution time Memory Grader output
1 Correct 27 ms 31864 KB Output is correct
2 Incorrect 30 ms 32632 KB Output isn't correct
3 Halted 0 ms 0 KB -
# Verdict Execution time Memory Grader output
1 Correct 309 ms 72696 KB Output is correct
2 Correct 315 ms 74384 KB Output is correct
3 Correct 340 ms 78460 KB Output is correct
4 Correct 370 ms 79072 KB Output is correct
5 Correct 29 ms 32120 KB Output is correct
6 Correct 317 ms 71672 KB Output is correct
7 Correct 203 ms 60640 KB Output is correct
8 Correct 340 ms 72824 KB Output is correct
9 Correct 156 ms 75000 KB Output is correct
10 Correct 153 ms 73720 KB Output is correct
11 Correct 160 ms 77176 KB Output is correct
12 Correct 179 ms 77180 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 27 ms 31864 KB Output is correct
2 Incorrect 30 ms 32632 KB Output isn't correct
3 Halted 0 ms 0 KB -