• HDU 4288 线段树+离散化


    题意:

    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
    ", 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
    
    
    */


     

  • 相关阅读:
    fastdfs部署及官网
    fasrdfs在spring cloud中的使用
    面包屑的查询
    SpringCloud中使用ES使用课程上下线
    Redis中在项目中的使用
    树结构Tree查询
    平凡的世界 田晓霞的日记 摘抄

    英语积累
    英语学习第四天
  • 原文地址:https://www.cnblogs.com/pangblog/p/3359978.html
Copyright © 2020-2023  润新知