小卡家有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隻狗,由於品種 年齡不同,每乙隻狗都有乙個不同的漂亮值。漂亮值與漂亮的程度成反比 漂亮值越低越漂亮 吃飯時,狗狗們會按順序站成一排等著主人給食物。可是嘉嘉真的很懶,他才不肯喂這麼多狗...