1484 种树 此版本是线性的,那么根据链表维护即可;

构建新点,点的左右分别是原整个区间的前驱及后继,再正常维护即可

注意两个版本的维护有所不同

第二个版本的维护直接将左右两点删除

1792 种树2  此版本是环

1484

#include<bits/stdc++.h>
#define ll long long
using namespace std;
const int N=;
struct node{
ll v;int id;
bool operator <(node a)const{
return v<a.v;}};
inline ll read(){
ll x=,f=;char ch=getchar();
while(!isdigit(ch)){if(ch=='-')f=-;ch=getchar();}
while(isdigit(ch)){x=(x<<)+(x<<)+(ch^);ch=getchar();}
return x*f;}
ll a[N],ans;
int l[N],r[N],vis[N];
priority_queue<node> q;
int n,k;
int main(){
n=read();k=read();
for(int i=;i<=n;i++){
a[i]=read();
q.push((node){a[i],i});
l[i]=i-;r[i]=i+;
}int len=n;
for(int i=;i<=k;i++){
while(!q.empty()&&vis[q.top().id]) q.pop();
if(q.empty()||q.top().v<)
break;
node u=q.top();q.pop();
ans+=u.v;
vis[u.id]=vis[l[u.id]]=vis[r[u.id]]=;
a[++len]=a[l[u.id]]+a[r[u.id]]-a[u.id];
l[len]=l[l[u.id]],r[len]=r[r[u.id]];
r[l[len]]=len;l[r[len]]=len;
q.push((node){a[len],len});
}printf("%lld\n",ans);
return ;
}

1792

#include<bits/stdc++.h>
#define M 200050
#define rep(i,x,y) for(register int i=x;i<=y;i++)
using namespace std;
inline int read(){
int x=,f=;char ch=getchar();
while(!isdigit(ch)){if(ch=='-')f=-;ch=getchar();}
while(isdigit(ch)){x=(x<<)+(x<<)+(ch^);ch=getchar();}
return x*f;}
struct node{
int v,id;
friend bool operator < (node x,node y){
return x.v < y.v;}
};priority_queue<node> q;
int n,m,ans,chose,r[M],l[M],a[M];
bool vis[M];
void change(int x){
vis[x]=;
r[l[x]]=r[x];
l[r[x]]=l[x];
r[x]=;l[x]=;}
int main(){
n=read(),m=read();
rep(i,,n) a[i]=read();
if((n>>)<m){
printf("Error!\n");return ;}
rep(i,,n-) r[i]=i+;r[n]=;
rep(i,,n) l[i]=i-;l[]=n;
rep(i,,n) q.push((node){a[i],i});
rep(i,,m){
while(vis[q.top().id]) q.pop() ;
node u=q.top();q.pop();
ans+=u.v;
int ll=l[u.id],rr=r[u.id];
a[u.id]=a[ll]+a[rr]-a[u.id];
change(ll);change(rr);
q.push((node){a[u.id],u.id});
}printf("%d\n",ans);return ;
}

