題意:設計一種資料結構,該資料結構有以下三種操作:
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 ...