线段数模板

单点更新(HDU1166)

#include <cstdio>
#include <iostream>
using namespace std;
const int MAXN=2e5+10;
const int MAXNODE=MAXN<<2;//一般开到4倍
int sum;
struct node
{
  int l;
  int r;
  int value;
}tree[MAXNODE];
int father[MAXN];//用来储存第x个元素在线段数的结点位置
void BuildTree(int i,int l,int r)
{
    tree[i].l=l;
    tree[i].r=r;
    tree[i].value=0;
    if(l==r)
    {
      father[l]=i;
      return;
    }
    BuildTree(i<<1,l,(l+r)/2);
    BuildTree((i<<1)+1,(l+r)/2+1,r);
}
void UpTree(int ri)
{
    if(ri==1)
        return;
   int fi=ri/2;
   int a=tree[fi<<1].value;
   int b=tree[(fi<<1)+1].value;
   tree[fi].value=a+b;
   UpTree(fi);
}
int MAX;
void Query(int i,int l,int r)
{
  if(tree[i].l==l&&tree[i].r==r)
  {
     sum+=tree[i].value;
      return;
  }
  i=i<<1;
  if(l<=tree[i].r)
  {
      if(r<=tree[i].r) Query(i,l,r);
      else Query(i,l,tree[i].r);
  }
  i++;
  if(r>=tree[i].l)
  {
      if(l>=tree[i].l)Query(i,l,r);
      else Query(i,tree[i].l,r);
  }
}
int main()
{
    int n,m,g,a,b,t;
    char ch[100];
       scanf("%d",&t);
    for(int k=1;k<=t;k++)
    {
       scanf("%d",&n);

        BuildTree(1,1,n);
      for(int i=1;i<=n;i++)
      {
          scanf("%d",&g);
          tree[father[i]].value=g;
          UpTree(father[i]);
      }
      printf("Case %d:\n",k);
          while(scanf(" %s",ch)!=EOF)
          {
              sum=0;
           if(ch[0]==‘E‘)
            break;
           scanf("%d%d",&a,&b);
           if(ch[0]==‘Q‘)
           {
            Query(1,a,b);
            printf("%d\n",sum);
           }
           else if(ch[0]==‘A‘)
           {
             tree[father[a]].value+=b;
             UpTree(father[a]);
           }
           else if(ch[0]==‘S‘)
           {

             tree[father[a]].value-=b;
             UpTree(father[a]);
           }
           }
    }

  return 0;
}
时间: 2024-10-12 11:28:54

线段数模板的相关文章

hdu1754(线段数维护区间最大值)

题意:给定1-n(n<=200000)个数,然后动态改变一些值,并动态询问区间最大值. 解法:裸的线段树,赛前默写模版回忆下线段树代码.仍然要注意:线段树节点数组一定要开到节点数的三倍长度. 代码: /****************************************************** * author:xiefubao *******************************************************/ #pragma comment(lin

线段树模板(结构体)

线段树研究了两天了,总算有了点眉目,今天也把落下的题,补了一下. 贴一份线段树模板 线段树的特点: 1. 每一层都是区间[a, b]的一个划分,记 L = b - a 2. 一共有log2L层 3. 给定一个点p,从根到叶子p上的所有区间都包含点p,且其他区间都不包含点p. 4. 给定一个区间[l; r],可以把它分解为不超过2log2 L条不相交线段的并. 总结来说:线段树最近本的应用是4点: 1.单点更新:单点替换.单点增减 2.单点询问 3.区间询问:区间之和.区间最值 4.区间更新:区间

poj 3264 Balanced Lineup(线段数求区间最大最小值)

链接:http://poj.org/problem?id=3264 Time Limit: 5000MS   Memory Limit: 65536K Total Submissions: 32772   Accepted: 15421 Case Time Limit: 2000MS Description For the daily milking, Farmer John's N cows (1 ≤ N ≤ 50,000) always line up in the same order.

基本线段树模板(建树、点/区间修改、查询)

线段树主要用于区间记录信息(如区间和.最大最小值等),首先是建树: 这里以求和为例: 1 const int MAXM=50000; //定义 MAXM 为线段最大长度 2 3 int a[MAXM+5],segtree[(MAXM<<2)+5]; // a 数组为 main 函数中读入的内容,segtree 数组为需要查询的数的信息(如和.最值等),树的空间大小为线段最大长度的四倍 4 5 void build(int o,int l,int r){ //传入的参数为 o:当前需要建立的结点

hdu 2063 过山车(二分图匹配最大匹配数模板)

过山车 Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 10776    Accepted Submission(s): 4748 Problem Description RPG girls今天和大家一起去游乐场玩,终于可以坐上梦寐以求的过山车了.可是,过山车的每一排只有两个座位,而且还有条不成文的规矩,就是每个女生必须找个个男生做par

线段数 --- (单点更新、求逆序对)

Minimum Inversion Number Time Limit:1000MS     Memory Limit:32768KB     64bit IO Format:%I64d & %I64u Description The inversion number of a given number sequence a1, a2, ..., an is the number of pairs (ai, aj) that satisfy i < j and ai > aj. For

[ACM] 线段树模板

#include<iostream> #include<cmath> using namespace std; #define maxn 200005 class Node{ public: int l,r; int add;//附加值 int sum; }node[maxn]; int getRight(int n){//获得满足2^x>=n的最小x[从0层开始,给编号获得层数] return ceil(log10(n*1.0)/log10(2.0)); } void bu

HDU_1394_线段数

http://acm.hdu.edu.cn/showproblem.php?pid=1394 线段数入门题,每次读入一个数,就寻找在树中比它大的值的个数,然后跟新数,把个数相加就是逆序数,每移动一个数,相当于当前逆序数加上比首元素大的数的数量,减去比首元素小的数的数量. #include<iostream> #include<cstdio> #include<cstring> #include<algorithm> using namespace std;

[POJ2104] 区间第k大数 [区间第k大数,可持久化线段树模板题]

可持久化线段树模板题. #include <iostream> #include <algorithm> #include <cstdio> #include <cstdlib> #include <cstring> #include <cmath> #include <ctime> #include <vector> using namespace std; int n,q,tot,a[110000]; in