luogu 1484\1792 种树 奇怪的贪心可反悔的更多相关文章

  1. Luogu 1484 种树

    Luogu 1792 算是双倍经验. 我们考虑对于一个点,我们要么选它,要么选它周围的两个点. 所以我们考虑用一个堆来维护,每次从堆顶取出最大值之后我们把它的权值记为:它左边的权值加上它右边的权值减去 ...

  2. [luogu]P2279 [HNOI2003]消防局的设立[贪心]

    [luogu]P2279 [HNOI2003]消防局的设立 题目描述 2020年,人类在火星上建立了一个庞大的基地群,总共有n个基地.起初为了节约材料,人类只修建了n-1条道路来连接这些基地,并且每两 ...

  3. Luogu P1084 疫情控制 | 二分答案 贪心

    题目链接 观察题目,答案明显具有单调性. 因为如果用$x$小时能够控制疫情,那么用$(x+1)$小时也一定能控制疫情. 由此想到二分答案,将问题转换为判断用$x$小时是否能控制疫情. 对于那些在$x$ ...

  4. luogu 1066 引水入城(bfs+贪心)

    90分,有一个点TLE.... 首先可以证明一个东西,如果从上面一排的某个点bfs一次到最下面一排的饮水点不是一个区间的话,那么最后一定所有饮水点不会被覆盖完的. 证明考虑反证法. 所以从上面一排的每 ...

  5. 刷题向》关于一道奇怪的贪心(田忌赛马)BZOJ1034(NORMAL-)

    这道题一看就是一道贪心,比较简单,但是越容易的题考试的时候越容易错... 没什么好说的,一遍SORT之后,直接强行田忌赛艇(滑稽脸)就好啦. 注意在对比大小的时候不仅要从前还要从后同时,不过这两个情况 ...

  6. luogu p3918[国家集训队]特技飞行 贪心

    开始没看出来是贪心,一度以为是动态规划,还是太弱了呀-.. 不难分析出,两个相同的飞行动作之间夹一个相同的动作是多余的,所以就贪心一下,按Ci从大到小排序,依次加到左右两端点,知道加不了为止. 代码: ...

  7. [luogu] P4155 [SCOI2015]国旗计划(贪心)

    P4155 [SCOI2015]国旗计划 题目描述 A 国正在开展一项伟大的计划 -- 国旗计划.这项计划的内容是边防战士手举国旗环绕边境线奔袭一圈.这项计划需要多名边防战士以接力的形式共同完成,为此 ...

  8. [luogu] P3294 [SCOI2016]背单词 (贪心)

    题目描述 Lweb 面对如山的英语单词,陷入了深深的沉思,"我怎么样才能快点学完,然后去玩三国杀呢?".这时候睿智的凤老师从远处飘来,他送给了 Lweb 一本计划册和一大缸泡椒,他 ...

  9. Luogu P2114_[NOI2014]起床困难综合症 贪心

    思路:按位贪心. 提交:1次 题解: 可以先处理出对于全$0$串和全$1$串最后每一位的结果.(每一位 从 $0$ $or$ $1$ 变成 $0$ $or$ $1$) 对于每一位,若不能变成$1$,则 ...

随机推荐

  1. luogu1484 种树 (优先队列)

    我每次都想选那个最大的.或者是它旁边的两个一起选,如果这两个一起选会大于那个最大的的话 那我就先把那个最大的选了,再提供一个反悔的选项(类似于网络流的思路?),就是我可以再把种的树换成它旁边那两个,也 ...

  2. [HNOI2010]物品调度

    题目描述 现在找工作不容易,Lostmonkey费了好大劲才得到fsk公司基层流水线操作员的职位.流水线上有n个位置,从0到n-1依次编号,一开始0号位置空,其它的位置i上有编号为i的盒子.Lostm ...

  3. eureka集群基于DNS配置方式

    https://www.cnblogs.com/relinson/p/eureka_ha_use_dns.html   最近在研究spring cloud eureka集群配置的时候碰到问题:多台eu ...

  4. pagehelper 使用

    MySQL对分页的支持 简单来说MySQL对分页的支持是通过limit子句.请看下面的例子. limit关键字的用法是 LIMIT [offset,] rows offset是相对于首行的偏移量(首行 ...

  5. 【洛谷P2860】冗余路径

    题目大意:给定一个 N 个点,M 条边组成的无向图,求至少在图中加入几条边才能使得整个图没有割边. 题解:求出该无向图的所有边双联通分量,每个边双联通分量可以理解成无向图的一个极大环,对该无向图进行缩 ...

  6. Django 异步化库celery和定时任务

    首先要了解Django其实是个同步框架,那么多个用户发送请求时就会发生排队的情况上一个用户的请求完成后在进行下一个,这样会对影响用户体验,所有就要用到异步方法来解决. 首先我们要安装celery库 p ...

  7. 数据库之sql语句汇总20180616

    /*******************************************************************************************/ 一.SQL简 ...

  8. python enumarate方法的使用

    '''enumerate() 函数用于将一个可遍历的数据对象(如列表.元组或字符串)组合为一个索引序列,同时列出数据和数据下标,一般用在 for 循环当中.'''

  9. C 线程学习记录

    "互斥锁"(Mutual exclusion,缩写 Mutex),防止多个线程同时读写某一块内存区域. 这时的解决方法,就是在门口挂n把钥匙.进去的人就取一把钥匙,出来时再把钥匙挂 ...

  10. Windows 查看端口占用情况

    今天打算运行一下当年的毕业设计,结果启动ActiveMQ的时候,发现报错 原来是端口占用了.在Windows上怎样看呢? Ctrl+Alt+Del 调出任务管理器 再找到资源监视器 原来是依赖于Erl ...