博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
P3097 [USACO13DEC]最优挤奶Optimal Milking
阅读量:4987 次
发布时间:2019-06-12

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

P3097 [USACO13DEC]最优挤奶Optimal Milking

题意简述:给定n个点排成一排,每个点有一个点权,多次改变某个点的点权并将最大点独立集计入答案,输出最终的答案

感谢@zht467 提供翻译


错误日志: 又双叒叕没开long long


Solution

考虑线段树维护

只有四种情况, 选择左端点与否 \(*\) 选择右端点与否
共四种情况
维护这四个便可以上推了

void pushup(LL id){    tree[id].ans[0][0] = max(tree[lid].ans[0][0] + tree[rid].ans[1][0], tree[lid].ans[0][1] + tree[rid].ans[0][0]);    tree[id].ans[0][1] = max(tree[lid].ans[0][0] + tree[rid].ans[1][1], tree[lid].ans[0][1] + tree[rid].ans[0][1]);    tree[id].ans[1][0] = max(tree[lid].ans[1][0] + tree[rid].ans[1][0], tree[lid].ans[1][1] + tree[rid].ans[0][0]);    tree[id].ans[1][1] = max(tree[lid].ans[1][0] + tree[rid].ans[1][1], tree[lid].ans[1][1] + tree[rid].ans[0][1]);    }

Code

#include
#include
#include
#include
#include
#include
#define LL long longusing namespace std;LL RD(){ LL out = 0,flag = 1;char c = getchar(); while(c < '0' || c >'9'){if(c == '-')flag = -1;c = getchar();} while(c >= '0' && c <= '9'){out = out * 10 + c - '0';c = getchar();} return flag * out; }const LL maxn = 80019;LL num, na, a[maxn];#define lid (id << 1)#define rid (id << 1) | 1struct seg_tree{ LL l, r; LL ans[2][2];//0为选,1为不选 }tree[maxn << 2];void pushup(LL id){ tree[id].ans[0][0] = max(tree[lid].ans[0][0] + tree[rid].ans[1][0], tree[lid].ans[0][1] + tree[rid].ans[0][0]); tree[id].ans[0][1] = max(tree[lid].ans[0][0] + tree[rid].ans[1][1], tree[lid].ans[0][1] + tree[rid].ans[0][1]); tree[id].ans[1][0] = max(tree[lid].ans[1][0] + tree[rid].ans[1][0], tree[lid].ans[1][1] + tree[rid].ans[0][0]); tree[id].ans[1][1] = max(tree[lid].ans[1][0] + tree[rid].ans[1][1], tree[lid].ans[1][1] + tree[rid].ans[0][1]); }void build(LL id, LL l, LL r){ tree[id].l = l, tree[id].r = r; if(l == r){ tree[id].ans[1][1] = a[l]; return ; } LL mid = (l + r) >> 1; build(lid, l, mid), build(rid, mid + 1, r); pushup(id); }void update(LL id, LL val, LL l, LL r){ if(tree[id].l == l && tree[id].r == r){ tree[id].ans[1][1] = val; return ; } LL mid = (tree[id].l + tree[id].r) >> 1; if(mid < l)update(rid, val, l, r); else if(mid >= r)update(lid, val, l, r); pushup(id); }LL sum;int main(){ num = RD(), na = RD(); for(LL i = 1;i <= num;i++)a[i] = RD(); build(1, 1, num); for(LL i = 1;i <= na;i++){ LL p = RD(), val = RD(); update(1, val, p, p); LL ans = max(tree[1].ans[0][0], tree[1].ans[0][1]); ans = max(ans, tree[1].ans[1][0]); ans = max(ans, tree[1].ans[1][1]); sum += ans; } printf("%lld\n", sum); return 0; }

转载于:https://www.cnblogs.com/Tony-Double-Sky/p/9649199.html

你可能感兴趣的文章
ServiceFabric极简文档-1.3删除群集
查看>>
EXT2 文件系统(转)
查看>>
.NET - 代码重构技巧
查看>>
EasyUI - DataGrid 组建 - [ 搜索功能 ]
查看>>
Linux菜鸟起飞之路【七】文件合并、归档和压缩
查看>>
Redis设计与实现 -- 动态字符串对象(SDS)
查看>>
信息体系结构原则之二——有用性目标
查看>>
SQL 测试
查看>>
你了解栈溢出StackOverFloweExeption的原理吗?
查看>>
力扣(LeetCode)125. 验证回文串
查看>>
【转载】Eclipse快捷键
查看>>
RabbitMQ 集群
查看>>
关于docker
查看>>
Git的使用
查看>>
table表格设置边框线为单实线
查看>>
poj 2992 Divisors
查看>>
code review
查看>>
【摘录】Matrix学习——图像的复合变化
查看>>
RobotFramework自动化测试之脚本编写(一)
查看>>
学号 20175223 《Java程序设计》第10周学习总结
查看>>