제출 #412280

#제출 시각아이디문제언어결과실행 시간메모리
412280amoo_safarArranging Tickets (JOI17_arranging_tickets)C++17
0 / 100
8 ms12748 KiB
// vaziat meshki-ghermeze ! #include <bits/stdc++.h> #define pb push_back #define F first #define S second #define all(x) x.begin(), x.end() #define debug(x) cerr << #x << " : " << x << '\n' using namespace std; typedef long long ll; typedef long double ld; typedef string str; typedef pair<int, ll> pil; typedef pair<int, int> pii; const ll Mod = 1000000007LL; const int N = 4e5 + 10; const ll Inf = 2242545357980376863LL; const ll Log = 30; vector<pii> G[N]; int n, m; void Add_Edge(int u, int v, int c){ G[u].pb({v, c}); } ll ps[N]; int Solve(int l, int r, int dif){ memset(ps, 0, sizeof ps); multiset<pii> ms; int res = 0; for(int i = l; i < r - 1; i++){ for(auto [x, c] : G[i]){ if(x >= r) continue; ps[i] += c; ps[x] -= c; ms.insert({x, c}); } ps[i] += ps[i - 1]; while(ps[i] > dif){ auto [fr, cnt] = *ms.rbegin(); ms.erase(ms.find({fr, cnt})); int del = min((ll) cnt, (ps[i] - dif + 1) / 2); ps[i] -= 2 * del; ps[fr] += 2 * del; res += del; if(cnt > del) ms.insert({fr, cnt - del}); } } return res + dif; } int Calc(int i, int dif){ if(i > n) i -= n; return Solve(i, i + n, dif); } int df[N]; int main(){ ios::sync_with_stdio(0); cin.tie(0); cout.tie(0); cin >> n >> m; int a, b, c; for(int i = 0; i < m; i++){ cin >> a >> b >> c; // assert(c == 1); if(a > b) swap(a, b); df[a] ++; df[b] --; Add_Edge(a, b, c); Add_Edge(b, n + a, c); // Add_Edge(n + a, n + b, c); } for(int i = 1; i <= n; i++) df[i] += df[i - 1]; int id_mx = max_element(df + 1, df + n) - df; id_mx ++; int ans = min(Calc(id_mx, 0), Calc(id_mx, 1)); cout << ans << '\n'; return 0; }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...