Submission #278768

#TimeUsernameProblemLanguageResultExecution timeMemory
278768MKopchevConstellation 3 (JOI20_constellation3)C++14
100 / 100
689 ms43640 KiB
#include<bits/stdc++.h> using namespace std; const int nmax=2e5+42; vector< pair<int/*x*/,int/*gain*/> > stars[nmax]; vector< pair<int/*y*/,int/*gain*/> > seen[nmax]; bool cmp(pair<int/*y*/,int/*gain*/> a,pair<int/*y*/,int/*gain*/> b) { if(a.first!=b.first)return a.first>b.first; return a.second<b.second; } int n; int inp[nmax]; int q; vector< int/*x*/ > white[nmax]; int prv_seen[nmax]; struct info { long long lazy,mx; }; info tree[4*nmax]; info actual(info a) { a.mx+=a.lazy; a.lazy=0; return a; } info my_merge(info a,info b) { a=actual(a); b=actual(b); a.mx=max(a.mx,b.mx); return a; } void push(int node) { tree[node*2].lazy+=tree[node].lazy; tree[node*2+1].lazy+=tree[node].lazy; tree[node].lazy=0; } void update(int node,int l,int r,int lq,int rq,long long val) { if(l==lq&&r==rq) { tree[node].lazy+=val; return; } push(node); int av=(l+r)/2; if(lq<=av)update(node*2,l,av,lq,min(av,rq),val); if(av<rq)update(node*2+1,av+1,r,max(av+1,lq),rq,val); tree[node]=my_merge(tree[node*2],tree[node*2+1]); } info query(int node,int l,int r,int lq,int rq) { if(l==lq&&r==rq)return actual(tree[node]); int av=(l+r)/2; info ret;ret.mx=0;ret.lazy=0; if(lq<=av)ret=my_merge(ret,query(node*2,l,av,lq,min(av,rq))); if(av<rq)ret=my_merge(ret,query(node*2+1,av+1,r,max(av+1,lq),rq)); return ret; } int le[nmax],ri[nmax],parent[nmax]; int root(int node) { if(parent[node]==node)return node; parent[node]=root(parent[node]); return parent[node]; } int main() { scanf("%i",&n); for(int i=1;i<=n;i++)scanf("%i",&inp[i]); for(int i=1;i<n;i++) white[max(inp[i],inp[i+1])].push_back(i); long long outp=0; scanf("%i",&q); for(int i=1;i<=q;i++) { int x,y,c; scanf("%i%i%i",&x,&y,&c); outp+=c; seen[x].push_back({y,c}); //stars[y].push_back({x,c}); } for(int i=1;i<=n;i++) if(seen[i].size()) { sort(seen[i].begin(),seen[i].end(),cmp); vector< pair<int/*y*/,int/*gain*/> > help={}; for(auto k:seen[i]) { while(help.size()&&help.back().second<=k.second) { //outp-=help.back().second; help.pop_back(); } help.push_back(k); } for(auto k:help) { stars[k.first].push_back({i,k.second}); } /* cout<<i<<endl; for(auto k:seen[i]) { cout<<"y= "<<k.first<<" cost= "<<k.second<<endl; } cout<<"->"<<endl; for(auto k:help) { cout<<"y= "<<k.first<<" cost= "<<k.second<<endl; } */ } for(int i=1;i<=n;i++) { le[i]=i; ri[i]=i; parent[i]=i; } for(int i=1;i<=n;i++) { for(auto k:stars[i]) { update(1,1,n,k.first,k.first,k.second-prv_seen[k.first]); prv_seen[k.first]=k.second; } for(auto k:white[i]) { int l1=le[root(k)],r1=k; int l2=k+1,r2=ri[root(k+1)]; long long mx_1=query(1,1,n,l1,r1).mx,mx_2=query(1,1,n,l2,r2).mx; parent[root(k+1)]=root(k); le[root(k)]=l1; ri[root(k)]=r2; update(1,1,n,l1,r1,mx_2); update(1,1,n,l2,r2,mx_1); } } printf("%lld\n",outp-actual(tree[1]).mx); return 0; }

Compilation message (stderr)

constellation3.cpp: In function 'int main()':
constellation3.cpp:96:10: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
   96 |     scanf("%i",&n);
      |     ~~~~~^~~~~~~~~
constellation3.cpp:97:31: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
   97 |     for(int i=1;i<=n;i++)scanf("%i",&inp[i]);
      |                          ~~~~~^~~~~~~~~~~~~~
constellation3.cpp:104:10: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
  104 |     scanf("%i",&q);
      |     ~~~~~^~~~~~~~~
constellation3.cpp:109:14: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
  109 |         scanf("%i%i%i",&x,&y,&c);
      |         ~~~~~^~~~~~~~~~~~~~~~~~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...