【分治计数】BZOJ3745 [Coci2015]Norma
来源:互联网 发布:etm软件会员 编辑:程序博客网 时间:2024/05/22 04:55
题面在这里
分治计数的经典题目……
对
前缀
前缀
然后JXB讨论一下就好了
示例程序:
#include<cstdio>#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 int red(){ int res=0,f=1;char ch=nc(); while (ch<'0'||'9'<ch) {if (ch=='-') f=-f;ch=nc();} while ('0'<=ch&&ch<='9') res=res*10+ch-48,ch=nc(); return res*f;}const int maxn=500005,INF=0x3f3f3f3f,tt=1000000000;int n,a[maxn];LL ans,s[maxn],smx[maxn],smn[maxn],ss[maxn],ssl[maxn],smxl[maxn],smnl[maxn],mx[maxn],mn[maxn];void devide(int L,int R){ if (L==R) {(ans+=(LL)a[L]*a[R]%tt)%=tt;return;} int mid=L+R>>1; devide(L,mid);devide(mid+1,R); s[mid]=smx[mid]=smn[mid]=mx[mid]=ss[mid]=ssl[mid]=smxl[mid]=smnl[mid]=0; mn[mid]=INF; for (int i=mid+1;i<=R;i++){ mx[i]=max(mx[i-1],(LL)a[i]); mn[i]=min(mn[i-1],(LL)a[i]); smx[i]=(smx[i-1]+mx[i])%tt; smn[i]=(smn[i-1]+mn[i])%tt; s[i]=(s[i-1]+i-mid)%tt; ss[i]=(ss[i-1]+mx[i]*mn[i])%tt; ssl[i]=(ssl[i-1]+mx[i]*mn[i]%tt*(i-mid))%tt; smxl[i]=(smxl[i-1]+mx[i]*(i-mid))%tt; smnl[i]=(smnl[i-1]+mn[i]*(i-mid))%tt; } LL Max=0,Min=INF; for (int i=mid,jx=mid,jm=mid;i>=L;i--){ Max=max(Max,(LL)a[i]);Min=min(Min,(LL)a[i]); while (jx<R&&mx[jx+1]<Max) jx++; while (jm<R&&mn[jm+1]>Min) jm++; int x=min(jx,jm),y=max(jx,jm);LL ii=mid-i+1; (ans+=(s[x]+ii*(x-mid))*Max%tt*Min)%=tt; if (jx<=jm) (ans+=(smxl[y]-smxl[x] + ii*(smx[y]-smx[x]))%tt*Min)%=tt; else (ans+=(smnl[y]-smnl[x] + ii*(smn[y]-smn[x]))%tt*Max)%=tt; (ans+=ssl[R]-ssl[y] + ii*(ss[R]-ss[y]))%=tt; }}int main(){ n=red(); for (int i=1;i<=n;i++) a[i]=red(); devide(1,n); printf("%lld",(ans+tt)%tt); return 0;}
阅读全文
1 0
- 【分治计数】BZOJ3745 [Coci2015]Norma
- [分治] BZOJ3745: [Coci2015]Norma
- bzoj3745: [Coci2015]Norma
- 【bzoj3745】[Coci2015]Norma
- [ 分治 ] [ COCI2015 ] BZOJ3745
- [分治] BZOJ 3745 [Coci2015]Norma
- bzoj 3745: [Coci2015]Norma 分治&数学
- BZOJ 3745: [Coci2015]Norma cdq分治
- 3745: [Coci2015]Norma
- bzoj 3745: [Coci2015]Norma
- Norma
- 计数问题-分治
- 【分治计数】BZOJ4237 稻草人
- 逆序对计数算法 -- 分治策略的应用
- Algorithm学习笔记 --- 计数问题(分治算法)
- 计数+分治求海量数据中重复最多的一个
- [分治] 51nod 算法马拉松25 C. 区间计数
- 【分治计数|单调栈】51Nod 1215 数组的宽度
- QLayout的使用小结
- Spring——控制反转、反射与依赖注入
- 关于静态变量的初始化时机
- JavaScript入门篇--你也有控制权(DOM操作)
- 如何将百度地图引入到HTML和VUE文件中?
- 【分治计数】BZOJ3745 [Coci2015]Norma
- 2017年9月16日提高组T2 B 三维导弹拦截
- 阿里云远程链接mysql等端口的配置问题
- python——进程线程、与协程基础概述
- 集合-fail-fast机制
- Python·Jupyter Notebook的各种快捷键
- 用FPGA实现H.264/AVC硬件编解码器的构想
- pojThe merchant
- mac上安装opencv与python