27号的十道离线线段树

27号的十道离线线段树

hdu4288: (2012成都网络赛&&cf)

#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<algorithm>
#define lson l,m,rt<<1
#define rson m+1,r,rt<<1|1

using namespace std;

const int maxn=1000100;
const int INF=(1<<29);

typedef long long ll;
int N;
char op[maxn][10];
int Q[maxn];
int X[maxn],Xn;
struct Node
{
    int cnt;
    ll sum[5];
};Node T[maxn<<2];

void push_up(int rt)
{
    T[rt].cnt=T[rt<<1].cnt+T[rt<<1|1].cnt;
    for(int i=0;i<5;i++){
        T[rt].sum[i]=T[rt<<1].sum[i]+T[rt<<1|1].sum[(i-T[rt<<1].cnt+50000000)%5];
    }
}

void build(int l,int r,int rt)
{
    if(l>r) return;
    if(l==r){
        T[rt].cnt=0;
        for(int i=0;i<5;i++) T[rt].sum[i]=0;
        return;
    }
    int m=(l+r)>>1;
    build(lson);
    build(rson);
    push_up(rt);
}

void update(int pos,int val,int op,int l,int r,int rt)
{
    if(l==r){
        if(op==1){
            if(T[rt].cnt==1) return;
        }
        if(op==-1){
            if(T[rt].cnt==0) return;
        }
        T[rt].cnt+=op;
        T[rt].sum[1]+=val;
        return;
    }
    int m=(l+r)>>1;
    if(pos<=m) update(pos,val,op,lson);
    else update(pos,val,op,rson);
    push_up(rt);
}

void get(int l,int r,int rt)
{
    cout<<"rt="<<rt<<" l="<<l<<" r="<<r<<" cnt="<<T[rt].cnt<<endl;
    if(l==r) return;
    int m=(l+r)>>1;
    get(lson);
    get(rson);
    return;
}

int main()
{
    //freopen("in.txt","r",stdin);
    //freopen("out.txt","w",stdout);
    while(cin>>N){
        Xn=0;
        for(int i=1;i<=N;i++){
            scanf("%s",op[i]);
            if(op[i][0]!=‘s‘){
                scanf("%d",&Q[i]);
                X[++Xn]=Q[i];
            }
        }
        sort(X+1,X+Xn+1);
        Xn=unique(X+1,X+Xn+1)-(X+1);
        build(1,Xn,1);
        for(int i=1;i<=N;i++){
            int pos=lower_bound(X+1,X+Xn+1,Q[i])-X;
            if(op[i][0]==‘a‘) update(pos,Q[i],1,1,Xn,1);
            else if(op[i][0]==‘d‘) update(pos,-Q[i],-1,1,Xn,1);
            else printf("%I64d\n",T[1].sum[3]);
        }
    }
    return 0;
}

时间: 2024-12-23 19:07:15

27号的十道离线线段树的相关文章

经典算法题每日演练——第十二题 线段树

原文:经典算法题每日演练--第十二题 线段树 这一篇我们来看树状数组的加强版线段树,树状数组能玩的线段树一样可以玩,而且能玩的更好,他们在区间求和,最大,平均 等经典的RMQ问题上有着对数时间的优越表现. 一:线段树 线段树又称"区间树”,在每个节点上保存一个区间,当然区间的划分采用折半的思想,叶子节点只保存一个值,也叫单元节点,所 以最终的构造就是一个平衡的二叉树,拥有CURD的O(lgN)的时间. 从图中我们可以清楚的看到[0-10]被划分成线段的在树中的分布情况,针对区间[0-N],最多有

hdu 4638 Group(莫队算法|离线线段树)

Group Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 1323    Accepted Submission(s): 703 Problem Description There are n men ,every man has an ID(1..n).their ID is unique. Whose ID is i and i-

HDU 4417 Super Mario(离线线段树or树状数组)

Problem Description Mario is world-famous plumber. His "burly" figure and amazing jumping ability reminded in our memory. Now the poor princess is in trouble again and Mario needs to save his lover. We regard the road to the boss's castle as a l

UPC 2224 Boring Counting (离线线段树,统计区间[l,r]之间大小在[A,B]中的数的个数)

题目链接:http://acm.upc.edu.cn/problem.php?id=2224 题意:给出n个数pi,和m个查询,每个查询给出l,r,a,b,让你求在区间l~r之间的pi的个数(A<=pi<=B,l<=i<=r). 参考链接:http://www.cnblogs.com/zj62/p/3558967.html #include <iostream> #include <cstdio> #include <cstring> #incl

spoj gss2 : Can you answer these queries II 离线&amp;&amp;线段树

1557. Can you answer these queries II Problem code: GSS2 Being a completist and a simplist, kid Yang Zhe cannot solve but get Wrong Answer from most of the OI problems. And he refuse to write two program of same kind at all. So he always failes in co

HDU ACM 4417 Super Mario 离线线段树

分析:离线线段树,把所有询问离线读入,然后按H从小到大排序.对于所有结点也按从小到大排序,然后根据查询的H,将比H小的点加入到线段树,最后就是一个区间求和.这题貌似也可以用划分树,树状数组等方法做. #include<iostream> #include<algorithm> using namespace std; #define N 100005 struct Tree { int left,right,cnt; } TREE[N<<2]; struct Query

ZOJ 5332 Calculation(离线 + 线段树)

题目链接 :http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=5332 比赛的时候没有做出来,赛后看了官方题解,虽然各种orz但是依旧只能orz(标程写得真是犀利),然后可耻的到网上找了下题解... 做法是线段树 + 离线搞, 网上那种对于[l, r]中的l从大到小排序很精妙(有一篇竟然说是以r为关键字,,,然后代码里面却是l...汗), 再注意到gcd()对于每一个起点来说,是单调递减的,这样可以乱搞了... 如果还不是很明白

2333: [SCOI2011]棘手的操作[离线线段树]

2333: [SCOI2011]棘手的操作 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 2325  Solved: 909[Submit][Status][Discuss] Description 有N个节点,标号从1到N,这N个节点一开始相互不连通.第i个节点的初始权值为a[i],接下来有如下一些操作: U x y: 加一条边,连接第x个节点和第y个节点 A1 x v: 将第x个节点的权值增加v A2 x v: 将第x个节点所在的连通块的所有

离线+线段树 HDU4228

题目大意:给一个数组a,他的顺序是严格的单调增,然后有如下三个操作 ①加入一个val到a数组里面去,加入的位置就是a[i-1]<val<a[i+1] ②删除一个a[i]=val的值 ③查询所有下标i%5=3的值 思路:线段树+离线 首先因为线段树中不支持添加.删除操作的,所以只能离线把所有的val离散化以后放到区间里面去.然后关键就是线段树是怎么建立的. 我们知道,每个%5都会有0,1,2,3,4这5个值,然后我们可以通过线段树来维护这5个值.我们首先用sum[5]表示能被5整除的5种求余后不