제출 #44217

#제출 시각아이디문제언어결과실행 시간메모리
44217FilyanFireworks (APIO16_fireworks)C++14
100 / 100
733 ms168124 KiB
#include <bits/stdc++.h> 
using namespace std;

#define sz(x) (int)x.size() 
#define pb push_back 
#define mp make_pair 
#define fi(a, b) for(int i=a; i<=b; i++) 
#define fj(a, b) for(int j=a; j<=b; j++) 
#define fo(a, b) for(int o=a; o<=b; o++) 
#define fdi(a, b) for(int i=a; i>=b; i--) 
#define fdj(a, b) for(int j=a; j>=b; j--) 
#define fdo(a, b) for(int o=a; o>=b; o--) 

#ifdef LOCAL
#define err(...) fprintf(stderr, __VA_ARGS__)
#else
#define err(...) while(false) {}
#endif

typedef long long ll; 
typedef pair<int, int> pii; 
typedef pair<ll, ll> pll; 
typedef vector<int> vi; 
typedef vector<pii> vpii; 
typedef vector<pll> vpll; 
typedef long double ld;

/////////////////////////////////

int const MAX = 300 * 1000 + 41;

int n, m;
vpii e[MAX];

struct State {
	multiset<ll> l, r;
	ll addl, addr, ans;

	State () {
		addl = addr = ans = 0;
	};

	void normalize() {
		while (sz(r) > 1) {
			auto it = r.end();
			it--;
			r.erase(it);		
		}
	}

	ll getleft() {
		auto it = l.end();
		--it;
		ll res = (*it) + addl;
		return res;		
	}

	ll extractleft() {
		ll res = getleft();
		auto it = l.end();
		--it;
		l.erase(it);
		return res;
	}

	ll getright() {
		auto it = r.begin();
		ll res = (*it) + addr;
		return res;		
	}

	ll extractright() {
		ll res = getright();
		auto it = r.begin();
		r.erase(it);
		return res;
	}

	void addedge(int x) {
		addr += x;
		ll y = extractleft();	
		l.insert(y - addl + x);
	}

	void pushl(ll x) {
		l.insert(x - addl);
	}	

	void pushr(ll x) {
		r.insert(x - addr);
	}

};

State st[MAX];

void dfs(int x) {
	if (x >= n + 1) {
		st[x].l.insert(0);
		st[x].r.insert(0);
		return;
	}	
	for (pii z : e[x]) {
		int y = z.first;
		dfs(y);
	}
	ll sum = 0;
	for (pii z : e[x]) {
		int y = z.first;
		int c = z.second;
		sum += st[y].ans;
		st[y].addedge(c);
		st[y].normalize();
	}
	for (pii z : e[x]) {
		int y = z.first;
		if (sz(st[y].l) > sz(st[x].l)) {	
			swap(st[x], st[y]);
		}
	}
	st[x].ans = sum;
	for (pii z : e[x]) {
		int y = z.first;
		while (sz(st[y].l)) {
			ll p = st[y].extractleft();
			if (p <= st[x].getright()) {
				st[x].pushl(p);
			} else {
				st[x].ans += p - st[x].getright();
				st[x].pushl(st[x].extractright());
				st[x].pushr(p);
			}
		}	
		while (sz(st[y].r)) {
			ll p = st[y].extractright();
			if (p >= st[x].getleft()) {
				st[x].pushr(p);
			} else {
				st[x].ans += st[x].getleft() - p;
				st[x].pushr(st[x].extractleft());
				st[x].pushl(p);
			}
		}	
	}
}

void solve() {
	dfs(1);
	printf("%lld\n", st[1].ans);
}

int main() {
#ifdef LOCAL
	freopen("input.txt", "r", stdin);
	freopen("output.txt", "w", stdout);
#endif

	scanf("%d %d", &n, &m);
	fi(2, n + m) {
		int p, c;
		scanf("%d %d", &p, &c);
		e[p].pb(mp(i, c));
	}
	solve();		

	
#ifdef LOCAL
	err("ELAPSED TIME: %.3Lf\n", (ld) clock() / CLOCKS_PER_SEC);
#endif	
	
	return 0;
}

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

fireworks.cpp: In function 'int main()':
fireworks.cpp:158:7: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
  scanf("%d %d", &n, &m);
  ~~~~~^~~~~~~~~~~~~~~~~
fireworks.cpp:161:8: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
   scanf("%d %d", &p, &c);
   ~~~~~^~~~~~~~~~~~~~~~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...