水题.....

插入一个值$v$时,对于$[0, v - 1]$和$[v + 1, inf]$的点分别考虑就行了

删除相当于减去插入的贡献

用动态开点线段树卡点常数就过去了

复杂度$O(n \log n)$

#include <cstdio>
#include <cstring>
using namespace std; extern inline char gc() {
static char RR[], *S = RR + , *T = RR + ;
if(S == T) fread(RR, , , stdin), S = RR;
return *S ++;
}
inline int read() {
int p = , w = ; char c = gc();
while(c > '' || c < '') { if(c == '-') w = -; c = gc(); }
while(c >= ''&& c <= '') p = p * + c - '', c = gc();
return p * w;
} int wr[], rw;
#define pc(o) *O ++ = o
char WR[], *O = WR;
template <typename re>
inline void write(re x) {
if(!x) pc('');
if(x < ) x = -x, pc('-');
while(x) wr[++ rw] = x % , x /= ;
while(rw) pc(wr[rw --] + ''); pc('\n');
} #define ll long long
#define ri register int
#define sid 5000050 ll ans;
ll sum[sid];
int n, q, id, rt;
int sz[sid], ls[sid], rs[sid];
const int inf = 1e9 + ; inline void upd(int o) {
sz[o] = sz[ls[o]] + sz[rs[o]];
sum[o] = sum[ls[o]] + sum[rs[o]];
} inline void ins(int &o, int l, int r, int p, int v) {
if(!o) o = ++ id;
if(l == r) { sz[o] += v; sum[o] = 1ll * sz[o] * p; return; }
int mid = (l + r) >> ;
if(p <= mid) ins(ls[o], l, mid, p, v);
else ins(rs[o], mid + , r, p, v);
upd(o);
} inline ll qry(int o, int l, int r, int ml, int mr) {
if(!o || ml > r || mr < l) return ;
if(ml <= l && mr >= r) return sum[o];
int mid = (l + r) >> ;
return qry(ls[o], l, mid, ml, mr) + qry(rs[o], mid + , r, ml, mr);
} inline int qsz(int o, int l, int r, int ml, int mr) {
if(!o || ml > r || mr < l) return ;
if(ml <= l && mr >= r) return sz[o];
int mid = (l + r) >> ;
return qsz(ls[o], l, mid, ml, mr) + qsz(rs[o], mid + , r, ml, mr);
} inline void ins(int v, int opt) {
if(opt == - && qsz(rt, , inf, v, v) == ) { write(-); return; }
ins(rt, , inf, v, opt);
ans += opt * (-qry(rt, , inf, , v - ) + 1ll * qsz(rt, , inf, , v - ) * v);
ans += opt * (qry(rt, , inf, v + , inf) - 1ll * qsz(rt, , inf, v + , inf) * v);
} int main() {
n = read(); q = read();
for(ri i = ; i <= n; i ++) ins(read(), );
for(ri i = ; i <= q; i ++) {
int opt = read();
if(opt == ) ins(read(), );
else if(opt == ) ins(read(), -);
else write(ans);
}
fwrite(WR, , O - WR, stdout);
return ;
}

