HDU2852_KiKi's K-Number(线段树/单点更新)

解题报告

题目传送门

题意:

意思很好理解。

思路:

每次操作是100000次,数据大小100000,又是多组输入。普通模拟肯定不行。

线段树结点记录区间里存在数字的个数,加点删点操作就让该点个数+1,判断x存在就查询[1,x]区间的个数和[1,x-1]的个数。

求x之后第k大的数就先确定小于x的个数t,第t+k小的数就是要求的。

#include <iostream>
#include <cstdio>
#include <cstring>

using namespace std;
int sum[1000000],ans;
void push_up(int rt) {
    sum[rt]=sum[rt*2]+sum[rt*2+1];
}
void update(int rt,int l,int r,int p,int v) {
    if(l==r) {
        sum[rt]+=v;
        return;
    }
    int mid=(l+r)/2;
    if(p<=mid)
        update(rt*2,l,mid,p,v);
    else update(rt*2+1,mid+1,r,p,v);
    push_up(rt);
}
int q_sum(int rt,int l,int r,int ql,int qr) {
    if(ql>r||qr<l)return 0;
    if(ql<=l&&r<=qr)
        return sum[rt];
    int mid=(l+r)/2;
    return q_sum(rt*2,l,mid,ql,qr)+q_sum(rt*2+1,mid+1,r,ql,qr);
}
void find_rt(int rt,int l,int r,int t) {
    int mid=(l+r)/2;
    if(t>sum[rt*2]) {
        if(l==r) {
            ans=r;
            return ;
        }
        find_rt(rt*2+1,mid+1,r,t-sum[rt*2]);
    } else find_rt(rt*2,l,mid,t);
}
int main() {
    int n,m,i,j,p,e,k;
    while(~scanf("%d",&m)) {
        n=100000;
        memset(sum,0,sizeof(sum));
        for(i=0; i<m; i++) {
            scanf("%d",&p);
            if(p==0) {
                scanf("%d",&e);
                update(1,1,n,e,1);
            } else if(p==1) {
                scanf("%d",&e);
                if(q_sum(1,1,n,1,e)==q_sum(1,1,n,1,e-1))
                    printf("No Elment!\n");
                else update(1,1,n,e,-1);
            } else if(p==2) {
                scanf("%d%d",&e,&k);
                int t=q_sum(1,1,n,1,e)+k;
                find_rt(1,1,n,t);
                if(ans==n)
                    printf("Not Find!\n");
                else
                    printf("%d\n",ans);
            }
        }
    }
    return 0;
}

KiKi‘s K-Number

Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)

Total Submission(s): 2574    Accepted Submission(s): 1184

Problem Description

For the k-th number, we all should be very familiar with it. Of course,to kiki it is also simple. Now Kiki meets a very similar problem, kiki wants to design a container, the container is to support the three operations.

Push: Push a given element e to container

Pop: Pop element of a given e from container

Query: Given two elements a and k, query the kth larger number which greater than a in container;

Although Kiki is very intelligent, she can not think of how to do it, can you help her to solve this problem?

Input

Input some groups of test data ,each test data the first number is an integer m (1 <= m <100000), means that the number of operation to do. The next m lines, each line will be an integer p at the beginning, p which has three values:

If p is 0, then there will be an integer e (0 <e <100000), means press element e into Container.

If p is 1, then there will be an integer e (0 <e <100000), indicated that delete the element e from the container

If p is 2, then there will be two integers a and k (0 <a <100000, 0 <k <10000),means the inquiries, the element is greater than a, and the k-th larger number.

Output

For each deletion, if you want to delete the element which does not exist, the output "No Elment!". For each query, output the suitable answers in line .if the number does not exist, the output "Not Find!".

Sample Input

5
0 5
1 2
0 6
2 3 2
2 8 1
7
0 2
0 2
0 4
2 1 1
2 1 2
2 1 3
2 1 4

Sample Output

No Elment!
6
Not Find!
2
2
4
Not Find!

Source

