JZOJ 3992.Christmas
题目大意
给定一个数列,支持区间加一个数和区间取 \(max\),询问单点询问数值和它被更改的次数
思路
模板的吉司机线段树
维护区间最小值和严格次小值以及最小值的个数
针对询问维护区间和以及区间修改次数
那么我们可以 \(O(n\log^2 n)\) 解决问题
\(Code\)
#include<cstdio>
#include<iostream>
#define ls (k << 1)
#define rs (ls | 1)
using namespace std;
typedef long long LL;
const int N = 1e5 + 5 , INF = 0x3f3f3f3f;
int n , m , a[N];
struct segment{
LL sum , ch_cnt;
int mn , sec , mn_cnt , tag_add , tag_max , add_cnt , max_cnt;
}seg[N << 2];
inline void pushup(int k)
{
seg[k].sum = seg[ls].sum + seg[rs].sum;
seg[k].ch_cnt = seg[ls].ch_cnt + seg[rs].ch_cnt;
seg[k].mn = min(seg[ls].mn , seg[rs].mn);
if (seg[ls].mn == seg[rs].mn)
{
seg[k].mn_cnt = seg[ls].mn_cnt + seg[rs].mn_cnt;
seg[k].sec = min(seg[ls].sec , seg[rs].sec);
}
else if (seg[ls].mn < seg[rs].mn)
{
seg[k].mn_cnt = seg[ls].mn_cnt;
seg[k].sec = min(seg[ls].sec , seg[rs].mn);;
}
else {
seg[k].mn_cnt = seg[rs].mn_cnt;
seg[k].sec = min(seg[ls].mn , seg[rs].sec);
}
}
inline void push_add(int l , int r , int k , int cnt , int v)
{
seg[k].sum += (r - l + 1LL) * v , seg[k].tag_add += v , seg[k].mn += v;
seg[k].add_cnt += cnt , seg[k].ch_cnt += (r - l + 1LL) * cnt;
if (seg[k].sec < INF) seg[k].sec += v;
if (seg[k].tag_max > -INF) seg[k].tag_max += v;
}
inline void push_max(int k , int cnt , int v)
{
if (v <= seg[k].mn) return;
seg[k].sum += 1LL * (v - seg[k].mn) * seg[k].mn_cnt , seg[k].mn = seg[k].tag_max = v;
seg[k].max_cnt += cnt , seg[k].ch_cnt += 1LL * seg[k].mn_cnt * cnt;
}
inline void pushdown(int l , int r , int k)
{
int mid = (l + r) >> 1;
if (seg[k].add_cnt)
{
push_add(l , mid , ls , seg[k].add_cnt , seg[k].tag_add);
push_add(mid + 1 , r , rs , seg[k].add_cnt , seg[k].tag_add);
seg[k].add_cnt = seg[k].tag_add = 0;
}
if (seg[k].max_cnt)
{
push_max(ls , seg[k].max_cnt , seg[k].tag_max);
push_max(rs , seg[k].max_cnt , seg[k].tag_max);
seg[k].max_cnt = 0 , seg[k].tag_max = -INF;
}
}
inline void build(int l , int r , int k)
{
seg[k].tag_max = -INF;
if (l == r)
{
seg[k].sum = seg[k].mn = a[l];
seg[k].mn_cnt = 1 , seg[k].sec = INF;
return;
}
int mid = (l + r) >> 1;
build(l , mid , ls) , build(mid + 1 , r , rs);
pushup(k);
}
inline void update_add(int l , int r , int k , int x , int y , int c)
{
if (x <= l && r <= y)
{
push_add(l , r , k , c == 0 ? 0 : 1 , c);
return;
}
pushdown(l , r , k);
int mid = (l + r) >> 1;
if (x <= mid) update_add(l , mid , ls , x , y , c);
if (y > mid) update_add(mid + 1 , r , rs , x , y , c);
pushup(k);
}
inline void update_max(int l , int r , int k , int x , int y , int c)
{
if (seg[k].mn >= c) return;
if (x <= l && r <= y && seg[k].sec > c)
{
push_max(k , 1 , c);
return;
}
pushdown(l , r , k);
int mid = (l + r) >> 1;
if (x <= mid) update_max(l , mid , ls , x , y , c);
if (y > mid) update_max(mid + 1 , r , rs , x , y , c);
pushup(k);
}
inline int query_sum(int l , int r , int k , int x)
{
if (l == r && l == x) return seg[k].sum;
pushdown(l , r , k);
int mid = (l + r) >> 1;
if (x <= mid) return query_sum(l , mid , ls , x);
else return query_sum(mid + 1 , r , rs , x);
}
inline int query_ch_cnt(int l , int r , int k , int x)
{
if (l == r && l == x) return seg[k].ch_cnt;
pushdown(l , r , k);
int mid = (l + r) >> 1;
if (x <= mid) return query_ch_cnt(l , mid , ls , x);
else return query_ch_cnt(mid + 1 , r , rs , x);
}
int main()
{
scanf("%d" , &n);
for(register int i = 1; i <= n; i++) scanf("%d" , &a[i]);
build(1 , n , 1);
scanf("%d" , &m);
char op[2];
int l , r , c;
for(; m; m--)
{
scanf("%s" , op);
if (op[0] == 'A')
{
scanf("%d%d%d" , &l , &r , &c);
update_add(1 , n , 1 , l , r , c);
}
else if (op[0] == 'M')
{
scanf("%d%d%d" , &l , &r , &c);
update_max(1 , n , 1 , l , r , c);
}
else{
scanf("%d" , &c);
printf("%d %d\n" , query_sum(1 , n , 1 , c) , query_ch_cnt(1 , n , 1 , c));
}
}
}
JZOJ 3992.Christmas的更多相关文章
- Christmas Trees, Promises和Event Emitters
今天有同事问我下面这段代码是什么意思: var MyClass = function() { events.EventEmitter.call(this); // 这行是什么意思? }; util.i ...
- POJ3160 Father Christmas flymouse[强连通分量 缩点 DP]
Father Christmas flymouse Time Limit: 1000MS Memory Limit: 131072K Total Submissions: 3241 Accep ...
- Father Christmas flymouse--POJ3160Tarjan
Father Christmas flymouse Time Limit: 1000MS Memory Limit: 131072K Description After retirement as c ...
- POJ3013 Big Christmas Tree[转换 最短路]
Big Christmas Tree Time Limit: 3000MS Memory Limit: 131072K Total Submissions: 23387 Accepted: 5 ...
- poj 3013 Big Christmas Tree (最短路径Dijsktra) -- 第一次用优先队列写Dijsktra
http://poj.org/problem?id=3013 Big Christmas Tree Time Limit: 3000MS Memory Limit: 131072K Total S ...
- poj 3013 Big Christmas Tree Djistra
Big Christmas Tree 题意:图中每个节点和边都有权值,图中找出一颗树,树根为1使得 Σ(树中的节点到树根的距离)*(以该节点为子树的所有节点的权值之和) 结果最小: 分析:直接求出每个 ...
- BZOJ 3992 序列统计
Description 小C有一个集合\(S\),里面的元素都是小于\(M\)的非负整数.他用程序编写了一个数列生成器,可以生成一个长度为\(N\)的数列,数列中的每个数都属于集合\(S\). 小C用 ...
- 【POJ3710】Christmas Game (博弈-树上的删边问题)
[题目] Description Harry and Sally were playing games at Christmas Eve. They drew some Christmas trees ...
- poj 3710 Christmas Game(树上的删边游戏)
Christmas Game Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 1967 Accepted: 613 Des ...
- POJ 3013 Big Christmas Tree(最短Dijkstra+优先级队列优化,SPFA)
POJ 3013 Big Christmas Tree(最短路Dijkstra+优先队列优化,SPFA) ACM 题目地址:POJ 3013 题意: 圣诞树是由n个节点和e个边构成的,点编号1-n. ...
随机推荐
- nginx配置文件讲解及示例(可复制)
详细的配置说明参考:https://www.cnblogs.com/ghl1024/p/9013805.html [示例一] #运行用户user www-data; #启动进程,通常设置成和cpu ...
- 【每日一题】【队列的实现类】【每层元素个数】2022年1月11日-NC15 求二叉树的层序遍历
描述给定一个二叉树,返回该二叉树层序遍历的结果,(从左到右,一层一层地遍历)例如:给定的二叉树是{3,9,20,#,#,15,7}, 注意:每一层上元素的个数 解答: import java.util ...
- 【每日一题】【map操作】【滑动窗口所需元素】2021年12月22日-76. 最小覆盖子串
给你一个字符串 s .一个字符串 t .返回 s 中涵盖 t 所有字符的最小子串.如果 s 中不存在涵盖 t 所有字符的子串,则返回空字符串 "" . 注意: 对于 t 中重复字符 ...
- 持续发烧,聊聊Dart语言的静态编译,能挑战Go不?
前言 前两天写了几篇文章,谈了谈Dart做后端开发的优势,比如: <Dart开发服务端,我是不是发烧(骚)了?> <持续发烧,试试Dart语言的异步操作,效率提升500%> & ...
- 使用docker中的MySQL
简言 好久没写文章了,今天分享一篇将mysql移到docker容器.大家都是程序员,如何安装docker我就不说了. 1. 安装.启动mysql镜像 首先使用 docker search mysql ...
- Kubernetes的垂直和水平扩缩容的性能评估
Kubernetes的垂直和水平扩缩容的性能评估 译自:Performance evaluation of the autoscaling strategies vertical and horizo ...
- SQLSERVER 的主键索引真的是物理有序吗?
一:背景 1. 讲故事 最近在看 SQL SERVER 2008 查询性能优化,书中说当一个表创建了聚集索引,那么表中的行会按照主键索引的顺序物理排列,这里有一个关键词叫:物理排列,如果不了解底层原理 ...
- JavaScript 中URL 查询字符串(query string)的序列与反序列化
方法一: 在 JavaScript 中,可以使用 URLSearchParams 对象来处理 URL 中的查询字符串. 序列化(将 JavaScript 对象转换为查询字符串)可以使用 URLSear ...
- Hexo博客搭建记录
Hexo博客搭建记录 参考视频:手把手教你从0开始搭建自己的个人博客 |无坑版视频教程 以下命令操作建议使用管理员权限完成 1. nodejs & hexo 安装 1.首先下载node.js, ...
- 学习ASP.NET Core Blazor编程系列二十二——登录(1)
学习ASP.NET Core Blazor编程系列文章之目录 学习ASP.NET Core Blazor编程系列一--综述 学习ASP.NET Core Blazor编程系列二--第一个Blazor应 ...