HDU5372——树状数组——Segment Game

http://acm.hdu.edu.cn/showproblem.php?pid=5372

/*
要求有多少线段被现在加进去的线段完全覆盖,所求即左端点比当前加进去的线段大的减去右端点比当前加进去的线段大的,就是覆盖的线段树
用两个树状数组来更新左端点和右端点的值
跟求逆序数那道题目一样,进行排序,二分得到现在排序之后的位置,因为前面加进去的能更新后面的

*/
/************************************************
* Author        :Powatr
* Created Time  :2015-8-14 14:15:49
* File Name     :1004.cpp
 ************************************************/

#include <cstdio>
#include <algorithm>
#include <iostream>
#include <sstream>
#include <cstring>
#include <cmath>
#include <string>
#include <vector>
#include <queue>
#include <deque>
#include <stack>
#include <list>
#include <map>
#include <set>
#include <bitset>
#include <cstdlib>
#include <ctime>
using namespace std;

#define lson l, mid, rt << 1
#define rson mid + 1, r, rt << 1 | 1
typedef long long ll;
const int MAXN = 5e5 + 10;
const int INF = 0x3f3f3f3f;
const int MOD = 1e9 + 7;

int b[MAXN][3];
int id[MAXN];
int C1[MAXN], C2[MAXN];
int a[MAXN];
int m;

int getid(int x)
{
    return lower_bound(a, a + m, x) - a + 1;//使得从1开始
}

void add(int *tr, int x, int k)
{
    while(x <= m){
        tr[x] += k;
        x += x&-x;
    }
}

int query(int *tr, int x)
{
    int ret = 0;
    while( x > 0){
        ret += tr[x];
        x -= x&-x;
    }
    return ret;
}

int main()
{
    int n;
    int cout = 0;
    while(~scanf("%d", &n)){
        printf("Case #%d:\n", ++cout);
        m = 0;
        int cout1 = 0;
        for(int i = 1; i <= n; i++){
            scanf("%d%d", &b[i][0], &b[i][1]);
            if(b[i][0] == 0){
                id[++cout1] = i;
                b[i][2] = b[i][1] + cout1;
                a[m++] = b[i][1];
                a[m++] = b[i][2];
            }
        }
        sort(a, a + m);
        int l, r;
        m = unique(a, a + m) - a;
        memset(C1, 0, sizeof(C1));
        memset(C2, 0, sizeof(C2));
        for(int i = 1; i <= n; i++){
            if(b[i][0] == 0){
                l = getid(b[i][1]);
                r = getid(b[i][2]);
                printf("%d\n", query(C2, r) - query(C1, l-1));
                add(C1, l, 1);
                add(C2, r, 1);
            }
            else {
                int p = id[b[i][1]];
                l = getid(b[p][1]);
                r = getid(b[p][2]);
                add(C1, l, -1);
                add(C2, r, -1);
            }
        }
    }
    return 0;
}

  

时间: 2024-08-06 20:09:21

HDU5372——树状数组——Segment Game的相关文章

hdu5372(2015多校7)--Segment Game(树状数组)

题目链接:点击打开链接 题目大意:存在一个横轴,有n此操作,0代表在横轴上新增加一条边,1代表删除1条边,其中0 x代表在从x位置开始增加一条边,当第i次加边时,边的长度为i,1 x代表删除第x次加的边.问每当新加入一条边是,这条边能完整的包含几条边. 为什么当时没做这个题,,,已经泪奔,,, 问的是新加的那条边能覆盖多少条边,统计已加入的边的左端点大于或等于新边左端点的个数x,统计已加入的边的右端点大于新边的右端点的个数y.那么新编能覆盖的边也就是x-y,,,,, 用树状数组分别维护一左端点的

HDOJ 5372 Segment Game 树状数组+离散化

因为这题的线段长度是递增的....所以: 题解:对于新插入的线段,查询有多少个线段左端点大于等于该线段的左端点. 再查询有多少个线段的右端点大于该线段右端点, 两者之差就是答案.用两个树状数组搞定.时间复杂度nlog Segment Game Time Limit: 3000/1500 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others) Total Submission(s): 975    Accepted Submiss

当前插入的线段能完整覆盖存在的几条线段 树状数组 HDU 5372 Segment Game

http://acm.hdu.edu.cn/showproblem.php? pid=5372 Segment Game Time Limit: 3000/1500 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others) Total Submission(s): 1284    Accepted Submission(s): 375 Problem Description Lillian is a clever girl so

每次输出有几条线段能完全覆盖大于自己和hdu5372相反 树状数组或线段树 poj 2481 Cows

http://poj.org/problem?id=2481 Cows Time Limit: 3000MS   Memory Limit: 65536K Total Submissions: 14762   Accepted: 4886 Description Farmer John's cows have discovered that the clover growing along the ridge of the hill (which we can think of as a one

HDU 5372 Segment Game 树状数组

链接 Segment Game Time Limit: 3000/1500 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others) Total Submission(s): 273    Accepted Submission(s): 48 Problem Description Lillian is a clever girl so that she has lots of fans and often receives gi

Segment Game (hdu 5372 树状数组+离散化)

Segment Game Time Limit: 3000/1500 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others) Total Submission(s): 534    Accepted Submission(s): 132 Problem Description Lillian is a clever girl so that she has lots of fans and often receives gift

BestCoder Round #16 Revenge of Segment Tree (树状数组)

今天第一次参加bc,虽然由于运动会耽误了时间,但还是开始做了题目. 第一道题恰巧是最近做的树状数组类型,nlogn 复杂度.规律推算很简单.一个长度的区间累加过程中会消掉中间部分,区间长度的改变会导致减掉加上的部分改变.减掉的是最前面k-1,加上后面n-k+1个 第二题一直没很好明白题意,虽然认为不难. 起初没有用long long 溢出了两次,o(︶︿︶)o 唉   以后看到取模之类的直接ll #include<cstdio> #include<string> #include&

HDU 5372 Segment Game (MUT#7 树状数组+离散化)

[题目链接]:click here~~ [题目大意]: 题意:两种操作,添加线段和删除线段,第i次添加时告诉线段起点并且要添加长度为i的线段,删除第i次添加的线段,问每次添加后有多少线段是落在当前要画的线段内部的. [思路]:比赛的时候居然直接无视了这道题,赛后看了一下,感觉要用到树状数组,有一种前后互相影响的样子,昨天想了一下午,加上昨天晚上,总算是搞明白了,因为每次画的线段的长度是递增的,所以当前画的线段不可能被其他线段包含,那么统计小于左端点的点的个数x和小于等于右端点的点的个数y,两者之

[luogu P3801] 红色的幻想乡 [线段树][树状数组]

题目背景 蕾米莉亚的红雾异变失败后,很不甘心. 题目描述 经过上次失败后,蕾米莉亚决定再次发动红雾异变,但为了防止被灵梦退治,她决定将红雾以奇怪的阵势释放. 我们将幻想乡看做是一个n*m的方格地区,一开始没有任何一个地区被红雾遮盖.蕾米莉亚每次站在某一个地区上,向东南西北四个方向各发出一条无限长的红雾,可以影响到整行/整列,但不会影响到她所站的那个地区.如果两阵红雾碰撞,则会因为密度过大而沉降消失.灵梦察觉到了这次异变,决定去解决它.但在解决之前,灵梦想要了解一片范围红雾的密度.可以简述为两种操