AC日记——[Hnoi2017]影魔 bzoj 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的更多相关文章
- AC日记——[LNOI2014]LCA bzoj 3626
3626 思路: 离线操作+树剖: 代码: #include <bits/stdc++.h> using namespace std; #define maxn 100005 #defin ...
- AC日记——[ZJOI2012]网络 bzoj 2816
2816 思路: 多个LCT: 代码: #include <bits/stdc++.h> using namespace std; #define maxn 10005 #define l ...
- AC日记——[SCOI2009]游戏 bzoj 1025
[SCOI2009]游戏 思路: 和为n的几个数最小公倍数有多少种. dp即可: 代码: #include <bits/stdc++.h> using namespace std; #de ...
- AC日记——[HNOI2014]世界树 bzoj 3572
3572 思路: 虚树+乱搞: 代码: #include <bits/stdc++.h> using namespace std; #define maxn 300005 #define ...
- AC日记——NOI2016区间 bzoj 4653
4653 思路: 线段树,指针滑动: 代码: #include <bits/stdc++.h> using namespace std; #define maxn 1000005 #def ...
- AC日记——Rmq Problem bzoj 3339
3339 思路: 恶心: 代码: #include <cstdio> #include <cstring> #include <iostream> #include ...
- AC日记——[HNOI2008]越狱 bzoj 1008
1008 思路: 越狱情况=总情况-不越狱情况: 代码: #include <cstdio> #include <cstring> #include <iostream& ...
- AC日记——[FJOI2007]轮状病毒 bzoj 1002
1002 思路: 打表找规律: dp[i]=dp[i-1]*3-dp[i-2]+2; 套个高精就a了: 代码: #include <cstdio> #include <cstring ...
- AC日记——[Ahoi2013]作业 bzoj 3236
3236 思路: 莫队+树状数组维护: 代码: #include <cmath> #include <cstdio> #include <cstring> #inc ...
随机推荐
- git版本回退与撤销操作
场景1:当你改乱了工作区某个文件的内容,想直接丢弃工作区的修改时,用命令git checkout -- file. 场景2:当你不但改乱了工作区某个文件的内容,还添加到了暂存区时,想丢弃修改,分两步, ...
- Jupyter生成中文PDF的Notebook
修改模板文件,将article.tplx文件中的\documentclass[11pt]{article}改为\documentclass[11pt]{ctexart} Linux下的文件路径一般在: ...
- Elastic Search操作入门
前言 Elastic Search是基于Lucene这个非常成熟的索引方案,另加上一些分布式的实现:集群,sharding,replication等.具体可以参考我同事写的文章. 本文主要介绍ES入门 ...
- 【BZOJ】1776: [Usaco2010 Hol]cowpol 奶牛政坛
[题意]给定n个点的树,每个点属于一个分类,求每个分类中(至少有2个点)最远的两点距离.n<=200000 [算法]LCA [题解]结论:树上任意点集中最远的两点一定包含点集中深度最大的点(求树 ...
- 将四个按钮放入一个父控件的好处:方便移动,只需要改变父控件的y值,就可移动四个按钮
将四个按钮放入一个父控件的好处:方便移动,只需要改变父控件的y值, 就可移动四个按钮 https://www.evernote.com/shard/s227/sh/78 ...
- 项目记录 -- zpool set
zfs set <property=value> <filesystem|volume|snapshot> root@UA4300D-spa:~/hanhuakai/pro_0 ...
- 关于EditText.setText()无法显示的问题
将EditText在初始化后调用EditText.setSaveEnabled(false); 让Android 系统不保存值,这样就不会恢复了.
- Linux NAPI/非NAPI
本文主要介绍二层收包流程,包括NAPI与非NAPI方式: NAPI:数据包到来,第一个数据包产生硬件中断,中断处理程序将设备的napi_struct结构挂在当前cpu的待收包设备链表softnet_d ...
- Django 国内最全教程
https://code.ziqiangxuetang.com/django/django-tutorial.html
- C++ 模板的用法
C++中的高阶手法就会用到泛型编程,主要有函数模板, 在程序中使用模板的好处就是在定义时不需要指定具体的参数类型,而在使用时确可以匹配其它任意类型, 定义格式如下 template <class ...