洛谷 1533 可憐的狗狗

2021-08-08 10:59:48 字數 1106 閱讀 5606

小卡家有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行,每行乙個整數,表示每一次喂的那只狗漂亮值為多少。\

題解:這道題是一段區間問題,其實可以將詢問儲存下來,然後將詢問按照起點和終點作為第一和第二關鍵字,排序,然後一段一段來處理,當我處理到第i段時,i段起點之前的區間就沒有用了,所以就相當於求區間第k小值,用樹狀陣列維護,用二分尋找答案。

#include#include#include#includeusing namespace std;

int a[300010];//點的個數

struct node

q[51000];//詢問

int ans[51000];//存結果

int i,j,n,m;

int t[301000];//樹狀陣列

int h[301000];

bool cmp(node aa,node bb)//關鍵字1:左端 關鍵字2:右端

return sum;

}int main()

sort(h+1,h+n+1);//h:排好序的陣列

for (i=1;i<=m;i++)

int he=1;int ta=0;

sort(q+1,q+m+1,cmp);//排序

for (i=1;i<=m;i++)

ans[q[i].d]=h[l];

} for (i=1;i<=m;i++) printf("%d\n",ans[i]);

return 0;

}

洛谷 P1533 可憐的狗狗 題解

題目鏈結 這題很多做法都可以過,這裡用的是離線 平衡樹treap 題目中 給出的區間不互相包含,是離線操作的乙個重要條件 我們將給出的區間按左端點從小到大排序,當左端點相同時,按右端點從小到大排序,滿足區間訪問的元素位置遞增 如果有區間互相包含就無法實現 對於每乙個區間 li ri l i,r i ...

P1533 可憐的狗狗

終於做了乙個簡單題,233 先對區間拍個序 因為他說所有區間互不包含 所以排序之後可以雙指標l,r指呀指 容易得到 這樣每個值最多插入刪除一邊 一次操作logn 總複雜度nlogn include define for i,a,b for int i a i b i using namespace ...

P1533 可憐的狗狗

小卡由於公務需要出差,將新家中的狗狗們託付給朋友嘉嘉,但是嘉嘉是乙個很懶的人,他才沒那麼多時間幫小卡餵狗狗。小卡家有n隻狗,由於品種 年齡不同,每乙隻狗都有乙個不同的漂亮值。漂亮值與漂亮的程度成反比 漂亮值越低越漂亮 吃飯時,狗狗們會按順序站成一排等著主人給食物。可是嘉嘉真的很懶,他才不肯喂這麼多狗...