标签:des style blog color java 使用 os io
Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 2546 Accepted Submission(s): 1174
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
No Elment! 6 Not Find! 2 2 4 Not Find!
三种操作,0 代表添加一个数x,1代表删除一个数x,2代表 找比a大的第k个数,使用线段树求解,线段树统计在一个区间内出现的数的个数,对于找比a大的第k个数,从a开始向后查找,如果在某段中累加的和大于k,就让它跳入这段中,直到深入到一个叶子节点时,刚好ans >= k。
对线段树的更新不解释,主要是查询的时候
1.如果当前区间[l,r]中 r<=a那么这一段的数都不用统计。
2.如果r >a,代表该段中存在比a大的数就要向下深入。
3.如果l > a,那么该段中所有的点都会大于a,开始判断,如果该段全部加入后仍然小于k,那么就可以全部加入,如果加进去以后大于等于k,那么就要向下深入,一直深入到叶子节点,满足条件的,最左的叶子节点就是我们要求的值。(线段树,从左向右查找,一定可以找到第一个)
#include <cstdio> #include <cstring> #include <algorithm> using namespace std; #define maxn 110000 #define lmin 1 #define rmax n #define lson l,(l+r)/2,rt<<1 #define rson (l+r)/2+1,r,rt<<1|1 #define root lmin,rmax,1 #define now l,r,rt #define int_now int l,int r,int rt int cl[maxn<<2] , k1[maxn] , k2[maxn<<2] , top ; void push_up(int_now) { cl[rt] = cl[rt<<1] + cl[rt<<1|1] ; } void creat(int_now) { cl[rt] = 0 ; if(l != r) { creat(lson); creat(rson); push_up(now); } else { cl[rt] = 0 ; k2[rt] = ++top ; } } void update(int x,int d,int_now) { if( l > x || r < x ) return ; if( l == r && l == x ) { cl[rt] += d ; return ; } update(x,d,lson); update(x,d,rson); push_up(now); } int query(int ll,int ans,int num,int_now) { if( r <= ll ) return 0; if( ll < l ) { if( ans + cl[rt] < num ) return ans + cl[rt] ; if(ans < num && ans + cl[rt] >= num && l == r ) { printf("%d\n", k2[rt] ); return ans + cl[rt] ; } if(ans < num && ans + cl[rt] >= num ) { if( ans + cl[rt<<1] >= num ) ans = query(ll,ans,num,lson); else ans = query(ll,ans+cl[rt<<1],num,rson); return ans ; } } else { if( ans < num ) ans = query(ll,ans,num,lson); if(ans < num) ans = query(ll,ans,num,rson); return ans; } } int main() { int m , i , n , l , r , x , temp , num ; while(scanf("%d", &m) != EOF) { top = 0 ; n = maxn ; creat(root); memset(k1,0,sizeof(k1)); while(m--) { scanf("%d", &temp); if( temp == 0 ) { scanf("%d", &x); k1[x]++ ; update(x,1,root); } else if( temp == 1 ) { scanf("%d", &x); if( k1[x] == 0 ) printf("No Elment!\n"); else { k1[x]-- ; update(x,-1,root); } } else { scanf("%d %d", &l, &num); x = query(l,0,num,root); if(x < num) printf("Not Find!\n"); } } } }
hdu2852--KiKi's K-Number(线段树,求第k个数),布布扣,bubuko.com
hdu2852--KiKi's K-Number(线段树,求第k个数)
标签:des style blog color java 使用 os io
原文地址:http://blog.csdn.net/winddreams/article/details/38459221