poj 3246 简单线段树

线段树还真有点难写。。。

#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <stack>
#include <queue>

using namespace std;
typedef long long LL;
#define oo 0x3f3f3f3f
#define N 200100

struct node
{
    int l, r;
    int s, e;
} tree[N*4];

int A[N];

void build(int l, int r, int rt)
{
    tree[rt].l=l;
    tree[rt].r=r;
    if(l==r)
    {
        tree[rt].s=tree[rt].e=A[l];
        return ;
    }
    int mid;
    mid=(l+r)/2;
    build(l, mid, rt*2);
    build(mid+1, r, rt*2+1);
    tree[rt].s=max(tree[rt*2].s, tree[rt*2+1].s);
    tree[rt].e=min(tree[rt*2].e, tree[rt*2+1].e);

    return ;
}

int query(int l, int r, int rt)
{
    if(tree[rt].l>=l&&tree[rt].r<=r)
    {
        return tree[rt].s;
    }
    int mid=(tree[rt].l+tree[rt].r)/2;
    if(r<=mid) return query(l, r, rt*2);
    else if(l>mid) return query(l, r, rt*2+1);
    else
    {
        return max(query(l, mid, rt*2), query(mid+1, r, rt*2+1));
    }
}

int Query(int l, int r, int rt)
{
    if(tree[rt].l>=l&&tree[rt].r<=r)
    {
        return tree[rt].e;
    }
    int mid=(tree[rt].l+tree[rt].r)/2;
    if(r<=mid) return Query(l, r, rt*2);
    else if(l>mid) return Query(l, r, rt*2+1);
    else
    {
        return min(Query(l, mid, rt*2), Query(mid+1, r, rt*2+1));
    }
}

int main()
{
    int n, m, a, b;

    while(~scanf("%d%d", &n, &m))
    {
        for(int i=1; i<=n; i++)
            scanf("%d", &A[i]);
        build(1, n, 1);

        while(m--)
        {
            scanf("%d%d", &a, &b);
            printf("%d\n", query(a, b, 1)-Query(a, b, 1));
        }
    }
    return 0;
}
时间: 2024-10-13 16:08:54

poj 3246 简单线段树的相关文章

poj 3468(简单线段树区间更新)

A Simple Problem with Integers Time Limit: 5000MS   Memory Limit: 131072K Total Submissions: 61936   Accepted: 18934 Case Time Limit: 2000MS Description You have N integers, A1, A2, ... , AN. You need to deal with two kinds of operations. One type of

POJ 2481 Cows (线段树)

Cows 题目:http://poj.org/problem?id=2481 题意:有N头牛,每只牛有一个值[S,E],如果对于牛i和牛j来说,它们的值满足下面的条件则证明牛i比牛j强壮:Si <=Sjand Ej <= Ei and Ei - Si > Ej - Sj.现在已知每一头牛的测验值,要求输出每头牛有几头牛比其强壮. 思路:将牛按照S从小到大排序,S相同按照E从大到小排序,这就保证了排在后面的牛一定不比前面的牛强壮.再按照E值(离散化后)建立一颗线段树(这里最值只有1e5,所

POJ 2299 离散化线段树

点击打开链接 Ultra-QuickSort Time Limit: 7000MS   Memory Limit: 65536K Total Submissions: 40827   Accepted: 14752 Description In this problem, you have to analyze a particular sorting algorithm. The algorithm processes a sequence of n distinct integers by

【简单线段树】I Hate It (求范围内最大)

I Hate It Time Limit: 9000/3000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 53477    Accepted Submission(s): 21005 Problem Description 很多学校流行一种比较的习惯.老师们很喜欢询问,从某某到某某当中,分数最高的是多少. 这让很多学生很反感.不管你喜不喜欢,现在需要你做的是,就是按照老师的

POJ训练计划2299_Ultra-QuickSort(线段树/单点更新)

解题报告 题意: 求逆序数. 思路: 线段树离散化处理. #include <algorithm> #include <iostream> #include <cstring> #include <cstdio> #define LL long long using namespace std; LL sum[2001000],num[501000],_hash[501000]; void push_up(int rt) { sum[rt]=sum[rt*2

POJ 3667(线段树区间合并)

http://poj.org/problem?id=3667 题意:两个操作 : 1 选出靠左的长度为a的区间. 2 把从 a到a+b的区间清空. 线段树区间合并+lazy // by caonima // hehe #include <cstdio> #include <cstring> #include <algorithm> #include <vector> #include <cmath> using namespace std; co

POJ&#183;1151 Atlantis&#183;线段树求矩形面积并

题目在这:http://poj.org/problem?id=1151 Atlantis Time Limit: 1000MS   Memory Limit: 10000K Description There are several ancient Greek texts that contain descriptions of the fabled island Atlantis. Some of these texts even include maps of parts of the is

POJ 2299 Ultra-QuickSort(线段树+离散化)

题目地址:POJ 2299 这题曾经用归并排序做过,线段树加上离散化也可以做.一般线段树的话会超时. 这题的数字最大到10^10次方,显然太大,但是可以利用下标,下标总共只有50w.可以从数字大的开始向树上加点,然后统计下标比它小即在它左边的数的个数.因为每加一个数的时候,比该数大的数已经加完了,这时候坐标在它左边的就是一对逆序数. 但是该题还有一个问题,就是数字重复的问题.这时候可以在排序的时候让下标大的在前面,这样就可以保证加点的时候下标比他小的数中不会出现重复的. 这题需要注意的是要用__

poj 2777(线段树的节点更新策略)

1 /* 2 之前的思想是用回溯的方式进行颜色的更新的!如果用回溯的方法的话,就是将每一个节点的颜色都要更新 3 通过子节点的颜色情况来判断父节点的颜色情况 !这就是TLE的原因! 4 5 后来想一想没有必要 !加入[a, b] 区间有p管辖,那么tree[p]的颜色值就是[a, b]所有点的颜色值! 6 如果[a,b]的子区间[c,d]没被跟新,那么tree[p]也是[c,d]的值! 7 否则,在更新[c,d]区间的时候,一定会经过 p 点!然后由上到下更新p<<1 和 p<<1