Submission #294550

#TimeUsernameProblemLanguageResultExecution timeMemory
294550nandonathanielFuel Station (NOI20_fuelstation)C++14
100 / 100
949 ms40148 KiB
#include<bits/stdc++.h> using namespace std; typedef long long LL; typedef pair<LL,LL> pii; const LL MAXN=3e5+5,INF=1e18; struct pom{ LL x,a,b; }; pom arr[MAXN]; LL tree[4*MAXN],lazy[4*MAXN],nxt[MAXN]; bool cmp(pom p,pom q){ return p.x<q.x; } void updatenode(LL now,LL L,LL R,LL val){ tree[now]+=val; lazy[now]+=val; } void pushdown(LL now,LL L,LL R){ LL mid=(L+R)/2; updatenode(2*now,L,mid,lazy[now]); updatenode(2*now+1,mid+1,R,lazy[now]); lazy[now]=0; } LL query(LL now,LL L,LL R,LL x,LL y){ if(L>=x && R<=y)return tree[now]; if(L>y || R<x)return INF; pushdown(now,L,R); LL mid=(L+R)/2; return min(query(2*now,L,mid,x,y),query(2*now+1,mid+1,R,x,y)); } void update(LL now,LL L,LL R,LL x,LL y,LL val){ if(L>=x && R<=y){ updatenode(now,L,R,val); return; } if(L>y || R<x)return; LL mid=(L+R)/2; pushdown(now,L,R); update(2*now,L,mid,x,y,val); update(2*now+1,mid+1,R,x,y,val); tree[now]=min(tree[2*now],tree[2*now+1]); } int main(){ ios_base::sync_with_stdio(false);cin.tie(NULL);cout.tie(NULL); LL n,d,idx=1; cin >> n >> d; for(LL i=1;i<=n;i++)cin >> arr[i].x >> arr[i].a >> arr[i].b; n++; arr[n].x=d;arr[n].a=0;arr[n].b=d; sort(arr+1,arr+n+1,cmp); for(LL i=1;i<=n;i++){ if(arr[i].x!=arr[i-1].x){ for(LL j=idx;j<i;j++)nxt[j]=i; idx=i; } } nxt[n]=n; vector<pii> v; for(LL i=1;i<=n;i++)v.push_back({arr[i].b,i}); sort(v.begin(),v.end()); //Frem=F-Xi+Sigma(Aj) // Xj<Xi,F<=Bj for(auto isi : v){ update(1,1,n,isi.second,isi.second,-arr[isi.second].x); //-X[i] //Frem bisa dapet benefit A[j] ketika X[j]<X[i] update(1,1,n,nxt[isi.second],n,arr[isi.second].a); //Karena awal coba F=min(B[i]) maka semua pom bensin bisa } LL bef=0; idx=0; for(LL i=0;i<v.size();i++){ //Try F=v[i].first update(1,1,n,1,n,v[i].first-bef); if(i>0 && v[i].first!=bef){ for(LL j=idx;j<i;j++)update(1,1,n,nxt[v[j].second],n,-arr[v[j].second].a); //F semakin besar pom yang bisa berbenefit semakin sedikit idx=i; } bef=v[i].first; LL minfrem=query(1,1,n,1,n); if(minfrem>=0){ cout << v[i].first-minfrem << '\n'; return 0; } } return 0; }

Compilation message (stderr)

FuelStation.cpp: In function 'int main()':
FuelStation.cpp:78:14: warning: comparison of integer expressions of different signedness: 'LL' {aka 'long long int'} and 'std::vector<std::pair<long long int, long long int> >::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   78 |  for(LL i=0;i<v.size();i++){
      |             ~^~~~~~~~~
#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...