【BZOJ3745】Norma(CDQ分治)

题面

BZOJ
洛谷

题解

这种问题直接做不好做,显然需要一定的优化。考虑\(CDQ\)分治。
现在唯一需要考虑的就是跨越当前中间节点的所有区间如何计算答案了。
从\(mid\)开始向左枚举左端点,考虑右端点的贡献。那么我们在右侧记录两个指针\(p,q\),分别表示左侧的最大值和最小值第一次改变的位置。这两个指针会把整个序列分成三段。
第一段最大值和最小值都是左侧最大最小值,直接计算区间长度和就好了。
第二段是最大值和最小值中一个被改变了,分情况讨论一下,维护右侧的区间最大最小值就可以直接算了。第三部分是最大值和最小值都被改变了,那么把式子写出来,维护一个前缀就好了。
时间复杂度\(O(nlogn)\)。可能实现要仔细想清楚,可以看看代码。

#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<cmath>
#include<algorithm>
#include<vector>
using namespace std;
#define ll long long
#define MAX 500500
#define MOD 1000000000
inline int read()
{int x=0;bool t=false;char ch=getchar();while((ch<'0'||ch>'9')&&ch!='-')ch=getchar();if(ch=='-')t=true,ch=getchar();while(ch<='9'&&ch>='0')x=x*10+ch-48,ch=getchar();return t?-x:x;
}
int S(int l,int r){return 1ll*(l+r)*(r-l+1)/2%MOD;}
void add(int &x,int y){x+=y;if(x>=MOD)x-=MOD;if(x<0)x+=MOD;}
int n,ans,a[MAX];
int sm[MAX],sp[MAX],smx[MAX],smn[MAX],smxp[MAX],smnp[MAX],mnv[MAX],mxv[MAX];
void CDQ(int l,int r)
{if(l==r){add(ans,1ll*a[l]*a[l]%MOD);return;}int mid=(l+r)>>1;CDQ(l,mid);CDQ(mid+1,r);int mn=a[mid],mx=a[mid];sm[mid]=sp[mid]=smx[mid]=smn[mid]=smxp[mid]=smnp[mid]=0;for(int i=mid+1;i<=r;++i)if(i==mid+1){mnv[i]=mxv[i]=smx[i]=smn[i]=a[i];smnp[i]=smxp[i]=1ll*a[i]*i%MOD;sm[i]=1ll*a[i]*a[i]%MOD;sp[i]=1ll*i*a[i]%MOD*a[i]%MOD;}else{mnv[i]=min(mnv[i-1],a[i]);mxv[i]=max(mxv[i-1],a[i]);add(smn[i]=smn[i-1],mnv[i]);add(smx[i]=smx[i-1],mxv[i]);add(smnp[i]=smnp[i-1],1ll*mnv[i]*i%MOD);add(smxp[i]=smxp[i-1],1ll*mxv[i]*i%MOD);add(sm[i]=sm[i-1],1ll*mnv[i]*mxv[i]%MOD);add(sp[i]=sp[i-1],1ll*i*mnv[i]%MOD*mxv[i]%MOD);}for(int i=mid,p=mid,q=mid;i>=l;--i){mn=min(mn,a[i]);mx=max(mx,a[i]);while(p<r&&mnv[p+1]>=mn)++p;while(q<r&&mxv[q+1]<=mx)++q;add(ans,1ll*S(mid-i+2,min(p,q)-i+1)*mn%MOD*mx%MOD);if(p<q)add(ans,((smnp[q]-smnp[p])-1ll*(smn[q]-smn[p])*(i-1)%MOD+MOD)*mx%MOD);if(q<p)add(ans,((smxp[p]-smxp[q])-1ll*(smx[p]-smx[q])*(i-1)%MOD+MOD)*mn%MOD);add(ans,(((sp[r]-sp[max(p,q)])-1ll*(sm[r]-sm[max(p,q)])*(i-1)%MOD+MOD)%MOD));}
}
int main()
{n=read();for(int i=1;i<=n;++i)a[i]=read();CDQ(1,n);printf("%d\n",ans);return 0;
}

转载于:https://www.cnblogs.com/cjyyb/p/9690152.html

