洛谷P1801 黑匣子

2022-05-21 11:36:09 字數 834 閱讀 9443

long long就果然還是就該用cout,沒有lld的ll留下了悔恨的眼淚……

鏈結一放,要看什麼對頂堆的走開走開,我只會離散化加權值樹狀陣列……

​ 首先吧,這個詢問依次遞增就友善的一批,然後詢問某刻第k位,我們用權值樹狀陣列。首先如果i有,那麼在陣列中下標為i的位置就打成1,沒有就是0,樹狀陣列裡面存的是字首和。那麼詢問某乙個點的字首和就等效於當前陣列中小於等於它的個數。

​ 那麼二分一下,畢竟在樹狀陣列中字首和單調遞增……然後就能快速找到想要的點。很慢,但是能過。

​ 但是題目每個的值好像有點大?離散一下,教你做人。sort 一手,以下標代表這個數,在樹狀陣列中是等效的。

還有一些細節看**吧……沒有時間了要睡了

#include#include#include#include#includeusing namespace std;

#define lowbit(x) ((x)&(-(x)))

const int maxn=3000005;

int n,m,to[maxn];

struct fa[maxn];

bool cmp1(f a,f b)

printf("%d\n",a[to[ans]].h);

}int main()

sort(a+1,a+n+1,cmp1);

for(int i=1;i<=n;++i)

sort(a+1,a+n+1,cmp2);

int cnt=1,j;

scanf("%d",&j);

for(int i=1;i<=n;++i)

} return 0;

}

洛谷P1801 黑匣子

題目傳送門 分析 這題和另外乙個題目中位數非常相似,有興趣可以先看看,比這一題簡單。首先暴力模擬還是別想了,估計30 的資料都有點懸。正解應該是用二叉堆。但是如果用乙個堆當然不方便,所以建兩個堆,乙個大根堆,乙個小根堆,每次只要出現詢問操作,就把小根堆的堆頂丟進大根堆中維護,然後輸出就可以了,但是要...

洛谷P1801 黑匣子

題目鏈結 看到題解中 維護兩個堆 突然想到了這道題的解法 維護兩個堆 大根堆h1,小根堆h2 大根堆裡的是最小的i個值,小根堆裡是剩下的值 每add乙個值時 插入到小根堆中,再比較小根堆的最小值與大根堆的最大值 若h2.top 將兩個元素取出,換一下再放進去 需要get時 將h2.top 取出,放進...

洛谷 P1801 黑匣子

好像很久沒有更過部落格了,因為博主這幾周很忙。其實是在搞頹。題意很難懂,所以就不重複了。其實是懶。一眼看上去這是個 splay 裸題,直接插入乙個數,查詢區間第 k 大,但是這樣太不優美了,配不上 noi導刊 這幾個字,所以這題肯定有更優美的做法。注意到這道題有乙個很優美的性質,k 是遞增的,然後我...