4826

思路:

  主席树矩阵加减+单调栈预处理;

代码:

#include <bits/stdc++.h>
using namespace std;
#define maxn 200005
#define ll long long
#define maxtree maxn*30
class PTreeType
{
private:
int ch[maxtree][],root[maxn],tot,head[maxn],li[maxn<<],ri[maxn<<],E[maxn<<],cnt,val_[maxn<<];
ll val[maxtree],tag[maxtree];
public:
void add(int &now,int pre,int l,int r,int tl,int tr,ll x)
{
now=++tot,val[now]=val[pre],tag[now]=tag[pre];
val[now]+=((r<tr?r:tr)-(l>tl?l:tl)+)*x;
ch[now][]=ch[pre][],ch[now][]=ch[pre][];
if(l>=tl&&r<=tr){tag[now]+=x;return;}int mid=l+r>>;
if(tl<=mid) add(ch[now][],ch[pre][],l,mid,tl,tr,x);
if(tr>mid) add(ch[now][],ch[pre][],mid+,r,tl,tr,x);
}
ll query(int now,int pre,int l,int r,int tl,int tr)
{
if(l>=tl&&r<=tr) return val[now]-val[pre];
int mid=l+r>>;ll res=((r<tr?r:tr)-(l>tl?l:tl)+)*(tag[now]-tag[pre]);
if(tl<=mid) res+=query(ch[now][],ch[pre][],l,mid,tl,tr);
if(tr>mid) res+=query(ch[now][],ch[pre][],mid+,r,tl,tr);
return res;
}
void add(int l,int r,int size,int x,int to)
{
add(root[to],root[to],,size,l,r,x);
}
ll query(int l,int r,int size,int now,int pre)
{
return query(root[now],root[pre],,size,l,r);
}
void operation_add(int to,int l,int r,int pi)
{
E[++cnt]=head[to],li[cnt]=l,ri[cnt]=r,val_[cnt]=pi,head[to]=cnt;
}
void makeit(int size)
{
for(int i=;i<=size;i++)
{
root[i]=root[i-];
for(int v=head[i];v;v=E[v])
{
add(li[v],ri[v],size,val_[v],i);
}
}
}
};
class PTreeType xtree,ytree;
struct NodeType {
int l,r;
};
struct NodeType ai[maxn];
int n,m,p1,p2,ki[maxn],sta[maxn];
inline void in(int &now)
{
char Cget=getchar();now=;
while(Cget>''||Cget<'') Cget=getchar();
while(Cget>=''&&Cget<='')
{
now=now*+Cget-'';
Cget=getchar();
}
}
inline void in(ll &now)
{
char Cget=getchar();now=;
while(Cget>''||Cget<'')Cget=getchar();
while(Cget>=''&&Cget<='')
{
now=now*+Cget-'';
Cget=getchar();
}
}
int main()
{
in(n),in(m),in(p1),in(p2);int top=,op,l,r;ll ans;
for(int i=;i<=n;i++)
{
in(ki[i]);
while(top&&ki[sta[top]]<ki[i]) ai[sta[top]].r=i,top--;
ai[i].l=sta[top],sta[++top]=i;
}
while(top) ai[sta[top]].r=n+,top--;
for(int i=;i<=n;i++)
{
if(ai[i].l>&&ai[i].r<=n) xtree.operation_add(ai[i].l,ai[i].r,ai[i].r,p1);
if(i+<=ai[i].r-) xtree.operation_add(ai[i].l,i+,ai[i].r-,p2);
if(ai[i].l+<=i-) ytree.operation_add(ai[i].r,ai[i].l+,i-,p2);
}
xtree.makeit(n),ytree.makeit(n);
while(m--)
{
in(l),in(r),ans=;
ans+=xtree.query(l,r,n,r,l-);
ans+=ytree.query(l,r,n,r,l-);
ans+=(ll)p1*(r-l);
printf("%lld\n",ans);
}
return ;
}

