小卡由於公務需要出差,將新家中的狗狗們託付給朋友嘉嘉,但是嘉嘉是乙個很懶的人,他才沒那麼多時間幫小卡餵狗狗。
小卡家有n隻狗,由於品種、年齡不同,每乙隻狗都有乙個不同的漂亮值。漂亮值與漂亮的程度成反比(漂亮值越低越漂亮),吃飯時,狗狗們會按順序站成一排等著主人給食物。
可是嘉嘉真的很懶,他才不肯喂這麼多狗呢,這多浪費時間啊,於是他每次就只給第i只到第j只狗中第k漂亮的狗狗餵食(好狠心的人啊)。而且為了保證某乙隻狗狗不會被喂太多次,他喂的每個區間(i,j)不互相包含。
輸入格式:
第一行輸入兩個數n,m,你可以假設n<300001 並且 m<50001;m表示他喂了m次。
第二行n個整數,表示第i只狗的漂亮值為ai。
接下來m行,每行3個整數i,j,k表示這次餵食喂第i到第j只狗中第k漂亮的狗的漂亮值。
輸出格式:
m行,每行乙個整數,表示每一次喂的那只狗漂亮值為多少。
輸入樣例#1:
7 21 5 2 6 3 7 4
1 5 3
2 7 1
輸出樣例#1:
32
solution:
本題我要吐槽洛谷資料~~
(我的鍋啊~~!我算錯複雜度了,我的這個方法複雜度是$o(nlogn)$,因為本題題面中說道區間互不包含)
碼了乙個莫隊+權值線段樹維護,時間複雜度$o(n\sqrtlogn)$(錯了,是$o(nlogn)$),結果$ac$還進了最優解第一頁。
首先就是常規的莫隊離線,記錄區間,排序。
對原數離散化,再構建權值線段樹,每次維護乙個數的增減,查詢整個區間第$k$大,記錄$ans$就$ok$了。
**:
#include#define il inline#define ll long long
#define lson l,m,rt<<1
#define rson m+1,r,rt<<1|1
using
namespace
std;
const
int n=300005
;int tr[n<<2
],n,m,pos[n],a[n],ans[n];
struct
nodeq[n];
struct
numm
}nm[n];
il bool cmp(node a,node b)
il int
gi()
il void pushup(int rt)
il void update(int k,int c,int l,int r,int
rt) tr[rt]+=c;
int m=l+r>>1
;
if(k<=m)update(k,c,lson);
else
update(k,c,rson);
pushup(rt);
}il
int query(int k,int l,int r,int
rt)int
main()
for(int i=1;i<=m;i++)printf("
%d\n
",ans[i]);
return0;
}
P1533 可憐的狗狗
終於做了乙個簡單題,233 先對區間拍個序 因為他說所有區間互不包含 所以排序之後可以雙指標l,r指呀指 容易得到 這樣每個值最多插入刪除一邊 一次操作logn 總複雜度nlogn include define for i,a,b for int i a i b i using namespace ...
洛谷 P1533 可憐的狗狗 題解
題目鏈結 這題很多做法都可以過,這裡用的是離線 平衡樹treap 題目中 給出的區間不互相包含,是離線操作的乙個重要條件 我們將給出的區間按左端點從小到大排序,當左端點相同時,按右端點從小到大排序,滿足區間訪問的元素位置遞增 如果有區間互相包含就無法實現 對於每乙個區間 li ri l i,r i ...
洛谷 1533 可憐的狗狗
小卡家有n隻狗,由於品種 年齡不同,每乙隻狗都有乙個不同的漂亮值。漂亮值與漂亮的程度成反比 漂亮值越低越漂亮 吃飯時,狗狗們會按順序站成一排等著主人給食物。可是嘉嘉真的很懶,他才不肯喂這麼多狗呢,這多浪費時間啊,於是他每次就只給第i只到第j只狗中第k漂亮的狗狗餵食 好狠心的人啊 而且為了保證某乙隻狗...