【BZOJ3745】Norma(CDQ分治)相关推荐

  1. 【BZOJ-3456】城市规划 CDQ分治 + NTT

    题目链接 http://www.lydsy.com/JudgeOnline/problem.php?id=3456 Solution 这个问题可以考虑dp,利用补集思想 N个点的简单图总数量为$2^{ ...

  2. BZOJ 1176: [Balkan2007]Mokia( CDQ分治 + 树状数组 )

    考虑cdq分治, 对于[l, r)递归[l, m), [m, r); 然后计算[l, m)的操作对[m, r)中询问的影响就可以了. 具体就是差分答案+排序+离散化然后树状数组维护.操作数为M的话时间 ...

  3. bzoj2961 共点圆 (CDQ分治, 凸包)

    /* 可以发现可行的圆心相对于我们要查询的点是在一个半平面上, 然后我们要做的就是动态维护凸壳然后用这个半平面去切它 看看是否是在合法的那一面然后cdq分治就可以了代码基本是抄的,*/#include ...

  4. 洛谷P3122 [USACO15FEB]圈住牛Fencing the Herd(计算几何+CDQ分治)

    题面 传送门 题解 题目转化一下就是所有点都在直线\(Ax+By-C=0\)的同一侧,也就可以看做所有点代入\(Ax+By-C\)之后的值符号相同,我们只要维护每一个点代入直线之后的最大值和最小值,看 ...

  5. 【BZOJ3963】[WF2011]MachineWorks cdq分治+斜率优化

    [BZOJ3963][WF2011]MachineWorks Description 你是任意性复杂机器公司(Arbitrarily Complex Machines, ACM)的经理,公司使用更加先 ...

  6. CDQ分治 + 树状数组 ---- C. Goodbye Souvenir(三维偏序+思维)

    题目链接 题目大意: 给定长度为nnn的数组, 定义数字XXX在[l,r][l,r][l,r]内的值为数字XXX在[l,r][l,r][l,r]内最后一次出现位置的下标减去第一次出现位置的下标 给定m ...

  7. [学习笔记]CDQ分治

    分治,考虑前一半对后一半的影响. (和一般分治不太相同的思想是,一般分治不分谁对谁的影响,跨mid的都要统计.(全局变量统计) 而CDQ貌似要落脚到前一半对后一半的影响上,也就是贡献在后一半统计,由前 ...

  8. BZOJ 1492: [NOI2007]货币兑换Cash [CDQ分治 斜率优化DP]

    传送门 题意:不想写... 扔链接就跑 好吧我回来了 首先发现每次兑换一定是全部兑换,因为你兑换说明有利可图,是为了后面的某一天两种卷的汇率差别明显而兑换 那么一定拿全利啊,一定比多天的组合好 $f[ ...

  9. 【教程】简易CDQ分治教程学习笔记

    前言 辣鸡蒟蒻__stdcall终于会CDQ分治啦!       CDQ分治是我们处理各类问题的重要武器.它的优势在于可以顶替复杂的高级数据结构,而且常数比较小:缺点在于必须离线操作. CDQ分治的基 ...

最新文章

  1. Flink从Kafka 0.8中读取多个Topic时的问题
  2. 喜讯丨神策数据四大客户案例斩获大数据“星河”案例
  3. 对大量转载贴识别算法的研究
  4. github怎么搜索开源的代码_5.2.PYTHON开发利器之使用VS Code+GitHub进行python开源项目开发...
  5. 全奖博士招生,荷兰根特大学 ​IDLab 实验室,手语手势识别方向
  6. Pipeline Alpha版本项目展示
  7. ArcGiS/ArcInfo/ArcEditor/ArcMap/ArcView的区别
  8. 云服务器定时启动程序_过去、现在和未来:开发一款微信小程序的技术迭代全过程...
  9. 体验 Vista Speech Recognition,使梦想成为可能
  10. Android-webview加载网页去除标题
  11. 阿里云移动热修复Sophix问题汇总
  12. 我在名牌大学毕业后的经历 (看完感动,涌动,后泪流)转
  13. Linux与数据结构 2019-4-14
  14. 联通运营商服务器繁忙,网友:为什么现在联通网络越来越慢,是不是该转运营商了?...
  15. 笑话类网站推广的几种很实用的方法
  16. sicily题目分类
  17. 大班科学计算机的发明应用教案,大班教案时钟的发明_大班科学教案:时钟的秘密...
  18. JavaWeb前端开发注册表单验证
  19. 台达eh3与台达温控器modbus rtu通讯程序
  20. element框架的teble表格的数据展示由横向转纵向

热门文章

  1. linux 查看软连接_linux删除原理
  2. oracle eco 开放接口,问题:关于ECO,ECN的API或者INTERFACE
  3. ascii码对照表十六进制_ASCII
  4. TCP的三次握手、四次挥手,干货满满!
  5. 【深度学习】医学图像处理之视杯视盘分割调研分析
  6. 【响应式Web前端设计】CSS后代选择器和子代选择器
  7. 【Java Web后台实验与开发】ServletHTTPRequest笔记
  8. 防灾科技学院期末软件测试,防灾科技学院2014 软件测试客观题
  9. 武汉网络推广优化中网站关键词如何更合理布局分布?
  10. 中常用的数据结构_C语言实现常用数据结构:基本概念(第0篇