博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Luogu 3620 数据备份 - Set
阅读量:4512 次
发布时间:2019-06-08

本文共 1936 字,大约阅读时间需要 6 分钟。

Solution

很显然, 最优情况肯定是相邻两个相连 。

然后模型就跟  类似了。

把两个房子 看成一个坑 (参考 Luogu1484), 选取 $k$ 个不相邻的坑, 使得权值最小。

Luogu1484 则是 选取 至多 $k$ 个不相邻坑,  使得权值最大。

 

先考虑简单问题:

当$k= 1$时, 肯定是选择 最大 的$a[i]$ 

当$k= 2$时, 仅有两种情况  选 最大的 $a[i]$ 和 不相邻的 $a[j]$ 或者 $a[i+1]+a[i-1]$

   我们先选了最大的$a[i]$

   那么怎么样才能让下一个找到的最大的 $a[j]$ 是满足条件的解呢?

  我们把 $a[i - 1]$ 和 $a[i + 1]$ 删去, 然后把 $a[i]$改为 $a[i + 1] + a[i - 1] - a[i]$,这样就满足了肯定不会 单独选到 $a[i + 1]或a[i-1]$。

  并且我们若想要选$a[i+1]和a[i-1]$且不选$a[i]$ 只需要再选一次$a[i]$即可。

 

在$k$更大的情况下同样适用。

然后就用链表存储 $nxt$ 与 $pre$, $Set$ 维护 最大值/ 最小值。

 

Code

1 #include
2 #include
3 #include
4 #include
5 #define rd read() 6 #define ll long long 7 using namespace std; 8 typedef pair
P; 9 10 const int N = 1e5 + 5;11 const ll inf = 1e10;12 13 int n, k;14 int nxt[N], pre[N];15 ll a[N], ans;16 set

st;17 18 int read() {19 int X = 0, p = 1; char c = getchar();20 for (; c > '9' || c < '0'; c = getchar())21 if (c == '-') p = -1;22 for (; c >= '0' && c <= '9'; c = getchar())23 X = X * 10 + c - '0';24 return X * p;25 }26 27 void del(int x) {28 nxt[pre[x]] = nxt[x];29 pre[nxt[x]] = pre[x];30 }31 32 int main()33 {34 n = rd; k = rd;35 for (int i = 1; i <= n; ++i) 36 a[i] = rd;37 n--;38 for (int i = 1; i <= n; ++i)39 a[i] = a[i + 1] - a[i];40 for (int i = 1; i <= n; ++i)41 nxt[i] = i + 1, pre[i] = i - 1;42 for (int i = 1; i <= n; ++i)43 st.insert(P(a[i], i));44 a[0] = a[n + 1] = inf;45 set

:: iterator it;46 for (; k; --k) {47 it = st.begin();48 P tp = *it;49 int x = tp.second; ll y = a[x];50 ll t = a[pre[x]] + a[nxt[x]] - y;51 a[x] = t; ans += y;52 st.insert(P(t, x));53 st.erase(P(y, x));54 if (pre[x])55 st.erase(P(a[pre[x]], pre[x])), del(pre[x]);56 if (nxt[x] && nxt[x] != n + 1)57 st.erase(P(a[nxt[x]], nxt[x])), del(nxt[x]);58 }59 printf("%lld\n", ans);60 }

View Code

 

转载于:https://www.cnblogs.com/cychester/p/9703408.html

你可能感兴趣的文章
免费计算机编程类中文书籍
查看>>
mysql之TIMESTAMP(时间戳)用法详解
查看>>
JS笔记——Function类型(JS笔记系列)
查看>>
抽象类入门常见错误
查看>>
javascript修改html <b>标签里面的内容
查看>>
open live writer安装以及代码高亮、折叠插件安装
查看>>
消息队列
查看>>
POJ 1321 棋盘问题 dfs回溯
查看>>
org.apache.catalina.LifecycleException异常的处理
查看>>
C++转向C#的疑惑:难道C#中没有拷贝构造函数 ?[转]
查看>>
计算一个整数二进制中1的个数
查看>>
netdom join 错误:指定的域不存在,或无法联系。
查看>>
Android中Dialog的使用
查看>>
12/10/2015 校内测试:数列
查看>>
Android Activity接收Service发送的广播
查看>>
[Leetcode] Spiral Matrix | 把一个2D matrix用螺旋方式打印
查看>>
加速和监控国际网络
查看>>
亲历亚马逊、华为机器学习面试,原来考官想听到这些回答[转]
查看>>
【Flex】读取本地XML,然后XML数据转成JSON数据
查看>>
RecyclerView使用StaggeredGridLayoutManager布局的粘性头部实现
查看>>