「HNOI2016」序列

有一些高妙的做法,懒得看

考虑莫队,考虑莫队咋移动区间

然后你在区间内部找一个最小值的位置,假设现在从右边加

最小值左边区间显然可以\(O(1)\),最小值右边的区间是断掉的,但注意它是单调的

于是每个点假装向左边第一个小于它的位置连边,就可以处理出前缀和一样的东西,然后预处理后也是\(O(1)\)的


Code:

#include <cstdio>
#include <cctype>
#include <algorithm>
#include <cmath>
#define ll long long
const int N=1e5+10;
template <class T>
void read(T &x)
{
int f=0;x=0;char c=getchar();
while(!isdigit(c)) f|=c=='-',c=getchar();
while(isdigit(c)) x=x*10+c-'0',c=getchar();
x=f?-x:x;
}
int n,q,Log[N],st[17][N],s[N],a[N],tot;
struct koito_yuu
{
int l,r,lp,id;
bool friend operator <(koito_yuu a,koito_yuu b){return a.lp==b.lp?a.r<b.r:a.lp<b.lp;}
}yuu[N];
int query(int l,int r)
{
int d=Log[r+1-l],x=st[d][l],y=st[d][r-(1<<d)+1];
return a[x]<a[y]?x:y;
}
ll ans[N],sum,fl[N],fr[N];
void addl(int l,int r)
{
int x=query(l,r);
sum+=fr[l]-fr[x]+1ll*a[x]*(r+1-x);
}
void dell(int l,int r)
{
int x=query(l,r);
sum-=fr[l]-fr[x]+1ll*a[x]*(r+1-x);
}
void addr(int l,int r)
{
int x=query(l,r);
sum+=fl[r]-fl[x]+1ll*a[x]*(x+1-l);
}
void delr(int l,int r)
{
int x=query(l,r);
sum-=fl[r]-fl[x]+1ll*a[x]*(x+1-l);
}
int main()
{
read(n),read(q);
Log[0]=-1;
for(int i=1;i<=n;i++) st[0][i]=i,read(a[i]),Log[i]=Log[i>>1]+1;
for(int j=1;j<=16;j++)
{
for(int i=1;i<=n-(1<<j)+1;i++)
{
int x=st[j-1][i],y=st[j-1][i+(1<<j-1)];
st[j][i]=a[x]<a[y]?x:y;
}
}
for(int i=1;i<=n;i++)
{
while(tot&&a[s[tot]]>=a[i]) --tot;
fl[i]=fl[s[tot]]+1ll*a[i]*(i-s[tot]);
s[++tot]=i;
}
s[tot=0]=n+1;
for(int i=n;i;i--)
{
while(tot&&a[s[tot]]>=a[i]) --tot;
fr[i]=fr[s[tot]]+1ll*a[i]*(s[tot]-i);
s[++tot]=i;
}
int B=sqrt(n)+1;
for(int i=1;i<=q;i++) read(yuu[i].l),read(yuu[i].r),yuu[i].id=i,yuu[i].lp=(yuu[i].l-1)/B;
std::sort(yuu+1,yuu+1+q);
int l=1,r=0;
for(int i=1;i<=q;i++)
{
while(r<yuu[i].r) addr(l,++r);
while(l<yuu[i].l) dell(l++,r);
while(l>yuu[i].l) addl(--l,r);
while(r>yuu[i].r) delr(l,r--);
ans[yuu[i].id]=sum;
}
for(int i=1;i<=q;i++) printf("%lld\n",ans[i]);
return 0;
}

2019.3.10

