码迷,mamicode.com
首页 > 其他好文 > 详细

Color the ball 线段树 区间更新但点查询

时间:2017-05-18 18:40:02      阅读:183      评论:0      收藏:0      [点我收藏+]

标签:node   mission   icp   ext   desc   sizeof   ++   reg   scanf   

#include<iostream>
#include<cstdio>
#include<cmath>
#include<cstring>
#include<sstream>
#include<algorithm>
#include<queue>
#include<deque>
#include<iomanip>
#include<vector>
#include<cmath>
#include<map>
#include<stack>
#include<set>
#include<fstream>
#include<memory>
#include<list>
#include<string>
using namespace std;
typedef long long LL;
typedef unsigned long long ULL;
#define MAXN 100001
#define L 31
#define INF 1000000009
#define eps 0.00000001
struct node
{
    LL l, r, data;
}T[MAXN*4+10];
LL n,a[MAXN];
LL Query(LL p, LL k)
{
    if (T[p].l == T[p].r)
        return T[p].data;
    LL mid = (T[p].l + T[p].r) >> 1;
    LL sum = T[p].data;
    if (k <= mid)
        sum += Query(p << 1, k);
    else
        sum += Query(p << 1 | 1, k);
    return sum;
}
void Build(LL p, LL l, LL r)
{
    T[p].l = l, T[p].r = r, T[p].data = 0;
    if (l == r)
    {
        T[p].data = a[l];
        return;
    }
    LL mid = (l + r) >> 1;
    Build(p << 1, l, mid);
    Build(p <<1 | 1, mid + 1, r);
}
void Insert(LL p, LL l, LL r, LL num)
{
    //cout << p << ‘ ‘ << l << ‘ ‘ << r << ‘ ‘ << num << endl;
    if (l <= T[p].l&&r >= T[p].r)
    {
        T[p].data += num;
        return;
    }
    LL mid = (T[p].l + T[p].r) / 2;
    if (r <= mid)
        Insert(p << 1, l, r, num);
    else if (l > mid)
        Insert(p << 1 | 1, l, r, num);
    else
    {
        Insert(p << 1, l, mid, num);
        Insert(p << 1 | 1, mid + 1, r, num);
    }
}
int main()
{
    while (scanf("%lld", &n), n)
    {
        LL t1, t2;
        memset(a, 0, sizeof(a));
        Build(1, 1, n);
        for (LL i = 1; i <= n; i++)
        {
            scanf("%lld%lld", &t1, &t2);
            Insert(1, t1, t2, 1);
        }
        for (LL i = 1; i <= n; i++)
        {
            if (i>1) printf(" ");
            printf("%lld", Query(1, i));
        }
        printf("\n");
    }
    return 0;
}

 

技术分享
F.A.Q
Hand In Hand
Online Acmers
Forum | Discuss
Statistical Charts
Problem Archive
Realtime Judge Status
Authors Ranklist
 
     C/C++/Java Exams     
ACM Steps
Go to Job
Contest LiveCast
ICPC@China
Best Coder beta
VIP | STD Contests
Virtual Contests 
    DIY | Web-DIY beta
Recent Contests
 

Color the ball

Time Limit: 9000/3000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 19857    Accepted Submission(s): 9901


Problem Description
N个气球排成一排,从左到右依次编号为1,2,3....N.每次给定2个整数a b(a <= b),lele便为骑上他的“小飞鸽"牌电动车从气球a开始到气球b依次给每个气球涂一次颜色。但是N次以后lele已经忘记了第I个气球已经涂过几次颜色了,你能帮他算出每个气球被涂过几次颜色吗?
 

Input
每个测试实例第一行为一个整数N,(N <= 100000).接下来的N行,每行包括2个整数a b(1 <= a <= b <= N)。
当N = 0,输入结束。
 

Output
每个测试实例输出一行,包括N个整数,第I个数代表第I个气球总共被涂色的次数。
 

Sample Input
3 1 1 2 2 3 3 3 1 1 1 2 1 3 0
 

Sample Output
1 1 1 3 2 1
 

Author
8600

 

Color the ball 线段树 区间更新但点查询

标签:node   mission   icp   ext   desc   sizeof   ++   reg   scanf   

原文地址:http://www.cnblogs.com/joeylee97/p/6874709.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!