zoukankan      html  css  js  c++  java
  • 洛谷P1792 [国家集训队]种树

    https://www.luogu.com.cn/problem/P1792

    把P1484的线性结构改为了环形结构
    P1484题解:https://www.cnblogs.com/TheRoadToTheGold/p/14629602.html

    原本就是双向链表,环形只需要连接首尾即可。
    注意特判无解,不然容易出现环形只剩一个的时候,左右都是自己导致错误答案;或者是环形只有2个,左右都是同一个,也容易出错。

    #include<cstdio>
    #include<queue>
    #include<iostream>
    
    using namespace std;
    
    #define N 200002
    
    int a[N];
    struct node
    {
    	int g;
    	bool operator < (node p) const
    	{
    		return a[g]<a[p.g];
    	}
    }e[N];
    priority_queue<node>q;
    
    bool tra[N];
    int l[N],r[N];
    
    int main()
    {
    //	freopen("data.txt","r",stdin);
    	int n,k;
    	scanf("%d%d",&n,&k);
    	for(int i=1;i<=n;++i)  scanf("%d",&a[i]);
    	if(n/2<k)
    	{
    		printf("Error!");
    		return 0;
    	}
    	l[1]=n;
    	for(int i=2;i<=n;++i) l[i]=i-1;
    	for(int i=1;i<n;++i) r[i]=i+1;
    	r[n]=1;
    	node now;
    	for(int i=1;i<=n;++i) 
    	{
    		now.g=i;	
    		q.push(now);
    	}
    	long long ans=0;
    	while(k && !q.empty())
    	{
    		now=q.top();
    		q.pop();
    		if(tra[now.g]) continue;
    		ans+=a[now.g];		
    		--k;
    		tra[l[now.g]]=true;
    		tra[r[now.g]]=true;
    		a[now.g]=a[l[now.g]]+a[r[now.g]]-a[now.g];
    		l[now.g]=l[l[now.g]];
    		r[l[now.g]]=now.g;
    		r[now.g]=r[r[now.g]];
    		l[r[now.g]]=now.g;
    		q.push(now);
    	}
    	printf("%d",ans);
    }
    
    作者:xxy
    本文版权归作者和博客园共有,转载请用链接,请勿原文转载,Thanks♪(・ω・)ノ。
  • 相关阅读:
    while练习题
    流程控制之for循环
    流程控制之while循环
    流程控制之if判断
    作业
    基本运算符
    输入输出
    基本数据类型
    变量part2
    JDBC中创建表
  • 原文地址:https://www.cnblogs.com/TheRoadToTheGold/p/14629621.html
Copyright © 2011-2022 走看看