hdu 2852 求第k大數值

2021-07-04 16:50:55 字數 1796 閱讀 2553

題意:設計一種資料結構,該資料結構有以下三種操作:

1:0 a,新增乙個數字a;

2:1 a,刪除乙個數字a,若該數字不存在,輸出"no elment!";

3:2  a k,輸出比a大的第k個數字,若不存在,輸出"not find!"。

分析:典型的用樹狀陣列求第k大數字,對應操作:

1 :add(a,1);

2:add(a,-1);

3:只需先求出小於等於a的數字有多少個,若有x個,則問題就變成了求第x+k的數字是多少,二分找出就行了。

**如下:

#include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #define ll long long

#define ull unsigned long long

#define sz(x) (int)x.size()

#define mp(a, b) make_pair(a, b)

#define ms(arr, num) memset(arr, num, sizeof(arr))

#define pb push_back

#define f first

#define s second

#define rop freopen("input.txt", "r", stdin);

#define mid(a, b) (a + ((b - a) >> 1))

#define lson l,mid,rt<<1

#define rson mid+1,r,rt<<1|1

#define lrt rt << 1

#define rrt rt << 1|1

#define root 1,n,1

#define bitcount(x) __builtin_popcount(x)

#define bitcountll(x) __builtin_popcountll(x)

#define leftpos(x) 32 - __builtin_clz(x) - 1

#define leftposll(x) 64 - __builtin_clzll(x) - 1

const double pi = acos(-1.0);

const int inf = 1e7;

using namespace std;

const double eps = 1e-5;

const int maxn = 300 + 10;

const int mod = 1000007;

const double m=1e-8;

const int max=100010;

typedef pairpii;

typedef pairpis;

const int d[4][2]=,,,};

int n,m,c[max],mx,vis[max] ;

int lowbit(int t)

int sum(int end)

return ans;

}void add(int pos,int num)

}int bin(int x)

return l;

}int main()

{ int i,j;

while(~scanf("%d",&n))

{ms(c,0);

ms(vis,0);

for (i=0;i

HDU 2852 樹狀陣列 無序第K小

題目大意 操作 往盒子裡放乙個數。操作 從盒子裡扔掉乙個數。操作 查詢盒子裡大於a的第k小數。解題思路 由於模型是盒子,而不是序列,所以可以用樹狀陣列的順序維護 逆序數思想。對應的樹狀陣列solution add val,1 類似維護逆序數的方法,對應位置上計數 1。注意add的while範圍要寫成...

求第K大數

問題 a 求第k大數 時間限制 1 sec 記憶體限制 128 mb 提交 483 解決 172 提交 狀態 討論版 命題人 外部匯入 題目描述 求第k大的數 kth.pas c cpp 給定乙個長度為n 1 n 1,000,000 的無序正整數序列,以及另乙個數k 1 k 1,000,000 關於...

求第k大數

quad 求乙個序列裡面第k大的數,用partition可以再o n o n o n 時間複雜度內求解 對數a left,right 進行一次partition操作後,主元pivot左側元素都小於它,右側都大於它。設 pivot索引為p,則pivot是第p left 1大元素。求第k大時,若k p ...