[洛谷1533] 可憐的狗狗

題目背景

小卡因爲公務須要出差,將新家中的狗狗們託付給朋友嘉嘉,可是嘉嘉是一個很懶的人,他纔沒那麼多時間幫小卡喂狗狗。ui

題目描述

小卡家有N只狗,因爲品種、年齡不一樣,每一隻狗都有一個不一樣的漂亮值。漂亮值與漂亮的程度成反比(漂亮值越低越漂亮),吃飯時,狗狗們會按順序站成一排等着主人給食物。spa

但是嘉嘉真的很懶,他纔不願喂這麼多狗呢,這多浪費時間啊,因而他每次就只給第i只到第j只狗中第k漂亮的狗狗餵食(好狠心的人啊)。並且爲了保證某一隻狗狗不會被喂太屢次,他喂的每一個區間(i,j)不互相包含。code

輸入輸出格式

輸入格式:

第一行輸入兩個數n,m,你能夠假設n<300001 而且 m<50001;m表示他餵了m次。blog

第二行n個整數,表示第i只狗的漂亮值爲ai。it

接下來m行,每行3個整數i,j,k表示此次餵食喂第i到第j只狗中第k漂亮的狗的漂亮值。io

輸出格式:

M行,每行一個整數,表示每一次喂的那隻狗漂亮值爲多少。class

輸入輸出樣例

輸入樣例#1: 複製
7 2
1 5 2 6 3 7 4
1 5 3
2 7 1
輸出樣例#1: 複製
3
2

思路

這個題出題人的意圖是卡主席樹的空間,卡平衡樹的常數,,,而後我平衡樹掛的比較慘,主席樹卡過了;sort

正解就是離線跑權值線段樹;di

代碼實現

 1 #include<cstdio>
 2 #include<algorithm>
 3 using namespace std;
 4 const int maxn=3e5+10;
 5 int n,k,sz,ts;
 6 int a,b,c;
 7 int s[maxn],hs[maxn],tt[maxn];
 8 struct tree{int s,mid,lp,rp;}t[maxn*25];
 9 void build(int l,int r,int k){
10     t[k].mid=l+r>>1;
11     if(l==r) return;
12     t[k].lp=++ts,t[k].rp=++ts;
13     build(l,t[k].mid,t[k].lp);
14     build(t[k].mid+1,r,t[k].rp);
15 }
16 void put(int l,int r,int k,int nk,int p){
17     t[nk]=(tree){t[k].s+1,t[k].mid};
18     if(l==r) return;
19     if(p<=t[nk].mid){
20         t[nk].lp=++ts,t[nk].rp=t[k].rp;
21         put(l,t[nk].mid,t[k].lp,t[nk].lp,p);
22     }
23     else{
24         t[nk].rp=++ts,t[nk].lp=t[k].lp;
25         put(t[nk].mid+1,r,t[k].rp,t[nk].rp,p);
26     }
27 }
28 int search(int k,int nk,int v){
29     if((t[k].lp==0)&&(t[k].rp==0)) return t[k].mid;
30     int w=t[t[nk].lp].s-t[t[k].lp].s;
31     if(v<=w) return search(t[k].lp,t[nk].lp,v);
32     else return search(t[k].rp,t[nk].rp,v-w);
33 }
34 int main(){
35     scanf("%d%d",&n,&k);
36     for(int i=1;i<=n;i++){
37         scanf("%d",&s[i]);
38         hs[i]=s[i];
39     }
40     sort(hs+1,hs+n+1);
41     sz=unique(hs+1,hs+n+1)-hs-1;
42     build(1,sz,tt[0]);
43     for(int i=1;i<=n;i++){
44         int pos=lower_bound(hs+1,hs+sz+1,s[i])-hs;
45         tt[i]=++ts;
46         put(1,sz,tt[i-1],tt[i],pos);
47     }
48     for(int i=1;i<=k;i++){
49         scanf("%d%d%d",&a,&b,&c);
50         printf("%d\n",hs[search(tt[a-1],tt[b],c)]);
51     }
52     return 0;
53 }
相關文章
相關標籤/搜索