题意

题目链接

Sol

好像搞出了一个和题解不一样的做法(然而我考场上没写出来还是爆零0)

一个很显然的思路是考虑每个最小值的贡献。

预处理出每个数左边第一个比他小的数,右边第一个比他大的数。

那么\([L_i + 1, i]\)对\([i, R_i]\)中的每个数都会有\(a[i]\)的贡献。

我们可以抽象成一个二维平面内的矩形加。

询问就是询问最下角为\((l, l)\),右上角为\((r, r)\)的矩形内的权值

也就是我们需要解决这么一个问题:两个操作, 矩形加矩形求和,而且前者都在后者的前面执行

我们可以把所有矩形加操作全都向右上角差分,所有询问操作全都向左下角差分。这样我们就只需要考虑每个\((i, j)\)左下角的所有修改\((x, y)\)的影响,这部分的权值为\((i - x + 1) * (j - y + 1) * w\)

直接拆开,发现可以用树状数组维护(单点修改,查前缀和)。然后就做完了

复杂度\(O(nlogn)\)

/*
*/
#include<bits/stdc++.h>
#define LL long long
#define fi first
#define se second
#define getchar() (p1 == p2 && (p2 = (p1 = buf) + fread(buf, 1, 1<<22, stdin), p1 == p2) ? EOF : *p1++)
char buf[(1 << 22)], *p1 = buf, *p2 = buf;
char obuf[1<<24], *O = obuf;
void print(int x) {if(x > 9) print(x / 10); *O++ = x % 10 + '0';}
#define OS *O++ = '\n';
#define fout fwrite(obuf, O-obuf, 1 , stdout);
using namespace std;
const int MAXN = 1e5 + 10, INF = 1e9 + 10;
template<typename A, typename B> inline bool chmax(A &x, B y) {return x < y ? x = y, 1 : 0;}
template<typename A, typename B> inline bool chmin(A &x, B y) {return x > y ? x = y, 1 : 0;}
inline int read() {
char c = getchar(); int x = 0, f = 1;
while(c < '0' || c > '9') {if(c == '-') f = -1; c = getchar();}
while(c >= '0' && c <= '9') x = x * 10 + c - '0', c = getchar();
return x * f;
}
int N, M, Q, a[MAXN], st[MAXN], L[MAXN], R[MAXN];
LL ans[MAXN];
struct Modify {
int h;LL v;
};
vector<Modify> tag[MAXN];
struct Query {
int h, id, opt;
};
vector<Query> q[MAXN];
void Add(int x1, int y1, int x2, int y2, int v) {
tag[x1].push_back({y1, v});
tag[x2 + 1].push_back({y1, -v});
tag[x1].push_back({y2 + 1, -v});
tag[x2 + 1].push_back({y2 + 1, v});
}
void Query(int x1, int y1, int x2, int y2, int id) {
q[x2].push_back({y2, id, 1});
q[x1 - 1].push_back({y2, id, -1});
q[x2].push_back({y1 - 1, id, -1});
q[x1 - 1].push_back({y1 - 1, id, 1});
}
#define lb(x) (x & (-x))
LL s1[MAXN], s2[MAXN], s3[MAXN], s4[MAXN];
void TreeAdd(int x, LL v1, LL v2, LL v3, LL v4) {
while(x <= M)
s1[x] += v1, s2[x] += v2, s3[x] += v3, s4[x] += v4, x += lb(x);
}
pair<pair<LL, LL>, pair<LL, LL> > TreeQuery(int x) {
pair<pair<LL, LL>, pair<LL, LL> > ans;
while(x)
ans.fi.fi += s1[x], ans.fi.se += s2[x], ans.se.fi += s3[x], ans.se.se += s4[x], x -= lb(x);
return ans;
}
#undef lb
void solve() {
for(int i = 1; i <= M; i++) {
for(auto y: tag[i]) {
int v = y.v;
TreeAdd(y.h, 1ll * v, 1ll * (y.h - 1) * v, 1ll * (i - 1) * v, 1ll * (y.h - 1) * (i - 1) * v);
}
for(auto x : q[i]) {
LL sumv = 0, sumyv = 0, sumxv = 0, sumxyv = 0;
pair<pair<LL, LL>, pair<LL, LL> > tmp = TreeQuery(x.h);
sumv = tmp.fi.fi;
sumyv = tmp.fi.se;
sumxv = tmp.se.fi;
sumxyv = tmp.se.se;
int j = x.h;
ans[x.id] += 1ll * x.opt * (1ll * i * j * sumv - 1ll * i * sumyv - 1ll * j * sumxv + sumxyv);
}
}
} void Pre() {
a[0] = -INF; a[N + 1] = -INF; int top = 0;
for(int i = 1; i <= N + 1; i++) {
while(top && a[i] < a[st[top]]) R[st[top--]] = i;
L[i] = st[top];
st[++top] = i;
}
for(int i = 1; i <= N; i++)
if((i <= R[i] - 1) && (L[i] + 1 <= i))
Add(i, L[i] + 1, R[i] - 1, i, a[i]);
}
signed main() {
//freopen("a.in", "r", stdin); freopen("b.out", "w", stdout);
N = read(); M = N + 1; Q = read();
for(int i = 1; i <= N; i++) a[i] = read();
Pre();
for(int i = 1; i <= Q; i++) {
int l = read(), r = read(), ans = 0;
Query(l, l, r, r, i);
}
solve();
for(int i = 1; i <= Q; i++) cout << ans[i] << '\n';
return 0;
}

