HDU 4288 Coder ( 离散化 + 离线 + 线段树 )
这题跟ZOJ 3606的解题思路很相似。
题意:有3中操作:1.向集合中增加一个数x(1≤x≤1
e9);2.从集合中删去一个数x(保证这个数存在);3.查询集合中所有位置满足i%5==3的数a[i]的和,集合中的数按升序排列。给你一共N个操作,输出每次查询的和。
做法:因为操作只有10^5个,所以将所有查询中的数保存下来,排序之后离散化。每个数对应一个“位置”,通过标记这个“位置”是否已用来表示该数是否在集合中。
线段树节点记录两个信息:
cnt:这一段“位置”中含有多少个数,pushUp的时候cnt[rt] = cnt[ rt << 1 ] + cnt[ rt << 1 | 1 ];
sum[5]:sum[i]表示这个区间中,从左到右编号,位置模5为i的所有数的和。
pushUp的时候,sum[rt][i] = sum[lc][i], sum[rt][ (i+cnt[lc])%5 ]+= sum[rc][i]
#include <cstdio>
#include <cstring>
#include <cstdlib>
#include <algorithm> #define LL long long int
#define lson l, m, rt << 1
#define rson m + 1, r, rt << 1 | 1
#define lc rt << 1
#define rc rt << 1 | 1 using namespace std; const int MAXN = ; struct Qry
{
int op;
int val;
} qq[MAXN]; struct node
{
LL sum[];
int cnt;
}; int Q;
int num[MAXN];
int cnt;
node Tr[ MAXN << ]; void build( int l, int r, int rt )
{
for ( int i = ; i < ; ++i ) Tr[rt].sum[i] = ;
Tr[rt].cnt = ; if ( l == r ) return;
int m = ( l + r ) >> ;
build( lson );
build( rson );
return;
} void PushUp( int rt )
{
Tr[rt].cnt = Tr[lc].cnt + Tr[rc].cnt;
for ( int i = ; i < ; ++i ) Tr[rt].sum[i] = Tr[lc].sum[i];
for ( int i = ; i < ; ++i ) Tr[rt].sum[ (i+Tr[lc].cnt)% ] += Tr[rc].sum[i];
return;
} void Update( int x, int op, int l, int r, int rt )
{
if ( l == x && x == r )
{
for ( int i = ; i < ; ++i ) Tr[rt].sum[i] = ;
if ( op == )
{
Tr[rt].cnt = ;
Tr[rt].sum[] = num[x];
}
else if ( op == ) Tr[rt].cnt = ;
return;
}
int m = ( l + r ) >> ;
if ( x <= m ) Update( x, op, lson );
else Update( x, op, rson );
PushUp( rt );
return;
} int main()
{
while ( scanf( "%d", &Q ) == )
{
cnt = ;
for ( int i = ; i < Q; ++i )
{
char tmp[];
scanf( "%s", tmp );
if ( tmp[] == 'a' )
{
qq[i].op = ;
scanf( "%d", &qq[i].val );
num[cnt++] = qq[i].val;
}
else if ( tmp[] == 'd' )
{
qq[i].op = ;
scanf( "%d", &qq[i].val );
num[cnt++] = qq[i].val;
}
else qq[i].op = ;
} sort( num + , num + cnt );
cnt = unique( num + , num + cnt ) - num;
build( , cnt - , ); for ( int i = ; i < Q; ++i )
{
if ( qq[i].op == )
printf( "%I64d\n", Tr[].sum[] );
else
{
int x = lower_bound( num + , num + cnt, qq[i].val ) - num;
Update( x, qq[i].op, , cnt - , );
}
}
}
return ;
}
HDU 4288 Coder ( 离散化 + 离线 + 线段树 )的更多相关文章
- HDU 5700 区间交 离线线段树
区间交 题目连接: http://acm.hdu.edu.cn/showproblem.php?pid=5700 Description 小A有一个含有n个非负整数的数列与m个区间.每个区间可以表示为 ...
- HDU 4031 Attack(离线+线段树)(The 36th ACM/ICPC Asia Regional Chengdu Site —— Online Contest)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4031 Problem Description Today is the 10th Annual of ...
- hdu 4417 Super Mario 离线线段树
思路:将点按值从小到大排序,询问按h从小到大排序. 在建立线段树,按h的大小更新树并得到该次查询的结果! 代码如下: #include<iostream> #include<stdi ...
- HDU 3333 Turing Tree 离线 线段树/树状数组 区间求和单点修改
题意: 给一个数列,一些询问,问你$[l,r]$之间不同的数字之和 题解: 11年多校的题,现在属于"人尽皆知傻逼题" 核心思想在于: 对于一个询问$[x,R]$ 无论$x$是什么 ...
- hdu 4288 离线线段树+间隔求和
Coder Time Limit: 20000/10000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total Su ...
- 【HDU 1542】Atlantis(线段树+离散化,矩形面积并)
求矩形面积并,离散化加线段树. 扫描线法: 用平行x轴的直线扫,每次ans+=(下一个高度-当前高度)*当前覆盖的宽度. #include<algorithm> #include<c ...
- HDU 3016 Man Down (线段树+dp)
HDU 3016 Man Down (线段树+dp) Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Ja ...
- bzoj2333 离线 + 线段树
https://www.lydsy.com/JudgeOnline/problem.php?id=2333 有N个节点,标号从1到N,这N个节点一开始相互不连通.第i个节点的初始权值为a[i],接下来 ...
- HDU.5692 Snacks ( DFS序 线段树维护最大值 )
HDU.5692 Snacks ( DFS序 线段树维护最大值 ) 题意分析 给出一颗树,节点标号为0-n,每个节点有一定权值,并且规定0号为根节点.有两种操作:操作一为询问,给出一个节点x,求从0号 ...
随机推荐
- sql学习之创建表空间创建用户并授权
--创建表空间语法:create tablespace [name]create tablespace hclTest--设置参数datafile 'F:/orcale/hclTest'--设置表空间 ...
- 相机标定/校正(Camera Calibration)
以前DIP課程有做過Camera calibration,這次因為用Gopro做Visual SLAM,所以又要撿一下校正的過程.主要還是張正友的方法. OpenCV: 用OpenCV自帶的Sampl ...
- P1903 数颜色
题目 带修莫队题. 在询问上多加一个变量,记录是在那次修改之后的. 然后暴力修改. 就没了. 不过有一些修改的小技巧 #include<cstdio> #include<algori ...
- 解决cdh4.5.0下 MAP任务看不到状态
参考 http://qnalist.com/questions/772595/yarn-jobhistory-service 在mapreduce-site.xml中添加 <property&g ...
- windows下配置kafka
https://blog.csdn.net/evankaka/article/details/52421314
- input属性总结
<input type="text" readonly="readonly" /> 这个是不能输入的 readonly="readonly ...
- React路由-进阶篇
路由进阶 1.多级路由,和之前的思想一样,在子路由里面继续写Route,继续挂载组件,就可以实现多级路由 比如这样:class Food extends Component{ render() { r ...
- FreeBSD--网络配置
配置网口:ifconfig |less dc0: flags=8843<UP,BROADCAST,RUNNING,SIMPLEX,MULTICAST> mtu 1500 i ...
- Python文件IO(普通文件读写)
## 打开一个文件 - fileobj = open(filename, mode) 其中: fileobj是open()返回的文件对象 filename是该文件的字符串名 mode是指明文件类型和操 ...
- python__高级 : Property 的使用
一个类中,假如一个私有属性,有两个方法,一个是getNum , 一个是setNum 它,那么可以用 Property 来使这两个方法结合一下,比如这样用 num = property(getNum, ...