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) 种树 || 编译优化的更多相关文章

  1. [BZOJ 3039&洛谷P4147]玉蟾宫 题解(单调栈)

    [BZOJ 3039&洛谷P4147]玉蟾宫 Description 有一天,小猫rainbow和freda来到了湘西张家界的天门山玉蟾宫,玉蟾宫宫主蓝兔盛情地款待了它们,并赐予它们一片土地. ...

  2. 洛谷P1484 种树&洛谷P3620 [APIO/CTSC 2007]数据备份 题解(堆+贪心)

    洛谷P1484 种树&洛谷P3620 [APIO/CTSC 2007]数据备份 题解(堆+贪心) 标签:题解 阅读体验:https://zybuluo.com/Junlier/note/132 ...

  3. bzoj 4816: 洛谷 P3704: [SDOI2017]数字表格

    洛谷很早以前就写过了,今天交到bzoj发现TLE了. 检查了一下发现自己复杂度是错的. 题目传送门:洛谷P3704. 题意简述: 求 \(\prod_{i=1}^{N}\prod_{j=1}^{M}F ...

  4. bzoj 1014: 洛谷 P4036: [JSOI2008]火星人

    题目传送门:洛谷P4036. 题意简述: 有一个字符串,支持插入字符,修改字符. 每次需要查询两个后缀的LCP长度. 最终字符串长度\(\le 100,\!000\),修改和询问的总个数\(\le 1 ...

  5. bzoj 3680(洛谷1337) 吊打XXX——模拟退火

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=3680 https://www.luogu.org/problemnew/show/P1337 ...

  6. bzoj 4592(洛谷 4344) [Shoi2015]脑洞治疗仪——线段树上二分

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=4592 1操作就是用线段树来二分找到第一个有 k 个0的位置. 在洛谷上A了,与暴力和网上题解 ...

  7. bzoj 2005 & 洛谷 P1447 [ Noi 2010 ] 能量采集 —— 容斥 / 莫比乌斯反演

    题目:bzoj 2005 https://www.lydsy.com/JudgeOnline/problem.php?id=2005   洛谷 P1447 https://www.luogu.org/ ...

  8. BZOJ 1901 洛谷 P2617 ZOJ 2112 Dynamic Rankings

    以下时空限制来自zoj Time limit 10000 ms Memory limit 32768 kB OS Linux Source Online Contest of Christopher' ...

  9. BZOJ 2460 & 洛谷 P4570 [BJWC2011]元素 (线性基 贪心)

    题目链接: 洛谷 BZOJ 题意 给定 \(n\) 个矿石,每个矿石有编号和魔力值两种属性,选择一些矿石,使得魔力值最大且编号的异或和不为 0. 思路 线性基 贪心 根据矿石的魔力值从大到小排序. 线 ...

随机推荐

  1. ImageIO 操作图片

    /** * 读取本地图片到另一个本地文件夹 * @throws IOException */ public void copeImageToOtherFolder() throws IOExcepti ...

  2. ArcGIS服务器的feature图层限制

    今天遇到了esri.layers.FeatureLayer发布一个宗地图层,里面有些数据未显示,导致数据显示不全,原来是服务中数据返回参数限制. ArcGIS的feature图层(在JavaScrip ...

  3. Codeforces Round #222 (Div. 1) Maze —— dfs(连通块)

    题目链接:http://codeforces.com/problemset/problem/377/A 题解: 有tot个空格(输入时统计),把其中k个空格变为wall,问怎么变才能使得剩下的空格依然 ...

  4. js获取浏览器宽高、网页宽高、屏幕宽高、鼠标位置等(带图片说明)

    网页可见区域宽: document.body.clientWidth;网页可见区域高: document.body.clientHeight;(点击查看大图) 网页可见区域宽: document.bo ...

  5. 程序员代码面试指南:IT名企算法与数据结构题目最优解

      第1章栈和队列 1设计一个有getMin功能的栈(士★☆☆☆) 1由两个栈组成的队列(尉★★☆☆) 5如何仅用递归函数和栈操作逆序一个栈(尉★★☆☆) 8猫狗队列(士★☆☆☆)10用一个栈实现另一 ...

  6. 【概念】SVG(2)

    Style <svg width="200" height="200" xmlns="http://www.w3.org/2000/svg&qu ...

  7. 在KitKat(Android 4.4.2) 推送网址给手机

    弱者才会回避问题. 最近想把网址推送给手机实现后台下载,打算故技重施,用短信传送然后中断广播的方法实现隐蔽传送.试了半天发现怎么现在拦不住短信了.查了一下才发现原来Android4.4增加了一个安全机 ...

  8. chan_ss7 呼出的时候指定使用某个CICs,或者CICs范围 的方法

      Linkset one: 1-31 Incoming 33-58 Outgoing 58-63 Emergency Traffic Linkset two: 1-31 Incoming 33-58 ...

  9. poj3565Ants——KM算法

    题目:http://poj.org/problem?id=3565 首先,我们神奇地发现,没有相交边的匹配可以转化为距离和最小的匹配,所以可以使用KM算法求带权匹配: 要求的是距离和最小,所以把边权转 ...

  10. bzoj1598

    K短路 和超级钢琴之类的差不多 先反图跑最短路,从原点向外拓展,每个点最多拓展k次,否则不可能是k短路 #include<bits/stdc++.h> using namespace st ...