洛谷P3246 [HNOI2016]序列(离线 差分 树状数组)的更多相关文章

  1. 洛谷P5069 [Ynoi2015]纵使日薄西山(树状数组,set)

    洛谷题目传送门 一血祭 向dllxl致敬! 算是YNOI中比较清新的吧,毕竟代码只有1.25k. 首先我们对着题意模拟,寻找一些思路. 每次选了一个最大的数后,它和它周围两个数都要减一.这样无论如何, ...

  2. [NOIP2013提高&洛谷P1966]火柴排队 题解(树状数组求逆序对)

    [NOIP2013提高&洛谷P1966]火柴排队 Description 涵涵有两盒火柴,每盒装有 n 根火柴,每根火柴都有一个高度. 现在将每盒中的火柴各自排成一列, 同一列火柴的高度互不相 ...

  3. BZOJ3262/洛谷P3810 陌上花开 分治 三维偏序 树状数组

    原文链接http://www.cnblogs.com/zhouzhendong/p/8672131.html 题目传送门 - BZOJ3262 题目传送门 - 洛谷P3810 题意 有$n$个元素,第 ...

  4. 洛谷 P4396 (离散化+莫队+树状数组)

    ### 洛谷P4396  题目链接 ### 题目大意: 有 n 个整数组成的数组,m 次询问,每次询问中有四个参数 l ,r,a,b .问你在[l,r] 的区间内的所有数中,值属于[a,b] 的数的个 ...

  5. D 洛谷 P3602 Koishi Loves Segments [贪心 树状数组+堆]

    题目描述 Koishi喜欢线段. 她的条线段都能表示成数轴上的某个闭区间.Koishi喜欢在把所有线段都放在数轴上,然后数出某些点被多少线段覆盖了. Flandre看她和线段玩得很起开心,就抛给她一个 ...

  6. 【洛谷3527】[POI2011] MET-Meteors(树状数组+整体二分)

    点此看题面 大致题意: 一颗星球被分为\(M\)份,分别属于\(N\)个国家,有\(K\)场陨石雨,第\(i\)个国家希望收集\(P_i\)颗陨石,问其至少要在第几次陨石雨后才能达到目标. 关于整体二 ...

  7. 洛谷 P5057 [CQOI2006]简单题(树状数组)

    嗯... 题目链接:https://www.luogu.org/problem/P5057 首先发现这道题中只有0和1,所以肯定与二进制有关.然后发现这道题需要支持区间更改和单点查询操作,所以首先想到 ...

  8. 洛谷P4054 [JSOI2009]计数问题(二维树状数组)

    题意 题目链接 Sol 很傻x的题.. c才100, n, m才300,直接开100个二维树状数组就做完了.. #include<bits/stdc++.h> using namespac ...

  9. 模板【洛谷P3368】 【模板】树状数组 2

    P3368 [模板]树状数组 2 如题,已知一个数列,你需要进行下面两种操作: 1.将某区间每一个数数加上x 2.求出某一个数的值 树状数组区间加,单点查询. code: #include <i ...

随机推荐

  1. [Postman]代理(16)

    代理服务器充当内部网络和Internet之间的安全屏障,使Internet上的其他人无法访问内部网络上的信息. 什么是代理? 在基本网络中,客户端向服务器发出请求,服务器发回响应. 代理服务器是充当计 ...

  2. Error running 'Unnamed': Address localhost:1099 is already in use

    当使用idea运行项目时,出现‘Error running 'Unnamed': Address localhost:1099 is already in use’. 解决方案: 1.打开任务管理器 ...

  3. 使用webmagic爬虫对百度百科进行简单的爬取

    分析要爬取的网页源码: 1.打开要分析的网页,查看源代码,找到要爬取的内容: (选择网页里的一部分右击审查元素也行) 2.导入jar包,这个就直接去网上下吧: 3.写爬虫: package com.g ...

  4. 微服务架构下分布式事务解决方案——阿里GTS

    1 微服务的发展 微服务倡导将复杂的单体应用拆分为若干个功能简单.松耦合的服务,这样可以降低开发难度.增强扩展性.便于敏捷开发.当前被越来越多的开发者推崇,很多互联网行业巨头.开源社区等都开始了微服务 ...

  5. 【EF6学习笔记】(二)操练 CRUD 增删改查

    本篇原文链接: Implementing Basic CRUD Functionality 说明:学习笔记参考原文中的流程,为了增加实际操作性,并能够深入理解,部分地方根据实际情况做了一些调整:并且根 ...

  6. .Net Self Hosting 的几种方式

    写在前面: IIS是Windows平台非常关键的组件,它是微软自带的Web服务器,可以很方便的帮助我们运行起一个网站,WebApi等服务,提供给外部来访问.即使它被很多java或者ruby的同学各种鄙 ...

  7. leetcode — combination-sum

    import java.util.ArrayList; import java.util.Arrays; import java.util.List; /** * Source : https://o ...

  8. linux 命令 — find

    find 基本形式 find base_path base_path可以是任何目录,find会从该目录开始往下寻找 find . -print 列出当前目录下所有的文件和目录,以'\n'作为分隔符 f ...

  9. 高性能Mysql笔记 — 索引

    index优化 对于频繁作为查询条件的字段使用索引 注意索引字段类型的隐式转换,数据库类型和应用类型要一致 索引的种类 唯一索引,成为索引的列不能重复 单列索引,一个索引只包含一列 单列前缀索引,有些 ...

  10. 数据读取(SQL)与文本写入(fileStream)

    要求:从三个不同服务器中取数,对最近10的历史数据进行去重,写出到文本. 1.读取. public static DataTable ExecuteSql(string connectString, ...