「HNOI2016」序列 解题报告的更多相关文章

  1. 「HNOI2016」树 解题报告

    「HNOI2016」树 事毒瘤题... 我一开始以为每次把大树的子树再接给大树,然后死活不知道咋做,心想怕不是个神仙题哦 然后看题解后才发现是把模板树的子树给大树,虽然思维上难度没啥了,但是还是很难写 ...

  2. 「HNOI2016」网络 解题报告

    「HNOI2016」网络 我有一个绝妙的可持久化树套树思路,可惜的是,它的空间是\(n\log^2 n\)的... 注意到对一个询问,我们可以二分答案 然后统计经过这个点大于当前答案的路径条数,如果这 ...

  3. 「HNOI2016」最小公倍数 解题报告

    「HNOI2016」最小公倍数 考虑暴力,对每个询问,处理出\(\le a,\le b\)的与询问点在一起的联通块,然后判断是否是一个联通块,且联通块\(a,b\)最大值是否满足要求. 然后很显然需要 ...

  4. loj #2051. 「HNOI2016」序列

    #2051. 「HNOI2016」序列 题目描述 给定长度为 n nn 的序列:a1,a2,⋯,an a_1, a_2, \cdots , a_na​1​​,a​2​​,⋯,a​n​​,记为 a[1: ...

  5. 「SDOI2014」Lis 解题报告

    「SDOI2014」Lis 题目描述 给定序列 \(A\),序列中的每一项 \(A_i\) 有删除代价 \(B_i\) 和附加属性 \(C_i\). 请删除若干项,使得 \(A\) 的最长上升子序列长 ...

  6. 「NOI2016」区间 解题报告

    「NOI2016」区间 最近思维好僵硬啊... 一上来就觉得先把区间拆成两个端点进行差分,然后扫描位置序列,在每个位置维护答案,用数据结构维护当前位置的区间序列,但是不会维护. 于是想研究性质,想到为 ...

  7. 「ZJOI2016」旅行者 解题报告

    「ZJOI2016」旅行者 对网格图进行分治. 每次从中间选一列,然后枚举每个这一列的格子作为起点跑最短路,进入子矩形时把询问划分一下,有点类似整体二分 至于复杂度么,我不会阿 Code: #incl ...

  8. 「HAOI2018」染色 解题报告

    「HAOI2018」染色 是个套路题.. 考虑容斥 则恰好为\(k\)个颜色恰好为\(c\)次的贡献为 \[ \binom{m}{k}\sum_{i\ge k}(-1)^{i-k}\binom{m-k ...

  9. 「SCOI2016」围棋 解题报告

    「SCOI2016」围棋 打CF后困不拉基的,搞了一上午... 考虑直接状压棋子,然后发现会t 考虑我们需要上一行的状态本质上是某个位置为末尾是否可以匹配第一行的串 于是状态可以\(2^m\)压住了, ...

随机推荐

  1. 解决Window安全中心对Kitematic-0.17.3-Ubuntu.zip提示病毒,但无法删除的问题。

    Trojan:JS/Tisifi.B 类型:特洛伊木马 containerfile: C:\Users\Administrator\Desktop\Kitematic-0.17.3-Ubuntu.zi ...

  2. [转帖]国产紫光SSD不再只是实验室展品 开始批量出货

    国产紫光SSD不再只是实验室展品 开始批量出货 https://www.cnbeta.com/articles/tech/825865.htm 没听说有做HDD的 现做了SSD 弯道超车吗 可以实现全 ...

  3. docker遇到的问题以及docker 操作镜像的基本操作

    root@localhost ~]# systemctl status docker.service ● docker.service - Docker Application Container E ...

  4. 解决方法:CentOS7用yum安装软件显示错误:cannot find a valid baseurl for repo: base/7/x86_64

    在Linux学习中,发现使用yum安装软件出现以下的错误: 百度了各种方法,很多人也发现光是修改REBOOT=yes也没用,多次进行挂载.修改网卡配置文件.重置IP地址.重启网络.创建又删除配置文件的 ...

  5. zabbix自定义监控项

    原因:zabbix监控系统自带的监控规则有限,如果需要更加灵活的定义监控项,可以通过修改配置文件实现 vim xxx/zabbix_agentd.conf UnsafeUserParameters=1 ...

  6. dw擴展jquery

    https://jingyan.baidu.com/article/90895e0fbbb65764ec6b0bd1.html

  7. C-Lodop设置页面一加载就打印

    C-Lodop由于是服务不是np插件,调用打印语句(print或preview等)时机太早,在页面第一次加载完成后有几百毫秒时间等待WebSocket通讯服务准备完成,在没完成的时候会提示“C-Lod ...

  8. time模块 转换关系图

    import time t = time.time() #获取目前时间 t_struck = time.localtime(t) #time.gmtime() utc时区 t_str = time.s ...

  9. 使用js主函数的原因是等文档加载完了才给里面的元素添加东西 如果不使用主函数则文档加载时候无法找到元素则不能成功给元素添加事件

    使用js主函数的原因是等文档加载完了才给里面的元素添加东西 如果不使用主函数则文档加载时候无法找到元素则不能成功给元素添加事件

  10. 洛谷 P3951 小凯的疑惑

    题目链接 一开始看到这题,我的内心是拒绝的. 以为是同余类bfs,一看数据1e9,发现只能允许O(1)的算法,数学还不太好,做不出来,其实应该打表找规律. 看到网上的题解,如果两个都必须拿,结果一定是 ...