[分块] Codeforces 436F Zepto Code Rush 2014 F. Banners
2017-07-11 22:09
573 查看
可以转化成区间加,询问ai×i的最大值
这个不好维护,分块,零散的加,直接重构整块,否则在块上打标记
同时我们在块上还要维护当前最大值所在的 i 和 接下来至少要整块加多少次才能使得最大值变化
每次在块上打标记,当达到临近就重构更新最大值,注意这个最大值随着全局加肯定是单调右移的,那么重构复杂度也是对的
这个不好维护,分块,零散的加,直接重构整块,否则在块上打标记
同时我们在块上还要维护当前最大值所在的 i 和 接下来至少要整块加多少次才能使得最大值变化
每次在块上打标记,当达到临近就重构更新最大值,注意这个最大值随着全局加肯定是单调右移的,那么重构复杂度也是对的
#include<cstdio> #include<cstdlib> #include<cassert> #include<cmath> #include<algorithm> using namespace std; typedef long long ll; inline char nc(){ static char buf[100000],*p1=buf,*p2=buf; return p1==p2&&(p2=(p1=buf)+fread(buf,1,100000,stdin),p1==p2)?EOF:*p1++; } inline void read(int &x){ char c=nc(),b=1; for (;!(c>='0' && c<='9');c=nc()) if (c=='-') b=-1; for (x=0;c>='0' && c<='9';x=x*10+c-'0',c=nc()); x*=b; } const int N=100005; int n,W; int a ,b ; int maxa=0; int idx ; inline bool cmp(int x,int y){ return b[x]<b[y]; } const int BB=505; int B,cnt; int pos ; int lp[BB],rp[BB]; ll c ; int tag[BB]; ll clk[BB]; int K[BB]; inline void Build(){ B=(int)sqrt(maxa); for (int i=0;i<=maxa;i++) pos[i]=i/B+1; cnt=pos[maxa]; for (int i=1;i<=cnt;i++) lp[i]=(i-1)*B,rp[i]=i*B-1; rp[cnt]=maxa; for (int i=1;i<=cnt;i++){ K[i]=lp[i]; if (K[i]==rp[i]) clk[i]=1<<30; else clk[i]=1; } } inline void rebuild(int x,int l,int r){ ll maxv=-1,k=0,t=0; for (int i=lp[x];i<=rp[x];i++){ c[i]+=tag[x]; c[i]+=(l<=i && i<=r); if (c[i]*i>maxv) maxv=c[i]*i,k=i; } K[x]=k; tag[x]=0; clk[x]=1<<30; for (int i=k+1;i<=rp[x];i++) clk[x]=min(clk[x],(c[k]*k-c[i]*i)/(i-k)+1); } inline void Add(int r){ int rb=pos[r]; rebuild(rb,lp[rb],r); for (int i=1;i<rb;i++){ tag[i]++; clk[i]--; if (!clk[i]) rebuild(i,0,-1); } } ll ans=0,p; inline void Query(){ ans=0; p=0; for (int i=1;i<=cnt;i++) if ((c[K[i]]+tag[i])*K[i]>ans) ans=(c[K[i]]+tag[i])*K[i],p=K[i]; } int main(){ freopen("deep.in","r",stdin); freopen("deep.out","w",stdout); read(n); read(W); for (int i=1;i<=n;i++) read(a[i]),read(b[i]),idx[i]=i,maxa=max(maxa,a[i]); Build(); sort(idx+1,idx+n+1,cmp); int lim=b[idx ]+1,pnt=1; for (int c=0;c<=lim;c++){ while (pnt<=n && c>b[idx[pnt]]) Add(a[idx[pnt]]),pnt++; Query(); printf("%lld %d\n",(ll)c*W*(n-pnt+1)+ans,p); } return 0; }
相关文章推荐
- [分块] Codeforces 436F && Zepto Code Rush 2014 F. Banners
- [除法分块] Codeforces 830C Bamboo Partition
- Codeforces 616E Sum of Remainders 【数学分块】
- [Codeforces 455D] Serega and Fun (分块)
- CodeForces 785E Anton and Permutation 分块
- 【Goodbye2014】Codeforces 500C New Year Book Reading【贪心+模拟】
- codeforces Variable Shadowing 2014 NEERC Southern Subregional M 贪心策略
- Codeforces 122 C. Lucky Sum(分块)
- 【CodeForces】E. Xenia and Tree(分块 + LCA)
- 【codeforces】2014 Asia Xian Regional Contest G The Problem to Slow Down You 【Palindromic Tree】
- codeforces Good Bye 2014题解(A、B、C)
- CodeForces Good Bye 2014 B. New Year Permutation
- CodeForces 500B Good Bye 2014 New Year Permutation
- Codeforces 474F(分块)
- [Segment tree Beats! || 分块] Codeforces 793F Tinkoff Challenge - Elimination Round F. Julia the snail
- bzoj3529 [ SDOI2014 ] -- 莫比乌斯反演+分块
- codeforces RCC2014 Warmup div2 A+B+C+D+E
- codeforces contest 13 problem E(分块)
- codeforces 85D. Sum of Medians(线段树or分块)
- Codeforces 2014-2015 ACM-ICPC, NEERC, Southern Subregional Contest L. Useful Roads