驢蛋蛋在愉快地與stl玩耍
突然間小a跳了出來對驢蛋蛋說,看你與stl玩的很開心啊,那我給你乙個大小為n的vector,這個vector上每個位置上是乙個set,
每次我會在閉區間 [l,r] 中的每個set裡插入乙個數c,或者詢問 [l,r] 區間所有set裡所有數拿下來排序之後的嚴格第k小,現在你還開心嗎,紅紅火火恍恍惚惚韓寒會畫紅槐花!!!!
小a走了,留下驢蛋蛋乙個人外加乙個長度為 n 的vector>在風中凌亂,你能幫驢蛋蛋解除凌亂嗎?
根據小a的 c++2.33 標準vector可以被視作乙個陣列,下標從 1 開始,大小不得超過65536
set是乙個集合,其中的數不得超過 10000 並且會被自動去重
小a最多會進行q 次(不超過 65536)完全符合 c++2.33標準的操作,但如果出現詢問時[l,r]區間裡不足k個數的情況,你只需要對小a回答−1就好了
傳說中的毒瘤題?線段樹+永久延遲標記+二分+bitset
空間不夠,被逼寫了一次非結構體線段樹,這樣只用開兩倍了。
bitset以前寫到過一次,stl黑科技。bitset的第i位為1表示i這個數在這個結點的集合裡。
二分之前先查詢一次,把查詢區間的數都染成1。
為助於理解,把pre陣列列印出來了,二分的原理應該也很明顯了吧?
1000000000011000000000
11100000000
11110000000
11111000000
11111100000
11111110000
11111111000
11111111100
11111111110
11111111111
#includeusingnamespace
std;
#define n 10010
#define m 65540
#define lc (p<<1)
#define rc (p<<1|1)
struct
t[m*2
];int
n,q,k,ql,qr,op,cnt;
bitset
ans[m],pre[n],tmp;
inline
void update(int p,int l,int
r)
int mid=l+r>>1
;
if(ql<=mid)update(lc,l,mid);
if(qr>mid) update(rc,mid+1
,r);
}inline
void query(int p,int l,int
r) ans[cnt]|=t[p].lazy;
int mid=l+r>>1
;
if(ql<=mid)query(lc,l,mid);
if(qr>mid) query(rc,mid+1
,r);
}inline
int check(int
mid)
inline
void
solve()
cnt++;query(1,1
,n);
if(ans[cnt].count()"
-1");return
;}
int l=0,r=n-2
,ans,mid;
while(l<=r)
printf(
"%d\n
",ans);
}int
main()
return0;
}
51nod 1981 如何愉快地與STL玩耍
驢蛋蛋在愉快地與stl玩耍 突然間小a跳了出來對驢蛋蛋說,看你與stl玩的很開心啊,那我給你乙個大小為n的vector,這個vector上每個位置上是乙個set,每次我會在閉區間 l,r 中的每個set裡插入乙個數c,或者詢問 l,r 區間所有set裡所有數拿下來排序之後的嚴格第 k 小,現在你還開...
51nod 貪心入門
有若干個活動,第i個開始時間和結束時間是 si,fi 活動之間不能交疊,要把活動都安排完,至少需要幾個教室?分析 能否按照之一問題的解法,每個教室安排盡可能多的活動,即按結束時間排序,再貪心選擇不衝突的活動,安排乙個教室之後,剩餘的活動再分配乙個教室,繼續貪心選擇 反例 a 1,2 b 1,4 c ...
51nod 迷宮問題
1459 迷宮遊戲 基準時間限制 1 秒 空間限制 131072 kb 分值 0 難度 基礎題 你來到乙個迷宮前。該迷宮由若干個房間組成,每個房間都有乙個得分,第一次進入這個房間,你就可以得到這個分數。還有若干雙向道路鏈結這些房間,你沿著這些道路從乙個房間走到另外乙個房間需要一些時間。遊戲規定了你的...