這題最重要的結論就是x=i時的選擇必定包含x=i-1時的所有點。。。這樣我們記錄當前選擇的最遠距離,在其左右分別維護乙個堆,左邊的不算距離,右邊的算距離(要減去當前最遠距離),每次從兩堆頂中選擇最優解,如果更新了最遠距離,就要將右邊堆中這個距離左邊的點都拿出來減去距離扔到左堆裡。重複n次即可。
這個時候再次體現了萬惡的stl資料封裝有多坑,要想直接將某一編號的節點從堆中刪除,只能使用帶有pos的手寫堆。
自己的**:
#include
#define gm 100001
using
namespace
std;
typedef
unsigned
long
long ull;
int n;
int s[gm],a[gm];
ull ans[gm]={};
int lst=0;
struct zh
;void add(int k,const zh &v)
else
break;
}h[x]=v;
p[v.no]=x;
}void del(int k,int popoqqq)
h[x]=v;
p[v.no]=x;
}#define top(k) figr[k]?hp[k][1]:(zh)
int main()
for(int i=1;i<=n;i++) scanf("%d",&a[i]);
for(int i=1;i<=n;i++) add(1,(zh));
for(int i=1;i<=n;i++)
ans[i]+=s2.val-s[lst];
lst=s2.no;
del(1,s2.no);
}else
}for(int i=1;i<=n;i++)
printf("%llu\n",ans[i]);
return
0;}
推銷員(優先佇列 貪心)
2015 noip 普及組 題目描述 阿明是一名推銷員,他奉命到螺絲街推銷他們公司的產品。螺絲街是一條死胡同,出口與入口是同乙個,街道的一側是圍牆,另一側是住戶。螺絲街一共有n家住戶,第i家住戶到入口的距離為si公尺。由於同一棟房子裡可以有多家住戶,所以可能有多家住戶與入口的距離相等。阿明會從入口進...
luogu P2672 推銷員 貪心
題目描述 阿明是一名推銷員,他奉命到螺絲街推銷他們公司的產品。螺絲街是一條死胡同,出口與入口是同乙個,街道的一側是圍牆,另一側是住戶。螺絲街一共有n家住戶,第ii家住戶到入口的距離為si公尺。由於同一棟房子裡可以有多家住戶,所以可能有多家住戶與入口的距離相等。阿明會從入口進入,依次向螺絲街的x家住戶...
普及 NOIP 2015 推銷員 貪心
noip 2015 推銷員 題意 思路 貪心,首先按每戶人家的推銷疲勞度從大到小排序,考慮選定一組,走路帶來的疲勞度是定的,就是最遠那個 2.所以對於每個答案 max sum i mx 2 sum i 1 h i 其中sum是排序後對推銷疲勞度做的字首和,而h i 儲存 從 i 到 n中,最大的 2...