Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <iostream>
- #include <fstream>
- #include <vector>
- #include <set>
- #include <map>
- #include <bitset>
- #include <algorithm>
- #include <iomanip>
- #include <cmath>
- #include <unordered_set>
- #include <unordered_map>
- #include <queue>
- #include <deque>
- #include <stack>
- #include <cstring>
- #include <numeric>
- using namespace std;
- typedef long long ll;
- typedef long double ld;
- typedef pair<int,int> pii;
- #define FOR(i, k, l) for(int i = k; i < l; i++)
- #define DFOR(i, k, l) for(int i = k; i > l; i--)
- #define FA(i, k) for(int i = 0; i < int(k.size()); i++)
- #define DFA(i, k) for(int i = int(k.size()) - 1; i > -1; i--)
- #define ASKS(i) for(cin >> (i); (i)--;)
- #define MAXINT 2147483647
- #define endl '\n'
- #define all(x) x.begin(), x.end()
- #define rall(x) x.rbegin(), x.rend()
- #define fi first
- #define se second
- pii gr[100011];
- pair<bool, bool> used[100011];
- int prcyc[100011];
- ll ans;
- vector<int> cyc[50011];
- int pos, sum;
- void dfs(int v) {
- if(v == 0) {
- ans+=sum;
- return;
- }
- used[v].fi = 1;
- pii to = gr[v];
- if(to.fi == gr[to.fi].fi) {
- ans+= sum;
- ans+= max(to.se, gr[to.fi].se);
- } else if(used[to.fi].fi) {
- if(!used[to.fi].se){
- int s = to.fi;
- while(!used[s].se) {
- used[s].se = 1;
- cyc[pos].push_back(s);
- s = gr[s].fi;
- }
- pos++;
- } else {
- prcyc[to.fi] = max(prcyc[to.fi], to.se);
- ans+=sum;
- }
- } else {
- sum+= to.se;
- dfs(to.fi);
- }
- }
- int main() {
- ios::sync_with_stdio(0);
- cin.tie(0);
- cout.tie(0);
- ll n;
- cin >> n;
- pair<int, pii> sn[n];
- map<int, pii> snack;
- FOR(i, 0, n){
- int f,p,m,s;
- cin >> f >> p >> m >> s;
- sn[i] = {f,{p, i+1}};
- snack[i+1] = {m, s};
- }
- sort(sn, sn+n);
- FOR(i, 0, n) {
- int a = sn[i].fi, b= sn[i].se.fi;
- if(snack[a].se > 0) {
- int dif = snack[a].fi - b;
- if(dif > 0) {
- ans += dif*(snack[a].se-1);
- snack[a].se = -1;
- gr[sn[i].se.se] = {snack[a].fi, dif};
- }
- }
- }
- FOR(i,1,n+1) if(gr[i].fi) cout << i << " " << gr[i].fi << " " << gr[i].se << endl;
- FOR(i, 1, n+1) {
- if(gr[i].fi != 0 && !used[i].fi) {
- sum = 0;
- dfs(i);
- }
- }
- FOR(i, 0, pos) {
- int mx = - 1;
- for(int to: cyc[i]) {
- }
- }
- cout << ans << endl;
- return 0;
- }
Add Comment
Please, Sign In to add comment