Wannafly挑战赛18 E 极差(线段树、单调栈)
Wannafly挑战赛18 E 极差
题意
给出三个长度为n的正整数序列,一个区间[L,R]的价值定义为:三个序列中,这个区间的极差(最大值与最小值之差)的乘积。
求所有区间的价值之和。答案对\(2^{32}\)取模。
题解
如果只有一个区间,我们可以枚举区间右端点,当右端点向右移动,左端点在[x, r]的一些区间的值会发生改变,可以用单调栈和线段树维护。
至于三个区间,可以用八棵线段树维护选中的某几个区间想乘的值。
代码
#include<bits/stdc++.h>
using namespace std;
#define fi first
#define se second
#define mp make_pair
#define pb push_back
#define rep(i, a, b) for(int i=(a); i<(b); i++)
#define sz(a) (int)a.size()
#define efi(a) a[sz(a)-1]
#define ese(a) a[sz(a)-2]
#define de(a) cout << #a << " = " << a << endl
#define dd(a) cout << #a << " = " << a << " "
#define all(a) a.begin(), a.end()
#define endl "\n"
typedef long long ll;
typedef unsigned int uint;
typedef pair<int, int> pii;
typedef vector<int> vi;
//---
const int N = 101010;
const ll P = 1ll<<32;
int n;
uint a[3][N];
struct Seg {
#define ls (rt<<1)
#define rs (ls|1)
static const int N = ::N<<2;
uint sum[8][N], la[3][N];
void build(int l, int r, int rt) {
sum[0][rt] = r-l+1;
if(l==r) return ;
int mid = l+r>>1;
build(l, mid, ls);
build(mid+1, r, rs);
}
inline void gao(int x, uint c, int rt) {
int p = 1<<x;
rep(i, 1, 8) if((i&p)==p) {
sum[i][rt] += sum[i^p][rt] * c;
}
la[x][rt] += c;
}
inline void down(int rt) {
rep(x, 0, 3) if(la[x][rt]) {
gao(x, la[x][rt], ls);
gao(x, la[x][rt], rs);
la[x][rt] = 0;
}
}
inline void up(int rt) {
rep(i, 1, 8) sum[i][rt] = sum[i][ls] + sum[i][rs];
}
void upd(int L, int R, int p, uint c, int l, int r, int rt) {
if(L<=l&&r<=R) {
gao(p, c, rt);
return ;
}
int mid = l+r>>1;
down(rt);
if(L<=mid) upd(L, R, p, c, l, mid, ls);
if(R>=mid+1) upd(L, R, p, c, mid+1, r, rs);
up(rt);
}
uint qry(int L, int R, int l, int r, int rt) {
if(L<=l&&r<=R) return sum[7][rt];
int mid = l+r>>1;
down(rt);
uint ans = 0;
if(L<=mid) ans += qry(L, R, l, mid, ls);
if(R>=mid+1) ans += qry(L, R, mid+1, r, rs);
up(rt);
return ans;
}
}seg;
int pma[3], pmi[3];
int ma[3][N], mi[3][N];
int main() {
std::ios::sync_with_stdio(false);
std::cin.tie(0);
///
cin >> n;
///read
rep(i, 0, 3) rep(j, 1, n+1) cin >> a[i][j];
///solve
seg.build(1, n, 1);
uint ans = 0;
rep(j, 1, n+1) {
rep(i, 0, 3) {
while(pmi[i] && a[i][mi[i][pmi[i]]] > a[i][j]) {
seg.upd(mi[i][pmi[i]-1]+1, mi[i][pmi[i]], i, a[i][mi[i][pmi[i]]], 1, n, 1);
--pmi[i];
}
mi[i][++pmi[i]] = j;
seg.upd(mi[i][pmi[i]-1]+1, j, i, -a[i][j], 1, n, 1);
while(pma[i] && a[i][ma[i][pma[i]]] < a[i][j]) {
seg.upd(ma[i][pma[i]-1]+1, ma[i][pma[i]], i, -a[i][ma[i][pma[i]]], 1, n, 1);
--pma[i];
}
ma[i][++pma[i]] = j;
seg.upd(ma[i][pma[i]-1]+1, j, i, a[i][j], 1, n, 1);
}
ans += seg.sum[7][1];
}
cout << ans << endl;
return 0;
}
Wannafly挑战赛18 E 极差(线段树、单调栈)的更多相关文章
- Codeforces 1175F - The Number of Subpermutations(线段树+单调栈+双针/分治+启发式优化)
Codeforces 题面传送门 & 洛谷题面传送门 由于这场的 G 是道毒瘤题,蒟蒻切不动就只好来把这场的 F 水掉了 看到这样的设问没人想到这道题吗?那我就来发篇线段树+单调栈的做法. 首 ...
- Codeforces 781E Andryusha and Nervous Barriers 线段树 单调栈
原文链接https://www.cnblogs.com/zhouzhendong/p/CF781E.html 题目传送门 - CF781E 题意 有一个矩形,宽为 w ,高为 h .一开始会有 w 个 ...
- 洛谷P4425 转盘 [HNOI/AHOI2018] 线段树+单调栈
正解:线段树+单调栈 解题报告: 传送门! 1551又是一道灵巧连题意都麻油看懂的题,,,,所以先解释一下题意好了,,,, 给定一个n元环 可以从0时刻开始从任一位置出发 每次可以选择向前走一步或者在 ...
- 线段树+单调栈+前缀和--2019icpc南昌网络赛I
线段树+单调栈+前缀和--2019icpc南昌网络赛I Alice has a magic array. She suggests that the value of a interval is eq ...
- 牛客多校第四场sequence C (线段树+单调栈)
牛客多校第四场sequence C (线段树+单调栈) 传送门:https://ac.nowcoder.com/acm/contest/884/C 题意: 求一个$\max {1 \leq l \le ...
- BZOJ.4540.[HNOI2016]序列(莫队/前缀和/线段树 单调栈 RMQ)
BZOJ 洛谷 ST表的一二维顺序一定要改过来. 改了就rank1了哈哈哈哈.自带小常数没办法. \(Description\) 给定长为\(n\)的序列\(A_i\).\(q\)次询问,每次给定\( ...
- [Codeforces1132G]Greedy Subsequences——线段树+单调栈
题目链接: Codeforces1132G 题目大意:给定一个序列$a$,定义它的最长贪心严格上升子序列为$b$满足若$a_{i}$在$b$中则$a_{i}$之后第一个比它大的也在$b$中.给出一个数 ...
- AtCoder Regular Contest 063 F : Snuke’s Coloring 2 (线段树 + 单调栈)
题意 小 \(\mathrm{C}\) 很喜欢二维染色问题,这天他拿来了一个 \(w × h\) 的二维平面 , 初始时均为白色 . 然后他在上面设置了 \(n\) 个关键点 \((X_i , Y_i ...
- cdqz2017-test10-rehearsal(CDQ分治&可持久化线段树&单调栈)
题意: 给出n个三元组 e[i]=(si,ti,wi) 第i个三元组的价值为 Σ w[j] ,j 满足以下4个条件: 1.j<i 2.tj<ti 3.sj<si 4.不存在j< ...
随机推荐
- CSS选择器详解(二)通用选择器和高级选择器
目录 通用选择器 高级选择器 子选择器 相邻兄弟选择器 属性选择器 通用选择器 通用选择器可以选择页面上的所有元素,并对它们应用样式,用 * 来表示. 语法: * { property1: value ...
- Python(3):文件读写与异常
访问路径: 文件读写必然涉及到文件会放在某个路径下.在python里,可以通过引入os包来实现切换当前访问的路径: # 假设我在 /home/zyq/KiDe/Python/test 文件夹中有一个文 ...
- pygame(一)
昨天,是有在树莓派上面操作pygame的,但是树莓派又上不了网了,很奇怪,我的306wifi显示的是树莓派连接成功,但是就是无法用网络,所以就下载不了图片,坐等HDMI线吧. 现在,看小甲鱼的视频已经 ...
- pythonchallenge(七)
转眼间又一个月没有逛博客园,明显的感觉到自己的代码能力变弱,前两周搞项目去了,只是形式上面的答辩而已,并没有涉及到代码层面,也就玩了一下验证码,没有识别玩出校器网页的验证码:转眼间又是各种考试,所幸, ...
- Linq中连接
Linq中连接主要有组连接.内连接.左外连接.交叉连接四种.各个用法如下. 注:本文内容主要来自<Linq实战>,本例中用到的对象请见文章底部. 1. 组连接 组连接是与分组查询是一样的. ...
- Metronic 对话 chat
http://keenthemes.com/preview/metronic/theme/admin_1/index.html: jquery让滚动条默认在最底部:$('#content').scro ...
- <深入理解JavaScript>学习笔记(4)_立即调用的函数表达式
前言 大家学JavaScript的时候,经常遇到自执行匿名函数的代码,今天我们主要就来想想说一下自执行.(小菜理解:的确看到好多,之前都不知道这是自执行匿名函数) 在详细了解这个之前,我们来谈了解一下 ...
- Java - 复合模式优于继承
继承是实现代码重用的方法之一,但使用不当则会导致诸多问题. 继承会破坏封装性,对一个具体类进行跨包访问级别的继承很危险. 即,子类依赖父类的实现细节. 如果父类的实现细节发生变化,子类则可能遭到破坏. ...
- iOS开发之工具篇-20个可以帮你简化移动app开发流程的工具
如果想进入移动app开发这个领域,你总能从别的开发者或者网上或者书上找到各种各样的方法和工具,对于新手来说,还没有摸清门路就已经陷入迷茫了.这里推荐20个可以帮你简化app开发流程的工具.很多开发者都 ...
- 6、Object、String、StringBuffer
Java的Api以及Object类 API概念 * A:API(Application Programming Interface) * 应用程序编程接口 * B:Java API * 就是Java提 ...