[loj3277]星座3
如果不合法,利用贪心发现当且仅当某两个星星所构成的矩形中没有白点
反过来,考虑留下若干个星星,那么即要求留下的星星两两之间满足:$\max_{x_{1}\le i\le x_{2}}a_{i}\ge \min(y_{1},y_{2})$
考虑笛卡尔树,那么在笛卡尔树上这等价于使得两点lca的高度大于等于两点最低高度,由于$a_{fa}\ge a_{k}$($fa$为$k$在lca上的父亲),因此这又等价于要求以$k$为根的子树中最多只能保留1个数比$a_{k}$大
令$f[i][j]$表示以$i$为根的子树中最高不超过为$j$且合法的最大保留的价值,其合法状态数量为不超过子树中点数量,因此启发式合并即可维护,时间复杂度为$o(n\log^{2}n)$
1 #include<bits/stdc++.h>
2 using namespace std;
3 #define N 200005
4 #define ll long long
5 set<pair<ll,ll> >::iterator it;
6 set<pair<ll,ll> >s[N];
7 int n,m,x,y,z,a[N],st[N],ls[N],rs[N],f[N];
8 long long ans,mx[N],tag[N];
9 int find(int k){
10 if (k==f[k])return k;
11 return f[k]=find(f[k]);
12 }
13 void merge(int x,int y,int k){
14 x=find(x),y=find(y);
15 while ((s[y].size())&&((*s[y].begin()).first<=k)){
16 mx[y]=max(mx[y],(*s[y].begin()).second+tag[y]);
17 s[y].erase(s[y].begin());
18 }
19 if (s[x].size()<s[y].size()){
20 f[x]=y;
21 swap(x,y);
22 }
23 tag[x]+=mx[y];
24 tag[y]+=mx[x];
25 mx[x]+=mx[y];
26 for(it=s[y].begin();it!=s[y].end();it++)
27 s[x].insert(make_pair((*it).first,(*it).second+tag[y]-tag[x]));
28 }
29 void dfs(int k){
30 if (!k)return;
31 dfs(ls[k]);
32 dfs(rs[k]);
33 merge(k,ls[k],a[k]);
34 merge(k,rs[k],a[k]);
35 }
36 int main(){
37 scanf("%d",&n);
38 for(int i=1;i<=n;i++)scanf("%d",&a[i]);
39 for(int i=1;i<=n;i++)f[i]=i;
40 for(int i=1;i<=n;i++){
41 while ((st[0])&&(a[st[st[0]]]<a[i]))ls[i]=st[st[0]--];
42 if (st[0])rs[st[st[0]]]=i;
43 st[++st[0]]=i;
44 }
45 scanf("%d",&m);
46 for(int i=1;i<=m;i++){
47 scanf("%d%d%d",&x,&y,&z);
48 s[x].insert(make_pair(y,z));
49 ans+=z;
50 }
51 dfs(st[1]);
52 x=find(st[1]);
53 for(it=s[x].begin();it!=s[x].end();it++)mx[x]=max(mx[x],tag[x]+(*it).second);
54 printf("%lld",ans-mx[x]);
55 }
[loj3277]星座3的更多相关文章
- Excel通过身份证获取出生年月,性别,年龄,生肖,星座,省份等信息总结归纳
Excel通过身份证获取出生年月,性别,年龄,生肖,星座,省份等信息总结归纳 早期的身份证号码为15位数字,现在使用的身份证号码为18位数字,它们的含义如下:(1)15位:1-6位为地区代码,7-8位 ...
- JS星座判断(关于日期)
JS根据日期判断所属星座 效果如下: 完整代码如下: <!DOCTYPE html> <html > <head> <link rel="style ...
- 例题:输入您的出生日期,判断你的星座,主要练习使用datetime类及if else语句。很实用
while (true) { Console.WriteLine("请输入您的生日(年-月-日)");//提示输入 string x = Console.ReadLine();// ...
- C#实现万年历(农历、节气、节日、星座、属相、生肖、闰年等)
C# 万年历 农历 节气 节日 星座 星宿 属相 生肖 闰年月 时辰等,代码如下: using System.Collections.Generic; using System.Text; using ...
- java星座、年龄、日期等
星座: public static String getStar(Date date) { Calendar cal = Calendar.getInstance(); cal.setTime(dat ...
- PHP根据身份证号码验证、获取星座、生肖和性别函数
首先介绍一下身份证含义 新的18位身份证号码各位的含义:1-2位省.自治区.直辖市代码:3-4位地级市.盟.自治州代码:5-6位县.县级市.区代码:7-14位出生年月日,比如19670401代表196 ...
- 【Java】实现一个根据日期判断星座程序的编写
思路 直接根据月份做索引,然后根据日期边界判断是本月的星座还是上月的. 算法 private static String getAstro(int month, int day) { String[] ...
- IQ调制、整形滤波器与星座映射
http://www.cnblogs.com/touchblue/archive/2013/01/15/2861952.html 现代通信中.IQ调制基本上属于是标准配置,由于利用IQ调制能够做出全部 ...
- iOS根据获取的月和日星座名称
/** * 依据月和日的下标获取星座名 * * @param monthIndex 月的下标 * @param dayIndex 日的下标 * * @return 星座名 */ - (NSString ...
随机推荐
- CefSharp请求资源拦截及自定义处理
CefSharp请求资源拦截及自定义处理 前言 在CefSharp中,我们不仅可以使用Chromium浏览器内核,还可以通过Cef暴露出来的各种Handler来实现我们自己的资源请求处理. 什么是资源 ...
- Java String的探讨
关于String相关内容的学习,历来都是Java学习必不可少的一个经历. 以前一直想要好好总结一下String的相关的知识点,苦于没有时间,终于在今天有一个闲暇的时间来好好总结一下,也希望这文章能够加 ...
- Redis缓存穿透、缓存击穿、缓存雪崩的介绍及其解决方案
首先,来画一张图了解下缓存处理的流程 一.缓存穿透 描述: 缓存穿透是指缓存和数据库中都没有的数据,而用户不断发起请求查询该数据,导致数据库压力过大. 解决方案: 1.接口校验 如鉴权校验.数据合法性 ...
- springMVC上传和下载附件
上传: 导入需要的jar包:Spring MVC类库 + 文件上传下载需要的JAR包,图中A处为文件上传下载需要的JAR包,其余为Spring MVC类库. 构建领域模层:model层和control ...
- FastAPI 学习之路(八)路径参数和数值的校验
系列文章: FastAPI 学习之路(一)fastapi--高性能web开发框架 FastAPI 学习之路(二) FastAPI 学习之路(三) FastAPI 学习之路(四) FastAPI 学习之 ...
- 使用docker部署nginx并配置https
我只有一台服务器,但我想在这台服务器上运行多个项目,怎么办? 总不能靠加端口区分吧? 百度和Google是个好东西,于是我找到了答案,使用nginx. 通过nginx,我可以给我的一台服务器配置两个域 ...
- [源码解析] Pytorch 如何实现后向传播 (1)---- 调用引擎
[源码解析] Pytorch 如何实现后向传播 (1)---- 调用引擎 目录 [源码解析] Pytorch 如何实现后向传播 (1)---- 调用引擎 0x00 摘要 0x01 前文回顾 1.1 训 ...
- 6月8日 Scrum Meeting
日期:2021年6月8日 会议主要内容概述: 确定6.9日下午两点到五点集中对接 初步确定主题配色和echarts默认图表颜色 一.进度情况 组员 负责 两日内已完成的工作 后两日计划完成的工作 工作 ...
- 【做题记录】CF1428E Carrots for Rabbits—堆的妙用
CF1428E Carrots for Rabbits 题意: 有 \(n\) 个萝卜,每个萝卜的初始大小为 \(a_i\) .现在要把这些萝卜切为为 \(k\) 个.吃每一个萝卜的时间为这个萝卜的大 ...
- EFCore_环境搭建与简单使用_01
开发环境搭建 经典步骤:建实体类.建DbContext.生成数据库 本次使用codefirst模式,走下流程,(你也可以先建好数据库,用命令行的形式,直接生成DbContext,而且生成的DbCont ...