Submission #1009085

#TimeUsernameProblemLanguageResultExecution timeMemory
1009085ReLiceArranging Tickets (JOI17_arranging_tickets)C++14
0 / 100
6 ms12992 KiB
#include <bits/stdc++.h> #define ll long long #define str string #define ins insert #define ld long double #define pb push_back #define pf push_front #define pof pop_front() #define pob pop_back() #define lb lower_bound #define ub upper_bound #define endl "\n" #define fr first #define sc second #define all(x) x.begin(),x.end() #define rall(x) x.rbegin(),x.rend() #define sz size() #define vll vector<ll> #define bc back() #define arr array #define pll vector<pair<ll,ll>> using namespace std;/* #include <ext/pb_ds/assoc_container.hpp> #include <ext/pb_ds/tree_policy.hpp> using namespace __gnu_pbds; #define ordered_set tree<ll, null_type,less_equal<ll>, rb_tree_tag,tree_order_statistics_node_update>*/ template<class S,class T> bool chmin(S &a,const T &b) { return a>b?(a=b)==b:false; } template<class S,class T> bool chmax(S &a,const T &b) { return a<b?(a=b)==b:false; } //void fre(string s){freopen((s+".in").c_str(),"r",stdin);freopen((s+".out").c_str(),"w",stdout);} void start(){ ios_base::sync_with_stdio(0); cin.tie(0); cout.tie(0); } const ll inf=1e18; const ll mod=998244353; const ll N=2e5+7; const ld eps=1e-9; vll t(N*4),add(N*4); vector<arr<ll,3>> a; ll n,m; void push(ll v,ll tl,ll tr){ if(tl!=tr){ add[v*2]+=add[v]; add[v*2+1]+=add[v]; } t[v]+=add[v]; add[v]=0; } void upd(ll l,ll r,ll val,ll v=1,ll tl=1,ll tr=N){ push(v,tl,tr); if(tl>r || tr<l)return; if(l<=tl && tr<=r){ add[v]+=val; push(v,tl,tr); return; } ll tm=(tl+tr)/2; upd(l,r,val,v*2,tl,tm); upd(l,r,val,v*2+1,tm+1,tr); t[v]=max(t[v*2],t[v*2+1]); } pair<ll,ll> get(ll id=0,ll v=1,ll tl=1,ll tr=N){ if(t[v]!=t[1])return {inf,-inf}; if(tl==tr){ if(id==0)return {tl,tl}; else if(id==1) return {tl,-inf}; return {inf,tl}; } ll tm=(tl+tr)/2; if(tl!=tr){ push(v*2,tl,tm); push(v*2,tm+1,tr); } if(t[v*2]==t[1] && t[v*2+1]==t[1]){ if(id==1)return get(id,v*2,tl,tm); else if(id==2)return get(id,v*2+1,tm+1,tr); else return {get(1,v*2,tl,tm).fr,get(2,v*2+1,tm+1,tr).sc}; } else if(t[v*2]==t[1])return get(id,v*2,tl,tm); return get(id,v*2+1,tm+1,tr); } ll get2(ll l,ll r,ll v=1,ll tl=1,ll tr=N){ push(v,tl,tr); if(l<=tl && tr<=r)return 0; if(tl>r || tr<l)return t[v]; ll tm=(tl+tr)/2; return max(get2(l,r,v*2,tl,tm),get2(l,r,v*2+1,tm+1,tr)); } bool check(ll mid){ ll i; for(i=1;i<4*N;i++)t[i]=add[i]=0; for(i=0;i<m;i++){ upd(a[i][0],a[i][1]-1,a[i][2]); } pair<ll,ll> p=get(); for(i=0;i<m;i++){ if(a[i][0]<=p.fr && a[i][1]>p.sc){ ll x=get2(a[i][0],a[i][1]-1); x=(t[1]-x)/2; x=min(x,a[i][2]); if(a[i][0]>1)upd(1,a[i][0]-1,x); upd(a[i][1],n,x); upd(a[i][0],a[i][1]-1,-x); p=get(); } if(t[1]<=mid)return true; } return false; } void solve(){ ll i,j; cin>>n>>m; a.resize(m); ll sum=0; for(i=0;i<m;i++){ for(j=0;j<3;j++)cin>>a[i][j]; if(a[i][0]>a[i][1])swap(a[i][0],a[i][1]); sum+=a[i][2]; } sort(all(a)); ll l=0,r=sum; while(l+1<r){ ll mid=(l+r)/2; if(check(mid))r=mid; else l=mid; } cout<<r<<endl; } signed main(){ start(); ll t=1; //cin>>t; while(t--) 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...