1. 程式人生 > >洛谷P1484種樹(堆+較難貪心)

洛谷P1484種樹(堆+較難貪心)

stream 不可 最大 tps bsp -- ++ per .org

題目鏈接:https://www.luogu.org/problemnew/show/P1484

題意很清晰很好懂,做起來就難了。

數據範圍小的化可搜索可dp,

But數據這麽大是不可能的了,較難貪心(a[i]或左加右只選一個最大的)+堆(每次取出最大的)

 1 #include <iostream>
 2 #include <algorithm>
 3 #include <queue>
 4 using namespace std;
 5 typedef long long ll;
 6 const int maxn=1e6+5;
 7 ll a[maxn];
8 int vis[maxn]; 9 int l[maxn],r[maxn]; 10 int n,k; 11 int ans; 12 struct px 13 { 14 ll v; 15 int id; 16 bool operator <(const px &a)const 17 { 18 return v<a.v; 19 } 20 }t; 21 priority_queue<px> que; 22 23 int main() 24 { 25 ios::sync_with_stdio(false
); cin.tie(0); 26 27 cin>>n>>k; 28 for(int i=1;i<=n;i++) 29 { 30 cin>>t.v; 31 32 a[i]=t.v; 33 t.id=i; 34 l[i]=i-1; 35 r[i]=i+1; 36 que.push(t); 37 } 38 r[0]=1;l[n+1]=n; 39 40 while(k--) 41 {
42 while(vis[que.top().id]) que.pop(); 43 44 t=que.top(); que.pop(); 45 if(t.v<0)break; 46 47 ans+=t.v; 48 int x=t.id; 49 a[x]=a[l[x]]+a[r[x]]-a[x]; 50 t.v=a[x];//左右代替為了下次更新 51 52 vis[l[x]]=vis[r[x]]=1;//訪問過 53 54 l[x]=l[l[x]];r[l[x]]=x;//修改鏈表左右指向 55 r[x]=r[r[x]];l[r[x]]=x; 56 que.push(t); 57 } 58 59 cout<<ans<<endl; 60 61 return 0; 62 }

完。

洛谷P1484種樹(堆+較難貪心)