2009 Multi-University Training
Contest 4 - Host by HDU

HDU2852_KiKi's K-Number(线段树/单点更新),布布扣,bubuko.com

HDU2852_KiKi's K-Number(线段树/单点更新)

时间: 2024-12-28 09:25:18

HDU2852_KiKi's K-Number(线段树/单点更新)的相关文章

Minimum Inversion Number(线段树单点更新+逆序数)

Minimum Inversion Number(线段树单点更新+逆序数) Time Limit:1000MS     Memory Limit:32768KB     64bit IO Format:%I64d & %I64u Submit Status Description The inversion number of a given number sequence a1, a2, ..., an is the number of pairs (ai, aj) that satisfy

hdu1394 Minimum Inversion Number(线段树单点更新||暴力)

题目链接: huangjing 这个题目暴力和线段树都可以过,但是都需要掌握一个规律.. 当队首元素移到队尾后,可定会减少a[i]个逆序对,然后增加n-1-a[i]个逆序对. 你看比如1移到队尾,那么1>0这个逆序对就会减少,2>1,3>1,4>1这些逆序对就会增加.. 所以发现这个规律就好做了.. 暴力做法就是直接那样模拟.. 线段树做法是首先建立一颗空树,然后插入之前询问这颗树中在[插入元素,n]之间的树,求出来的就是逆序对的个数.然后将其更新进去即可.. 题目: 寻人启事:2

POJ 1804 Brainman(5种解法,好题,【暴力】,【归并排序】,【线段树单点更新】,【树状数组】,【平衡树】)

Brainman Time Limit: 1000MS   Memory Limit: 30000K Total Submissions: 10575   Accepted: 5489 Description BackgroundRaymond Babbitt drives his brother Charlie mad. Recently Raymond counted 246 toothpicks spilled all over the floor in an instant just b

HDU3074_Multiply game(线段树/单点更新)

解题报告 题意: 略 思路: 单点更新,区间乘积. #include <cstdio> #include <iostream> #include <cstring> #define LL long long using namespace std; LL mul[501000]; void update(int root,int l,int r,int p,int v) { int mid=(l+r)/2; if(l==r)mul[root]=v; else { if(

HDU1166_敌兵布阵(线段树/单点更新)

解题报告 题意: 略 思路: 线段树单点增减和区间求和. #include <iostream> #include <cstring> #include <cstdio> #define LL long long using namespace std; int sum[201000]; void update(int root,int l,int r,int p,int v) { int mid=(l+r)/2; if(l==r)sum[root]+=v; else

HDU1754_I Hate It(线段树/单点更新)

解题报告 题意: 略 思路: 单点替换,区间最值 #include <iostream> #include <cstring> #include <cstdio> #define inf 99999999 using namespace std; int maxx[808000]; void update(int root,int l,int r,int p,int v) { int mid=(l+r)/2; if(l==r)maxx[root]=v; else if(

POJ2352_Stars(线段树/单点更新)

解题报告 题意: 坐标系中,求每颗星星的左下角有多少星星. 思路: 把横坐标看成区间,已知输入是先对y排序再对x排序,每次加一个点先查询该点x坐标的左端有多少点,再更新点. #include <iostream> #include <cstdio> #include <cstring> using namespace std; int sum[200000]; struct node { int x,y; } p[20000]; void push_up(int roo

HDU 1166 敌兵布阵(线段树单点更新,板子题)

敌兵布阵 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 87684    Accepted Submission(s): 36912 Problem Description C国的死对头A国这段时间正在进行军事演习,所以C国间谍头子Derek和他手下Tidy又开始忙乎了.A国在海岸线沿直线布置了N个工兵营地,Derek和Tidy的任务

HDU 4302 线段树单点更新,维护区间最大最小值

http://acm.hdu.edu.cn/showproblem.php?pid=4302 Problem Description Holedox is a small animal which can be considered as one point. It lives in a straight pipe whose length is L. Holedox can only move along the pipe. Cakes may appear anywhere in the p