제출 #1204105

#제출 시각아이디문제언어결과실행 시간메모리
1204105Sir_Ahmed_ImranArranging Tickets (JOI17_arranging_tickets)C++17
10 / 100
6 ms9804 KiB
// 01001100 01001111 01010100 01000001 \\ // \\ // ╦ ╔═╗╔╦╗╔═╗ \\ // ║ ║ ║ ║ ╠═╣ \\ // ╩═╝╚═╝ ╩ ╩ ╩ \\ // \\ // 01001100 01001111 01010100 01000001 \\ #include <bits/stdc++.h> using namespace std; #define N 100001 #define nl '\n' #define ff first #define ss second #define add insert #define ll long long #define ld long double #define terminator main #define pll pair<ll,ll> #define append push_back #define pii pair<int,int> #define all(x) (x).begin(),(x).end() #define L0TA ios_base::sync_with_stdio(false);cin.tie(NULL);cout.tie(NULL) int n, m, x; vector<pii> q; int mx[4 * N]; int lazy[4 * N]; vector<pii> mr[4 *N]; void built(int v = 1, int s = 0, int e = n){ mr[v] = {{0, 0}}; mx[v] = lazy[v] = 0; if(e - s == 1) return; int lc, rc, mid; lc = 2 * v; rc = 2 * v + 1; mid = (s + e) / 2; built(lc, s, mid); built(rc, mid, e); } void push(int v){ int lc, rc; lc = 2 * v; rc = lc + 1; mx[v] += lazy[v]; lazy[lc] += lazy[v]; lazy[rc] += lazy[v]; lazy[v] = 0; } void add(int l, int r, int val, int v = 1, int s = 0, int e = n){ push(v); if(r <= s || e <= l || r <= l) return; if(l <= s && e <= r){ lazy[v] += val; push(v); return; } int lc, rc, mid; push(v); lc = 2 * v; rc = 2 * v + 1; mid = (s + e) / 2; add(l, r, val, lc, s, mid); add(l, r, val, rc, mid, e); mx[v] = max(mx[lc], mx[rc]); } pii get(int v = 1, int s = 0, int e = n){ push(v); if(mx[v] <= x) return mr[v].back(); if(e - s == 1) return {0, 0}; pii pi, pj; int lc, rc, mid; lc = 2 * v; rc = 2 * v + 1; mid = (s + e) / 2; pi = pj = get(lc, s, mid); if(mx[lc] <= x) pj = get(rc, mid, e); if(pj.ss > pi.ss) swap(pi, pj); return pi; } int get_mx(int l, int r, int v = 1, int s = 0, int e = n){ push(v); if(r <= s || e <= l || r <= l) return 0; if(l <= s && e <= r) return mx[v]; int lc, rc, mid; lc = 2 * v; rc = 2 * v + 1; mid = (s + e) / 2; return max(get_mx(l, r, lc, s, mid), get_mx(l, r, rc, mid, e)); } void Insert(int l, int r, int v = 1, int s = 0, int e = n){ push(v); if(e - s == 1){ mr[v].append({l, r}); return; } int lc, rc, mid; lc = 2 * v; rc = 2 * v + 1; mid = (s + e) / 2; if(l < mid) Insert(l, r, lc, s, mid); else Insert(l, r, rc, mid, e); mr[v].clear(); if(mr[rc].back().ss > mr[lc].back().ss) mr[v].append(mr[rc].back()); else mr[v].append(mr[lc].back()); } void remove(int l, int v = 1, int s = 0, int e = n){ push(v); if(e - s == 1){ mr[v].pop_back(); return; } int lc, rc, mid; lc = 2 * v; rc = 2 * v + 1; mid = (s + e) / 2; if(l < mid) remove(l, lc, s, mid); else remove(l, rc, mid, e); mr[v].clear(); if(mr[rc].back().ss > mr[lc].back().ss) mr[v].append(mr[rc].back()); else mr[v].append(mr[lc].back()); } bool check(int c){ x = c; pii pi; built(); for(auto & [i, j] : q){ add(i + 1, j + 1, 1); Insert(i, j); while(get_mx(0, n) > x){ pi = get(); if(!pi.ff) return 0; remove(pi.ff); add(0, pi.ff + 1, 1); add(pi.ss + 1, n, 1); add(pi.ff + 1, pi.ss + 1, -1); } } return 1; } void solve(){ int l, r, c; cin >> n >> m; n++; for(int i = 0; i < m; i++){ cin >> l >> r >> c; if(l > r) swap(l, r); for(int j = 0; j < c; j++) q.append({l, r}); } sort(all(q)); int ans = 0; for(int i = 65536; i > 0; i /= 2) if(!check(ans + i)) ans += i; cout << ans + 1; } int terminator(){ L0TA; solve(); 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...