题意:

n个操作

在[1, 100000]  的区间上add 或del数( 必不会重复添加或删除不存在的数)

sum 求出整个集合中 (下标%5 == 3 位置) 的数   的和

注意数据类型要64位

#include <stdio.h>
#include <string.h>
#include <queue>
#include <set>
#include <functional>
#include <map> #define N 101000
#define L(x) (x<<1)
#define R(x) (x<<1|1)
#define Mid(x,y) ((x+y)>>1)
#define ll __int64
using namespace std;
inline ll Max(ll a, ll b){ return a>b?a:b;}
inline ll Min(ll a, ll b){ return a<b?a:b;} ll Point[N]; struct node{
int l,r;
ll sum[5];
int num;
}tree[N*4]; void build( int l, int r, int id){
tree[id].l = l, tree[id].r = r;
memset(tree[id].sum,0,sizeof(tree[id].sum));
tree[id].num = 0; if(l==r)return ;
int mid = Mid(l, r);
build(l, mid, L(id));
build(mid+1, r, R(id));
}
void Updata_up(int id){
tree[id].num = tree[L(id)].num + tree[R(id)].num ; for(int i=0;i<5;i++)
tree[id].sum[i] = tree[L(id)].sum[i]; for(int i=0;i<5;i++) tree[id].sum[ (tree[L(id)].num + i)%5 ] += tree[R(id)].sum[i]; }
void insert(int pos, int id, ll data, bool add){ // add = true 插入data =false 删除data
if(tree[id].l == tree[id].r){
if(add)
{ tree[id].num = 1; tree[id].sum[1] = data;}
else
{ tree[id].num = 0; tree[id].sum[1] = 0; } return ;
} int mid = Mid(tree[id].l, tree[id].r); if( pos <= mid) insert(pos, L(id), data, add);
else insert(pos, R(id), data, add); Updata_up(id);
} struct QUE{
char c;
ll u;
}que[N];
set<ll> tempset; map<ll, int> mymap; void Input(int n){
ll u; char s[5];
tempset.clear();
mymap.clear();
for(int i = 1; i <= n; i++){
scanf("%s", s);
que[i].c = s[0]; if(s[0]!='s')scanf("%I64d",&u), que[i].u = u, tempset.insert(u);
} set<ll> ::iterator p = tempset.begin();
int size = tempset.size();
for(int i = 1; i <= size ; i++,p++){
mymap.insert(pair<ll, int>(*p, i));
Point[i] = *p;
}
}
int go(ll x){
return mymap.find(x) -> second;
}
int main(){
int n;
while(~scanf("%d",&n)){
build(1,100000,1); Input(n); for(int i = 1; i<=n; i++){
ll u = que[i].u;
if(que[i].c == 'a')
insert(go(u),1,u,1); else if(que[i].c == 'd')
insert(go(u),1,u,0); else if(que[i].c == 's')
printf("%I64d\n", tree[1].sum[3]); }
}
return 0;
}
/*
9
add 1
add 2
add 3
add 4
add 5
sum
add 6
del 3
sum ans:
3
4 6
add 1
add 3
add 5
add 7
add 9
sum ans:
5 */

HDU 4288 线段树+离散化的更多相关文章

  1. ZOJ 2301/HDU 1199 线段树+离散化

    给这个题目跪了两天了,想吐简直 发现自己离散化没学好 包括前一个离散化的题目,实际上是错了,我看了sha崽的博客后才知道,POJ那题简直数据弱爆了,本来随便一组就能让我WA掉的,原因在于离散化的时候, ...

  2. hdu 4288 线段树 暴力 **

    题意: 维护一个有序数列{An},有三种操作: 1.添加一个元素. 2.删除一个元素. 3.求数列中下标%5 = 3的值的和. 解题思路: 看的各种题解,今天终于弄懂了. 由于线段树中不支持添加.删除 ...

  3. hdu 5792 线段树+离散化+思维

    题目大意: Given a sequence A with length n,count how many quadruple (a,b,c,d) satisfies: a≠b≠c≠d,1≤a< ...

  4. hdu 4288 线段树+离线+离散化

    http://acm.hdu.edu.cn/showproblem.php?pid=4288 開始的时候,果断TLE,做的方法是,线段树上只维护%5==3的坐标,比方1 2 3 4 5 6 7  假设 ...

  5. HDU 1542 线段树离散化+扫描线 平面面积计算

    也是很久之前的题目,一直没做 做完之后觉得基本的离散化和扫描线还是不难的,由于本题要离散x点的坐标,最后要计算被覆盖的x轴上的长度,所以不能用普通的建树法,建树建到r-l==1的时候就停止,表示某段而 ...

  6. hdu 5877 线段树(2016 ACM/ICPC Asia Regional Dalian Online)

    Weak Pair Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 262144/262144 K (Java/Others)Total ...

  7. hdu 1542 线段树扫描(面积)

    Atlantis Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Su ...

  8. HDU5124:lines(线段树+离散化)或(离散化思想)

    http://acm.hdu.edu.cn/showproblem.php?pid=5124 Problem Description John has several lines. The lines ...

  9. POJ 2528 Mayor's posters(线段树+离散化)

    Mayor's posters 转载自:http://blog.csdn.net/winddreams/article/details/38443761 [题目链接]Mayor's posters [ ...

随机推荐

  1. CSS2简写代码(优化)

    [1]如果CSS属性值为0,那么你不必为其添加单位(如:px/em): 下面是你可能的写法: padding: 10px 5px 0px 0px; 但是你可能这样写: padding: 10px 5p ...

  2. Android Vibrator系统分析

    Vibrator系统的层次结构

  3. HTTP 无法注册 URL http://+:80/Temporary_Listen_Addresses/92819ef8-81ea-4bd9-

    今天在练习wcf时,客户端调用服务端方法时出现异常.如下: 未处理System.ServiceModel.AddressAlreadyInUseException Message="HTTP ...

  4. 1.1机器学习基础-python深度机器学习

    参考彭亮老师的视频教程:转载请注明出处及彭亮老师原创 视频教程: http://pan.baidu.com/s/1kVNe5EJ 1. 课程介绍 2. 机器学习 (Machine Learning, ...

  5. AngularJS: 自定义指令与控制器数据交互

    <!doctype html> <html> <head> <meta charset="utf-8"> <title> ...

  6. string与char* 互相转换以及周边问题

    先插一个小知识点 string str = "abc" str += 'd'; cout<<str<<endl;  //"abcd"   ...

  7. 【算法】改进的冒泡排序 O(n^2) 稳定的 C语言

    改进的冒泡排序 一.算法描述 基于原冒泡排序 每次选取第一个元素作为主元往后进行比较,若遇到比它小的则放到它左边(即进行交换),若遇到比它大的则选取大的作为主元进行后续比较,每趟选取了无序列中最大元素 ...

  8. 【转】改善C#程序的建议2:C#中dynamic的正确用法 空间

    dynamic是FrameWork4.0的新特性.dynamic的出现让C#具有了弱语言类型的特性.编译器在编译的时候不再对类型进行检查,编译期默认dynamic对象支持你想要的任何特性.比如,即使你 ...

  9. Log4Net配置注意点

    log4Net的配置文章一搜一大把,配置使用还是有一些点花费了很多时间,这里整理一下,添上坑,让Developer走的更稳. 编程式配置路径 新建一个配置文件,通过写代码来动态加载log4Net的配置 ...

  10. Java实现Http服务器(四)

    (1)HTTPServer的监听启动 sun.net.httpserver.ServerImpl类中启动了Socket监听,ServerImpl的内部类Dispatch类启动了Http服务器的监听 / ...