Submission #412264

#TimeUsernameProblemLanguageResultExecution timeMemory
412264amoo_safarArranging Tickets (JOI17_arranging_tickets)C++17
65 / 100
107 ms21068 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<ll, ll> pll; const ll Mod = 1000000007LL; const int N = 2e5 + 10; const ll Inf = 2242545357980376863LL; const ll Log = 30; vector<int> G[N], H[N]; int n, m; int to[N], frm[N], pk[N], M = 0; void Add_Edge(int u, int v){ frm[M] = u; to[M] = v; pk[M] = 1; G[u].pb(M); H[v].pb(M); M ++; } struct Segment { int seg[N]; Segment (){ memset(seg, 0, sizeof seg); } void Add(int l, int r, int x){ for(int i = l; i < r; i++) seg[i] += x; } int FirstPos(int l, int r, int x){ for(int i = l; i < r; i++) if(seg[i] > x) return i; return -1; } int Max(int l, int r){ return *max_element(seg + l, seg + r); } int LMax(int l, int r){ int idx = l; for(int i = l ; i < r; i++) if(seg[i] > seg[idx]) idx = i; return idx; } int RMax(int l, int r){ int idx = l; for(int i = l ; i < r; i++) if(seg[i] >= seg[idx]) idx = i; return idx; } void Print(int l, int r){ cerr << "DS : "; for(int i = l; i < r; i++) cerr << seg[i] << ' '; cerr << '\n'; } }; Segment DS; int ps[N]; int cnt[N], rcnt[N]; int MinCross(int idx){ int mx = -1; for(int i = 0; i < M; i++){ if(!pk[i] && frm[i] <= idx && idx < to[i]) if(mx == -1 || to[mx] < to[i]) mx = i; } return mx; } int res = 0; int lnw, rnw; void On(int u){ for(auto in : H[u]){ if(frm[in] >= lnw){ DS.Add(frm[in], u, +1); pk[in] = 0; } } } void Off(int u){ int adj; for(auto in : G[u]){ adj = to[in]; if(adj >= rnw) continue; if(pk[in]){ res --; DS.Add(u, adj, +1); } else { DS.Add(u, adj, -1); } pk[in] = 1; } } int nx; vector<int> can = {1}; map<int, int> mp; int Solve(int l, int r, int dif){ lnw = l, rnw = r; // cerr << "-------------\n"; // DS.Print(l, r); // On(r - 1); for(int i = l; i < r; i++) On(i); // nx = DS.Max(l, r); // if(nx > n) nx -= n; // cerr << "Solving " << l << ' ' << r << '\n'; // for(int i = 0; i < M; i++) // if(!pk[i]){ // debug(i); // cerr << frm[i] << " -> " << to[i] << '\n'; // } // DS.Print(l, r); int pos, ed; while((pos = DS.FirstPos(l, r - 1, dif)) != -1){ // debug(pos); ed = MinCross(pos); // debug(ed); if(ed >= 0){ pk[ed] = 1; res ++; DS.Add(frm[ed], to[ed], -2); } else assert(false); } int tmp = res; for(int i = l; i < r; i++) Off(i); return tmp + dif; // memset(ps, 0, sizeof ps); // memcpy(rcnt, cnt, sizeof cnt); // memset(cnt, 0, sizeof cnt); // multiset<int> ms; // int res = 0; // for(int i = l; i < r - 1; i++){ // for(auto x : G[i]){ // if(x >= r) continue; // ps[i] ++; // ps[x] --; // ms.insert(x); // // debug(x); // } // ps[i] += ps[i - 1]; // while(ps[i] > 0){ // int fr = *ms.rbegin(); // // debug(fr); // ms.erase(ms.find(fr)); // ps[i] -= 2; // ps[fr] += 2; // res ++; // cnt[res] ++; // // cerr << i << " : " << fr << '\n'; // } // } // for(int i = 0; i < N; i++) // assert(rcnt[i] <= cnt[i]); // // cerr << l << " , " << r << " : " << res << '\n'; // // exit(0); // return res; } int Calc(int i, int df){ if(i > n) i -= n; return Solve(i, i + n, df); } 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); Add_Edge(b, n + a); Add_Edge(n + a, n + b); } for(int i = 1; i <= n; i++) df[i] += df[i - 1]; int id_mx = max_element(df + 1, df + n) - df; // int la_mx = id_mx; // for(int i = 1; i < ; i++){ id_mx ++; int ans = min(Calc(id_mx, 0), Calc(id_mx, 1)); // for(int i = 1; i < n; i++) On(i); // for(int i = 0; i < 3; i++){ // // On(n + i - 1); // // debug(nx); // ans = min(ans, Calc(can[i])); // // Off(i); // // break; // } 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...