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 是遞增的,然後我...