luogu P1484 种树

这个题的解法我是在河南听过的; 但是尴尬; 没好好听,所以忘了; 大致意思就是:

选k个数,要求选的任意两个数不能相邻;
大致是一种抵消的反悔方式;

假设我们当前选了a[i],那么如果我们下次选了a[i-1] and a[i+1], 那么他们的代价差是:a[i-1]+a[i+1]-a[i]; 所以我们把 a[i] = a[i-1]+a[i+1]-a[i]; then a[i-1] and a[i+1] delele , 这样如果我们反悔,想要选a[i]’s(both sides); 就等价于再选一次a[i]; 所以放回a[i]; 用堆维护; 然后要注意 delele 的方式;


主要部分

  for(R II i=1;i<=n;i++) 
    {
        Q.push((node) {i,a[i]});
        l[i]=i-1; r[i]=i+1;
    }

    while (k--) {
        while (!Q.empty() && had[Q.top().wei]) Q.pop();
        if(Q.empty() || Q.top().x<0) break ;
        R II wei=Q.top().wei;
        R II x=Q.top().x;
        Q.pop();
        ans+=x;
        a[wei]=a[l[wei]]+a[r[wei]]-a[wei];
        had[l[wei]]=had[r[wei]]=1;
        l[wei]=l[l[wei]]; r[wei]=r[r[wei]];
        l[r[wei]]=wei; r[l[wei]]=wei;
        // 记录两侧来实现删;
        Q.push((node) {wei,a[wei]});
    }
阅读更多
版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/pretend_fal/article/details/78431053
文章标签:
个人分类: Tarjan luogu 贪心
上一篇luogu P3119 [USACO15JAN]草鉴定Grass Cownoisseur
下一篇luogu P3202 [HNOI2009]通往城堡之路
想对作者说点什么? 我来说一句

没有更多推荐了,返回首页

关闭
关闭
关闭