Submission #696607

#TimeUsernameProblemLanguageResultExecution timeMemory
696607vjudge1Holiday (IOI14_holiday)C++14
100 / 100
415 ms38080 KiB
#include<bits/stdc++.h> #define ll long long #define lll __int128 #define db double #define ld long double #define pii pair<int,int> #define fi first #define se second #define vi vector<int> using namespace std; namespace IO { const int SZ=1<<20; char gchar() { static char buf[SZ]; static int i=SZ; if(i==SZ)i=0,fread(buf,1,SZ,stdin); return buf[i++]; } void pchar(char c) { static char buf[SZ]; static int i=0; if(c)buf[i++]=c; if(!c||i==SZ)fwrite(buf,1,i,stdout),i=0; } void pstr(string s,char end='\n') { for(char c:s)pchar(c); pchar(end); } template<typename T>void read(T &x) { x=0;int f=1; static char c; while((c=gchar())>'9'||c<'0')if(c=='-')f=-1; x=c-'0'; while((c=gchar())>='0'&&c<='9') x=(x<<1)+(x<<3)+(c^48); x*=f; } template<typename T,typename ...Args>void read(T &x,Args&...args){read(x),read(args...);} template<typename T>void i_write(T x) { if(x>9)i_write(x/10); pchar(x%10+'0'); } template<typename T>void write(T x,char end='\n') { if(x<0)pchar('-'),x=-x; if(x>9)i_write(x/10); pchar(x%10+'0'); pchar(end); } } using IO::read; using IO::write; const int N=1e5+10; int n,s,d,rt[N],cnt; ll a[N],b[N]; struct SegmentTree { int ls[N<<5],rs[N<<5],c[N<<5],idx; ll s[N<<5]; void pushup(int p){s[p]=s[ls[p]]+s[rs[p]],c[p]=c[ls[p]]+c[rs[p]];} void upd(int &p,int q,int l,int r,int x) { p=++idx,ls[p]=ls[q],rs[p]=rs[q],c[p]=c[q],s[p]=s[q]; if(l==r)return c[p]++,s[p]+=b[x],void(); int mid=(l+r)>>1; if(x<=mid)upd(ls[p],ls[q],l,mid,x); else upd(rs[p],rs[q],mid+1,r,x); pushup(p); } ll ask(int p,int q,int l,int r,int k) { if(k<=0)return 0; if(c[p]-c[q]<k)return s[p]-s[q]; if(l==r)return b[l]*k; int mid=(l+r)>>1; if(k<=c[rs[p]]-c[rs[q]])return ask(rs[p],rs[q],mid+1,r,k); return ask(ls[p],ls[q],l,mid,k-(c[rs[p]]-c[rs[q]]))+s[rs[p]]-s[rs[q]]; } }sgt; ll calc(int l,int r){return sgt.ask(rt[r],rt[l-1],1,cnt,d-(2*(r-s)+s-l));} ll ans; void solve(int l,int r,int L,int R) { if(l>r)return; if(L==R) { for(int i=l;i<=r;i++)ans=max(ans,calc(i,L)); return; } int pos=L,mid=(l+r)>>1;ll mx=calc(mid,L); for(int i=L+1;i<=R;i++) { ll v=calc(mid,i); if(v>mx)mx=v,pos=i; } ans=max(ans,mx),solve(l,mid-1,L,pos),solve(mid+1,r,pos,R); } void work() { for(int i=1;i<=n;i++)rt[i]=0; for(int i=1;i<=sgt.idx;i++)sgt.ls[i]=sgt.rs[i]=sgt.c[i]=sgt.s[i]=0; sgt.idx=0; for(int i=1;i<=n;i++)sgt.upd(rt[i],rt[i-1],1,cnt,a[i]); for(int i=1;i<=s;i++)ans=max(ans,calc(i,s)); solve(1,s-1,s+1,n); } ll findMaxAttraction(int _n,int _s,int _d,int _a[]) { n=_n,s=_s+1,d=_d; for(int i=1;i<=n;i++)a[i]=_a[i-1],b[i]=a[i]; sort(b+1,b+n+1),cnt=unique(b+1,b+n+1)-b-1; for(int i=1;i<=n;i++)a[i]=lower_bound(b+1,b+cnt+1,a[i])-b; work(); s=n-s+1,reverse(a+1,a+n+1); work(); return ans; }

Compilation message (stderr)

holiday.cpp: In function 'char IO::gchar()':
holiday.cpp:18:24: warning: ignoring return value of 'size_t fread(void*, size_t, size_t, FILE*)' declared with attribute 'warn_unused_result' [-Wunused-result]
   18 |      if(i==SZ)i=0,fread(buf,1,SZ,stdin);
      |                   ~~~~~^~~~~~~~~~~~~~~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...