AC日记——[Hnoi2017]影魔 bzoj 4826的更多相关文章

  1. AC日记——[LNOI2014]LCA bzoj 3626

    3626 思路: 离线操作+树剖: 代码: #include <bits/stdc++.h> using namespace std; #define maxn 100005 #defin ...

  2. AC日记——[ZJOI2012]网络 bzoj 2816

    2816 思路: 多个LCT: 代码: #include <bits/stdc++.h> using namespace std; #define maxn 10005 #define l ...

  3. AC日记——[SCOI2009]游戏 bzoj 1025

    [SCOI2009]游戏 思路: 和为n的几个数最小公倍数有多少种. dp即可: 代码: #include <bits/stdc++.h> using namespace std; #de ...

  4. AC日记——[HNOI2014]世界树 bzoj 3572

    3572 思路: 虚树+乱搞: 代码: #include <bits/stdc++.h> using namespace std; #define maxn 300005 #define ...

  5. AC日记——NOI2016区间 bzoj 4653

    4653 思路: 线段树,指针滑动: 代码: #include <bits/stdc++.h> using namespace std; #define maxn 1000005 #def ...

  6. AC日记——Rmq Problem bzoj 3339

    3339 思路: 恶心: 代码: #include <cstdio> #include <cstring> #include <iostream> #include ...

  7. AC日记——[HNOI2008]越狱 bzoj 1008

    1008 思路: 越狱情况=总情况-不越狱情况: 代码: #include <cstdio> #include <cstring> #include <iostream& ...

  8. AC日记——[FJOI2007]轮状病毒 bzoj 1002

    1002 思路: 打表找规律: dp[i]=dp[i-1]*3-dp[i-2]+2; 套个高精就a了: 代码: #include <cstdio> #include <cstring ...

  9. AC日记——[Ahoi2013]作业 bzoj 3236

    3236 思路: 莫队+树状数组维护: 代码: #include <cmath> #include <cstdio> #include <cstring> #inc ...

随机推荐

  1. Educational Codeforces Round 6 A

    A. Professor GukiZ's Robot time limit per test 0.5 seconds memory limit per test 256 megabytes input ...

  2. bzoj 1122 [POI2008]账本BBB 模拟贪心,单调队列

    [POI2008]账本BBB Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 524  Solved: 251[Submit][Status][Disc ...

  3. Leetcode 485. 最大连续1的个数

    1.题目描述(简单题) 给定一个二进制数组, 计算其中最大连续1的个数. 示例 1: 输入: [1,1,0,1,1,1] 输出: 3 解释: 开头的两位和最后的三位都是连续1,所以最大连续1的个数是 ...

  4. 不可不知的robots.txt文件

    robots.txt基本介绍 robots.txt是一个纯文本文件,在这个文件中网站管理者可以声明该网站中不想被robots访问的部分,或者指定搜索引擎只收录指定的内容. 当一个搜索机器人(有的叫搜索 ...

  5. a标签nest问题,即a标签里面嵌套a标签

    方法一:使用div模拟a,监听click事件 方法二:使用<object>标签包裹内部a标签 <div style="width: 200px;height: 200px; ...

  6. springboot-用logback将日志文件按等级保存到不同文件

    springboot-用logback将日志文件按等级保存到不同文件 案例: 例如项目基本包名为com.xxx,将该包下的所有日志按debug.info.warn.error等级分别保存到D:/log ...

  7. [LeetCode] Simplify Path,文件路径简化,用栈来做

    Given an absolute path for a file (Unix-style), simplify it. For example,path = "/home/", ...

  8. sql文件导入时出错

    使用Navicat 连接工具连接mysql数据库. mysql数据库建立后,导入sql文件报错: [Err] 1064 - You have an error in your SQL syntax; ...

  9. Merge Query

    1. Oracle: "MERGE into MHGROUP.proj_access m using dual on " + "(PRJ_ID = '" + W ...

  10. python dlib 面部轮廓实时检测

    1.dlib 实现动态人脸检测及面部轮廓检测 模型下载连接 : http://dlib.net/files/ # coding:utf-8 import cv2 import os import dl ...