Guard Duty (medium) Codeforces - 958E2 || (bzoj 2151||洛谷P1792) 种树 || 编译优化
https://codeforces.com/contest/958/problem/E2
首先求出N个时刻的N-1个间隔长度,问题就相当于在这些间隔中选K个数,相邻两个不能同时选,要求和最小
方法1:
一个K^2的做法,有一定技巧
https://www.cnblogs.com/void-f/p/8867585.html
方法2:
是可撤销贪心的模板?
就是贪心的选权值最小的,但是在选完某一个位置i后把它前一个没有被删的位置pre[i]和后一个没有被删的位置nxt[i]删掉,将i的权值变为(-(i原来的权值)+(pre[i]原来的权值)+(nxt[i]原来的权值)),表示如果再选一次这个位置,就相当于不选i,改为选pre[i]和nxt[i]
这样子搞是因为:由于每次是贪心的选权值最小的i,则单独选pre[i]和nxt[i]中任意一个都不可能比选i更优,只有当同时选pre[i]和nxt[i]时可能比选i要优
细节并不能搞清楚...然而,这个算法运行得很正确
有一个要注意的:如果选出的是最靠边上的i,那么显然i一定在最优解中(因为改为选i旁边的一定不会更优),直接把自身和与其相邻的删掉即可
可以搞一个链表+堆维护这个东西
错误记录:链表写错
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<vector>
#include<set>
using namespace std;
#define fi first
#define se second
#define mp make_pair
#define pb push_back
typedef long long ll;
typedef unsigned long long ull;
typedef pair<int,int> pii;
struct E
{
int nxt,pre,d;
}e[];
int a[];
int K,n;
set<pii> s;
set<pii>::iterator i1;
int an;
int main()
{
int i,x,y;pii t;
scanf("%d%d",&K,&n);
for(i=;i<=n;i++) scanf("%d",&a[i]);
sort(a+,a+n+);
for(i=;i<n;i++) a[i]=a[i+]-a[i];
n--;
for(i=;i<=n;i++)
{
e[i].nxt=i+;
e[i].pre=i-;
e[i].d=a[i];
s.insert(mp(e[i].d,i));
}
e[n].nxt=e[].pre=;
for(i=;i<=K;i++)
{
i1=s.begin();
t=*i1;s.erase(i1);
x=t.fi;y=t.se;
an+=x;
x=-x;
if(!e[y].pre||!e[y].nxt)
{
if(e[y].pre)
{
s.erase(mp(e[e[y].pre].d,e[y].pre));
e[e[e[y].pre].pre].nxt=;
}
if(e[y].nxt)
{
s.erase(mp(e[e[y].nxt].d,e[y].nxt));
e[e[e[y].nxt].nxt].pre=;
}
}
else
{
x+=e[e[y].pre].d;x+=e[e[y].nxt].d;
s.erase(mp(e[e[y].pre].d,e[y].pre));
s.erase(mp(e[e[y].nxt].d,e[y].nxt));
e[y].pre=e[e[y].pre].pre;e[e[y].pre].nxt=y;
e[y].nxt=e[e[y].nxt].nxt;e[e[y].nxt].pre=y;
e[y].d=x;
s.insert(mp(e[y].d,y));
}
}
printf("%d",an);
return ;
}
方法3:
为什么说是什么带权二分?以后再说
以下题改一下以上代码读入中n和K的顺序就可以A掉了??
https://www.lydsy.com/JudgeOnline/problem.php?id=1150
bzoj 2151 种树
https://www.lydsy.com/JudgeOnline/problem.php?id=2151
洛谷P1792
https://www.luogu.org/problemnew/show/P1792
(另有一样的题(编译优化):http://210.33.19.103/contest/982/problem/5)
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<vector>
#include<set>
using namespace std;
#define fi first
#define se second
#define mp make_pair
#define pb push_back
typedef long long ll;
typedef unsigned long long ull;
typedef pair<ll,int> pli;
struct E
{
int nxt,pre;ll d;
}e[];
int a[];
int n,m;
set<pli> s;
set<pli>::iterator i1;
ll an;
int main()
{
int i,y;ll x;pli t;
scanf("%d%d",&n,&m);
if(m>n/)
{
puts("Error!");
return ;
}
for(i=;i<=n;i++) scanf("%d",&a[i]);
for(i=;i<=n;i++)
{
e[i].nxt=i+;
e[i].pre=i-;
e[i].d=a[i];
s.insert(mp(e[i].d,i));
}
e[n].nxt=;e[].pre=n;
for(i=;i<=m;i++)
{
i1=s.end();--i1;
t=*i1;s.erase(i1);
x=t.fi;y=t.se;
an+=x;
x=-x;
x+=e[e[y].pre].d;x+=e[e[y].nxt].d;
s.erase(mp(e[e[y].pre].d,e[y].pre));
s.erase(mp(e[e[y].nxt].d,e[y].nxt));
e[y].pre=e[e[y].pre].pre;e[e[y].pre].nxt=y;
e[y].nxt=e[e[y].nxt].nxt;e[e[y].nxt].pre=y;
e[y].d=x;
s.insert(mp(e[y].d,y));
}
printf("%lld",an);
return ;
}
Guard Duty (medium) Codeforces - 958E2 || (bzoj 2151||洛谷P1792) 种树 || 编译优化的更多相关文章
- [BZOJ 3039&洛谷P4147]玉蟾宫 题解(单调栈)
[BZOJ 3039&洛谷P4147]玉蟾宫 Description 有一天,小猫rainbow和freda来到了湘西张家界的天门山玉蟾宫,玉蟾宫宫主蓝兔盛情地款待了它们,并赐予它们一片土地. ...
- 洛谷P1484 种树&洛谷P3620 [APIO/CTSC 2007]数据备份 题解(堆+贪心)
洛谷P1484 种树&洛谷P3620 [APIO/CTSC 2007]数据备份 题解(堆+贪心) 标签:题解 阅读体验:https://zybuluo.com/Junlier/note/132 ...
- bzoj 4816: 洛谷 P3704: [SDOI2017]数字表格
洛谷很早以前就写过了,今天交到bzoj发现TLE了. 检查了一下发现自己复杂度是错的. 题目传送门:洛谷P3704. 题意简述: 求 \(\prod_{i=1}^{N}\prod_{j=1}^{M}F ...
- bzoj 1014: 洛谷 P4036: [JSOI2008]火星人
题目传送门:洛谷P4036. 题意简述: 有一个字符串,支持插入字符,修改字符. 每次需要查询两个后缀的LCP长度. 最终字符串长度\(\le 100,\!000\),修改和询问的总个数\(\le 1 ...
- bzoj 3680(洛谷1337) 吊打XXX——模拟退火
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=3680 https://www.luogu.org/problemnew/show/P1337 ...
- bzoj 4592(洛谷 4344) [Shoi2015]脑洞治疗仪——线段树上二分
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=4592 1操作就是用线段树来二分找到第一个有 k 个0的位置. 在洛谷上A了,与暴力和网上题解 ...
- bzoj 2005 & 洛谷 P1447 [ Noi 2010 ] 能量采集 —— 容斥 / 莫比乌斯反演
题目:bzoj 2005 https://www.lydsy.com/JudgeOnline/problem.php?id=2005 洛谷 P1447 https://www.luogu.org/ ...
- BZOJ 1901 洛谷 P2617 ZOJ 2112 Dynamic Rankings
以下时空限制来自zoj Time limit 10000 ms Memory limit 32768 kB OS Linux Source Online Contest of Christopher' ...
- BZOJ 2460 & 洛谷 P4570 [BJWC2011]元素 (线性基 贪心)
题目链接: 洛谷 BZOJ 题意 给定 \(n\) 个矿石,每个矿石有编号和魔力值两种属性,选择一些矿石,使得魔力值最大且编号的异或和不为 0. 思路 线性基 贪心 根据矿石的魔力值从大到小排序. 线 ...
随机推荐
- 脚踏实地学C#1-基元类型
基元类型:编译器直接支持的数据类型 基元类型直接映射到FCL类库上,如int 和Int32是等价的,只不过是int是c#提供的,Int32是FCL类库提供的. int只是Int32的别名 using ...
- XML简介——可扩展标记语言(Extensible Markup Language)
(What) XML是什么? XML指可扩展标记语言(Extensible Markup Language) 1. XML是一种标记语言,类似HTML. 2. XML具有自我描述性 3. XML ...
- Relative atomic mass
Relative atomic mass Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Oth ...
- SQL SERVER2008 打开脚本总是报“未能完成操作,存储空间不足”
使用用SQLCMD命令行. 1.快捷键:win+R 2.输入cmd,确定 3.输入命令:sqlcmd -S <数据库服务器名称> -i C:\<脚本文件路径>.sql 如图所 ...
- You Are the One
题意: 有n个人排队,第i个入场的人x的不愉快度是$D_x*(i-1)$,现在给你n个人在队伍中的位置, 你可以用一个栈让一个人后面的人先进入,问最小的不愉快度是多少. 解法: 考虑注意到用栈调整次序 ...
- Eclipse用Runnable JAR file方式打jar包,并用该jar包进行二次开发
目录: 1.eclipse创建Java项目(带jar包的) 2. eclipse用Export的Runnable JAR file方式打jar包(带jar包的) 打jar包 1)class2json1 ...
- sql语句之查询操作
语法顺序: select distinct 字段1,字段2,字段3 from 库.表 where 条件 group by 分组条件 having 过滤 # 执行顺序的话,到这步会返回运行select语 ...
- c/c++面试19-22----inline的那些事儿
19 为什么引入内联函数 a:宏定义为什么效率高 通常替代c语言中表达式形式的宏定义来解决程序函数调用问题,使用的是预处理器实现,没有参数压栈等到做. 缺点: (1) 仅仅进行简单的替换,不能进行参数 ...
- 《剑指offer》面试题7—用两个栈实现队列
题目:给出队列声明,要求实现AppendTail和DeleteHead函数. template <typename T>class CQueue{public: void AppendTa ...
- 设置a 标签打开新窗口新姿势
设置页面中的所有a标签都打开新窗口 1,在写的时候就加上target="_blank" 2,在页头<head></head>里加上 <base tar ...