51nod1394 差和问题 值域线段树的更多相关文章

  1. BZOJ 3218(a + b Problem-二分图套值域线段树)

    出这题的人是怎么想出来的…… 言归正传,这题是二分图套值域线段树. 首先经过 @Vfleaking的神奇建图后,把图拆成二分图, 不妨利用有向图最小割的性质建图(以前我一直以为最小割和边的方向无关,可 ...

  2. [BZOJ3065]带插入区间K小值 解题报告 替罪羊树+值域线段树

    刚了一天的题终于切掉了,数据结构题的代码真**难调,这是我做过的第一道树套树题,做完后感觉对树套树都有阴影了......下面写一下做题记录. Portal Gun:[BZOJ3065]带插入区间k小值 ...

  3. 值域线段树 bzoj 4627

    这是题目链接4627: [BeiJing2016]回转寿司 题目大意: 给定n个数,求有多少个字段和在 满足 L<=sum<=R; 解题思路 需要解这个题目,需要有线段树加可持续化的思想, ...

  4. Permutation UVA - 11525(值域树状数组,树状数组区间第k大(离线),log方,log)(值域线段树第k大)

    Permutation UVA - 11525 看康托展开 题目给出的式子(n=s[1]*(k-1)!+s[2]*(k-2)!+...+s[k]*0!)非常像逆康托展开(将n个数的所有排列按字典序排序 ...

  5. bzoj 4627 值域线段树

    4627: [BeiJing2016]回转寿司 Time Limit: 10 Sec  Memory Limit: 256 MBSubmit: 523  Solved: 227[Submit][Sta ...

  6. 值域线段树 (玲珑OJ 1117)

    点击打开题目链接 题目意思很简单: 1.插入x 2.把小于x的数变成x 3.把大于x的数变成x 4.求集合中第x小数 5.求集合中小于x的数个数 思路: 线段树,节点是值的分数,你可以离散,也可以不离 ...

  7. 牛客OI周赛10-提高组:B-Taeyeon的困惑(值域线段树)

    做法 单点加单点删,在值域线段树上直接二分就能求值前\(K\)小的和 Code #include<bits/stdc++.h> typedef long long LL; const LL ...

  8. 线段树 by yyb

    线段树 by yyb Type1 维护特殊信息 1.[洛谷1438]无聊的数列 维护一个数列,两种操作 1.给一段区间加上一个等差数列 2.单点询问值 维护等差数列 不难发现,等差数列可以写成\(ad ...

  9. BZOJ.5110.[CodePlus2017]Yazid 的新生舞会(线段树/树状数组/分治)

    LOJ BZOJ 洛谷 又来发良心题解啦 \(Description\) 给定一个序列\(A_i\).求有多少个子区间,满足该区间众数出现次数大于区间长度的一半. \(n\leq5\times10^5 ...

随机推荐

  1. [php]php错误处理机制

    1.判断文件是否存在,file_exists("文件名") or die("no such file");2.set_error_hanlder("错 ...

  2. 网络抓包wireshark(转)

    下载地址:https://www.wireshark.org/download/win64/   抓包应该是每个技术人员掌握的基础知识,无论是技术支持运维人员或者是研发,多少都会遇到要抓包的情况,用过 ...

  3. python爬虫多线程编程

    #使用了线程库 import threading from queue import Queue from bs4 import BeautifulSoup import json import re ...

  4. str.format() 格式化字符串函数

    语法 它通过{}和:来代替%. “映射”示例 通过位置 In [1]: '{0},{1}'.format('kzc',18) Out[1]: 'kzc,18' In [2]: '{},{}'.form ...

  5. java并发容器

    同步容器将所有对容器状态的访问都串行化,以实现线程安全性.这种方式的缺点是严重降低并发性.Java 5.0提供了多种并发容器来改进同步容器的性能.如ConcurrentHashMap代替同步且基于散列 ...

  6. Oracle dblink的说明和简单使用

    在跨数据库查询的时候时常会用到dblink,例如:两台不同的数据库服务器,从一台数据库服务器的一个用户读取另一台数据库服务器下面的某个schema的数据,这个时候,使用dblink能够很方便的实现.d ...

  7. Percona XtraDB Cluster(PXC) -集群环境安装

    Percona XtraDB Cluster(PXC)   ---服务安装篇   1.测试环境搭建: Ip 角色 OS PXC-version 172.16.40.201 Node1 Redhat/C ...

  8. python爬取漫画

    抓取漫画的网址是:sf互动传媒 抓取漫画的由来也是看了知乎上有人说用爬取漫画,然后自己也玩玩 首页中每个漫画的url是类似这样存储的: <tr> <td height="3 ...

  9. hive学习(四) hive的函数

    1.内置运算符 1.1关系运算符 运算符 类型 说明 A = B 所有原始类型 如果A与B相等,返回TRUE,否则返回FALSE A == B 无 失败,因为无效的语法. SQL使用”=”,不使用”= ...

  10. 铁器 · Burp Suite

    Burp Suite 是用于攻击web 应用程序的集成平台.它包含了许多工具,并为这些工具设计了许多接口,以促进加快攻击应用程序的过程.所有的工具都共享一个能处理并显示HTTP 消息,持久性,认证,代 ...