Submission #987331

#TimeUsernameProblemLanguageResultExecution timeMemory
987331amine_arouaArranging Tickets (JOI17_arranging_tickets)C++17
0 / 100
1 ms344 KiB
#include <bits/stdc++.h> //#pragma GCC optimize("O3") //#pragma GCC optimize("unroll-loops") using namespace std; #define int long long #define pb push_back #define nl '\n' #define fore(i, y) for(int i = 0; i < y; i++) #define forr(i, x, y) for(int i = x;i<=y;i++) #define forn(i, y, x) for(int i = y; i >= x; i--) int BASE; vector<int> tree[2]; vector<int> lazy; int comb(int a , int b , int k) { if(k == 0) return a + b; return max(a , b); } void build(int n) { BASE = n; while(__builtin_popcount(BASE) != 1) BASE++; fore(i , 2) tree[i].assign(2*BASE , 0); lazy.assign(2*BASE , 0); } void propag(int node , int x) { if(lazy[node] == 0) return ; forr(lt , 2*node , 2*node + 1) { lazy[lt]+=lazy[node]; tree[0][lt]+=lazy[node] * x; tree[1][lt]+=lazy[node]; } lazy[node] = 0; } void upd(int node , int s , int e , int l , int r , int v) { if(l <= s && e <= r) { lazy[node]+=v; tree[0][node]+=v * (e - s + 1); tree[1][node]+=v; return ; } if(l > e || s > r) return; propag(node , (e - s + 1)/2); int mid = (s + e)>>1; upd(2*node , s , mid , l , r , v); upd(2*node + 1 , mid + 1 , e , l , r , v); fore(i , 2) tree[i][node] = comb(tree[i][2*node] , tree[i][2*node + 1] , i); } int query(int node , int s , int e , int l , int r , int v) { if(l <= s && e <= r) { return tree[v][node]; } if(l > e || s > r) return 0; propag(node , (e - s + 1)/2); int mid = (s + e)>>1; return comb(query(2*node , s , mid , l , r , v) , query(2*node + 1 , mid + 1 , e , l , r , v) , v); } int query(int l ,int r ,int v) { if(l > r) return 0; return query(1 , 0 , BASE - 1 , l , r , v); } void upd(int l , int r , int v) { if(l > r) return ; upd(1 , 0 , BASE - 1 , l , r , v); } int n , m; signed main() { ios::sync_with_stdio(0); cin.tie(0); cout.tie(0); cin>>n>>m; vector<vector<int>> queries; build(n + 1); fore(i , m) { int a , b , c; cin>>a>>b>>c; queries.pb({c , a , b}); } sort(queries.begin() , queries.end()); for(auto Q : queries) { int A = Q[1] , B = Q[2] , C = Q[0]; if(A > B) swap(A , B); int maxIn = query(A , B - 1 , 1) , maxOut = comb(query(1 , A - 1 , 1) , query(B , n , 1) , 1); int cte = maxOut - maxIn; int a = max(0ll , (int)(C - cte)/2); int b = C - a; if(a + maxIn == b + maxOut) { upd(1 , A - 1 , b); upd(B , n , b); upd(A , B - 1 , a); } else { if(query(A , B - 1 , 0) < query(1 , A - 1 , 0) + query(B , n , 0)) { if(a < b) swap(a , b); } else if(query(A , B - 1 , 0) > query(1 , A - 1 , 0) + query(B , n , 0)) { if(a > b) swap(a , b); } else { if(b - a > n - (b - a)) { if(a > b) swap(a , b); } else { if(a < b) swap(a , b); } } upd(1 , A - 1 , b); upd(B , n , b); upd(A , B - 1 , a); } } cout<<tree[1][1]<<nl; }
#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...