题目大意

给定一个数列,支持区间加一个数和区间取 \(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的更多相关文章

  1. Christmas Trees, Promises和Event Emitters

    今天有同事问我下面这段代码是什么意思: var MyClass = function() { events.EventEmitter.call(this); // 这行是什么意思? }; util.i ...

  2. POJ3160 Father Christmas flymouse[强连通分量 缩点 DP]

    Father Christmas flymouse Time Limit: 1000MS   Memory Limit: 131072K Total Submissions: 3241   Accep ...

  3. Father Christmas flymouse--POJ3160Tarjan

    Father Christmas flymouse Time Limit: 1000MS Memory Limit: 131072K Description After retirement as c ...

  4. POJ3013 Big Christmas Tree[转换 最短路]

    Big Christmas Tree Time Limit: 3000MS   Memory Limit: 131072K Total Submissions: 23387   Accepted: 5 ...

  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 ...

  6. poj 3013 Big Christmas Tree Djistra

    Big Christmas Tree 题意:图中每个节点和边都有权值,图中找出一颗树,树根为1使得 Σ(树中的节点到树根的距离)*(以该节点为子树的所有节点的权值之和) 结果最小: 分析:直接求出每个 ...

  7. BZOJ 3992 序列统计

    Description 小C有一个集合\(S\),里面的元素都是小于\(M\)的非负整数.他用程序编写了一个数列生成器,可以生成一个长度为\(N\)的数列,数列中的每个数都属于集合\(S\). 小C用 ...

  8. 【POJ3710】Christmas Game (博弈-树上的删边问题)

    [题目] Description Harry and Sally were playing games at Christmas Eve. They drew some Christmas trees ...

  9. poj 3710 Christmas Game(树上的删边游戏)

    Christmas Game Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 1967   Accepted: 613 Des ...

  10. POJ 3013 Big Christmas Tree(最短Dijkstra+优先级队列优化,SPFA)

    POJ 3013 Big Christmas Tree(最短路Dijkstra+优先队列优化,SPFA) ACM 题目地址:POJ 3013 题意:  圣诞树是由n个节点和e个边构成的,点编号1-n. ...

随机推荐

  1. 关于解决windows安装gcc g++环境 mingw失败

    前言 这几天学习c++,为了详细了解编译过程我没有安装vs全家桶,当然使用命令行是最好的方法. 但是为了解决这个网络问题折腾了我很久,经过我研究发现,其实就是到固定网站下载几个压缩格式的文件,然后解压 ...

  2. 100以内能被7整除的前五个数-Java

    import java.util.HashSet; import java.util.Set; public class Demo { //100以内能够被7整除的前五个数 public static ...

  3. 架构解析:Dubbo3 应用级服务发现如何应对双11百万集群实例

    继业务全面上云后,今年双11,阿里微服务技术栈全面迁移到以 Dubbo3 为代表的云上开源标准中间件体系.在业务上,基于 Dubbo3 首次实现了关键业务不停推.不降级的全面用户体验提升,从技术上,大 ...

  4. Android 内存缓存框架 LruCache 的实现原理,手写试试?

    本文已收录到 AndroidFamily,技术和职场问题,请关注公众号 [彭旭锐] 提问. 前言 大家好,我是小彭. 在之前的文章里,我们聊到了 LRU 缓存淘汰算法,并且分析 Java 标准库中支持 ...

  5. 【实习项目介绍】XXXXX大数据平台介绍

    一.技术架构 1.整体介绍及架构 (1)概述 Odeon大数据平台以全图形化Web操作的形式为用户提供一站式的大数据能力:包括数据采集.任务编排.调度及处理.数据展现(BI)等:同时提供完善的权限管理 ...

  6. eval解析的函数传参 object array

    1 const fn = (...args) => { 2 console.log(...args) 3 } 4 5 const handleEval = (fnName,...args) =& ...

  7. [数据结构][洛谷]P3375模板题 KMP

    主要还是KMP算法,上学期没学,只是考前抱了抱佛脚,也没怎么弄明白. 先放代码: //KMP #include <bits/stdc++.h>//万能头 using namespace s ...

  8. MongoDB 索引原理与索引优化

    转载请注明出处: 1.MongoDB索引 索引通常能够极大的提高查询的效率, 如果没有索引, MongoDB 在读取数据时必须扫描集合中的每个文件并选取那些符合查询条件的记录.这种扫描全集合的查询效率 ...

  9. Lombok介绍和配置

    什么是Lombok Lombok是一个Java库,能自动插入编辑器并构建工具,简化Java开发. 官网: https://www.projectlombok.org/ Lombok的作用 通过 添加注 ...

  10. JDBC基础学习笔记

    JDBC的理解: JDBC是允许便捷式访问底层数据库的应用程序接口,JDO.Hibernate.MyBatis等只是更好的封装了JDBC. JDBC的连接步骤: 1.注册驱动: //反射机制 Clas ...