제출 #1171102

#제출 시각아이디문제언어결과실행 시간메모리
1171102user736482Two Dishes (JOI19_dishes)C++20
0 / 100
139 ms27056 KiB
#pragma GCC optimize("O3") #include <bits/stdc++.h> using namespace std; #define ll long long #define ld long double #define pb push_back #define ff first #define ss second #define MOD 998244353 //#define POT 4194304 #define POT 64 #define INF 1000000019 #define INFL 1000000000000000099LL ll a,b,c,n,m; ll sgtree[POT][3];//max, ile dod/na co set, typ operacji(2-set,1-add) vector<pair<ll,pair<ll,ll>>>v1,v2; vector<ll>pref1={0},pref2={0}; pair<ll,ll> kto[200007],kto2[200007];//ostatni ktory sprawia, ze sie licze -2 to nigdy vector<pair<ll,ll>> kogo[200007]; void spych(ll v){ if(v>=POT/2)return; if(sgtree[v][2]==0)return; if(sgtree[v][2]==2){ sgtree[v*2][0]=sgtree[v][1]; sgtree[v*2][1]=sgtree[v][1]; sgtree[v*2][2]=2; sgtree[v*2+1][0]=sgtree[v][1]; sgtree[v*2+1][1]=sgtree[v][1]; sgtree[v*2+1][2]=2; sgtree[v][1]=0; sgtree[v][2]=0; } else{ sgtree[v*2][0]+=sgtree[v][1]; sgtree[v*2][1]+=sgtree[v][1]; sgtree[v*2+1][0]+=sgtree[v][1]; sgtree[v*2+1][1]+=sgtree[v][1]; if(sgtree[v*2][2]==0) sgtree[v*2][2]=1; if(sgtree[v*2][1]==0) sgtree[v*2][1]=1; sgtree[v][1]=0; sgtree[v][2]=0; } } void add(ll pocz,ll kon,ll l,ll r,ll v, ll val){ if(pocz>r || kon<l)return; if(l>=pocz && r<=kon){ if(sgtree[v][2]==0) sgtree[v][2]=1; sgtree[v][1]+=val; sgtree[v][0]+=val; } else{ spych(v); // cout<<pocz<<" "<<kon<<" "<<l<<" "<<r<<" "<<v<<" "<<val<<" "<<sgtree[v][0]<<"\n"; add(pocz,kon,l,(l+r)/2,v*2,val); add(pocz,kon,(l+r)/2+1,r,v*2+1,val); sgtree[v][0]=max(sgtree[v*2][0],sgtree[v*2+1][0]); } // cout<<pocz<<" "<<kon<<" "<<l<<" "<<r<<" "<<v<<" "<<val<<" "<<sgtree[v][0]<<"\n"; } void st(ll pocz,ll kon,ll l,ll r,ll v, ll val){ if(pocz>r || kon<l)return; if(l>=pocz && r<=kon){ sgtree[v][2]=2; sgtree[v][1]=val; sgtree[v][0]=val; } else{ spych(v); st(pocz,kon,l,(l+r)/2,v*2,val); st(pocz,kon,(l+r)/2+1,r,v*2+1,val); sgtree[v][0]=max(sgtree[v*2][0],sgtree[v*2+1][0]); } } ll fnd(ll l,ll r,ll v, ll val){//pierwszy wiekszy if(l==r)return l; spych(v); if(sgtree[v*2][0]>val)return fnd(l,(l+r)/2,v*2,val); return fnd((l+r)/2+1,r,v*2+1,val); } int main() { ios_base::sync_with_stdio(0);cin.tie(0); cin>>n>>m; for(ll i=0;i<n;i++){ cin>>b>>a>>c; v1.pb({a,{b,c}}); pref1.pb(pref1.back()+b); } for(ll i=0;i<m;i++){ cin>>b>>a>>c; v2.pb({a,{b,c}}); pref2.pb(pref2.back()+b); } for(ll i=0;i<n;i++){ ll pocz=-2; ll kon=m-1; while(pocz!=kon){ ll mid=(pocz+kon+1)/2; if(pref1[i+1]+pref2[mid+1]<=v1[i].ff){ pocz=mid; } else{ kon=mid-1; } } kto[i+1]={pocz,v1[i].ss.ss}; } for(ll i=0;i<m;i++){ ll pocz=-2; ll kon=n-1; while(pocz!=kon){ ll mid=(pocz+kon+1)/2; if(pref2[i+1]+pref1[mid+1]<=v2[i].ff){ pocz=mid; } else{ kon=mid-1; } } //cout<<i<<" "<<pocz<<"\n"; // kto2[i]=pocz; if(pocz>-2){ kogo[pocz+1].pb({i,v2[i].ss.ss}); } else{ // cout<<i<<" "; } } for(ll i=0;i<=n;i++){ // cout<<kto[i].ff<<" "<<kto[i].ss<<"\n\n"; if(kto[i].ff!=-2){ add(1,kto[i].ff+2,1,POT/2,1,kto[i].ss); if(kto[i].ss>0){ ll pom=POT/2+kto[i].ff; vector<ll>vpom; while(pom){ vpom.pb(pom); pom/=2; } while(vpom.size()){ spych(vpom.back()); vpom.pop_back(); } pom=sgtree[POT/2+kto[i].ff][0]; ll pom2=fnd(1,POT/2,1,pom); // cout<<pom<<" "<<pom2<<"\n"; st(kto[i].ff+1,pom2-1,1,POT/2,1,pom); }} // cout<<sgtree[1][0]<<" "; for(pair<ll,ll>j :kogo[i]){ // cout<<j.ff<<" "<<j.ss<<"x\n"; add(1,POT/2,1,POT/2,1,j.ss); // cout<<sgtree[1][0]<<" "; add(1,j.ff,1,POT/2,1,-j.ss); if(j.ss<0 && j.ff){ ll pom=POT/2+j.ff-1; vector<ll>vpom; while(pom){ vpom.pb(pom); pom/=2; } while(vpom.size()){ spych(vpom.back()); vpom.pop_back(); } pom=sgtree[POT/2+j.ff][0]; ll pom2=fnd(1,POT/2,1,pom); st(j.ff+1,pom2-1,1,POT/2,1,pom); } // cout<<sgtree[1][0]<<" "; } // cout<<sgtree[1][0]<<" "; // cout<<"\n\n"; } cout<<sgtree[1][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...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...