牛客多校第七场 C Governing sand 线段树
题意:
有一个树林,树林中不同种类的树有不同的数量,高度,砍伐它们的价格。现在要求砍掉一些树,使得高度最高的树占剩下的树的总数的一半以上,求最小花费。
题解:
用线段树维护不同种类树的信息,叶子节点从左到右存储单棵砍伐花费最小的树,从高度由高到低枚举树的种类,每次记这种树为留下的最高的树,每次将此种树从线段树上删除,然后求线段树上,使得矮树与高树比例满足要求的前缀和,还要记录比它高的树砍掉的总花费。
注意多种树同一高度要特殊处理。
#include<bits/stdc++.h>
#define MAXN 100005
#define LL long long
using namespace std;
struct Node{
int l,r;
int oneval;
LL sumnum;
LL sumval;
}node[MAXN<<];
struct Tree{
int oneval;
int num;
int height;
int valrank;
}tree[MAXN];
inline bool cmp1(const Tree &a,const Tree &b){
return a.oneval<b.oneval;
}
inline bool cmp2(const Tree &a,const Tree &b){
return a.height>b.height;
}
void build(int l,int r,int x){
node[x].l=l;
node[x].r=r;
if(l==r){
node[x].sumnum=tree[l].num;
node[x].oneval=tree[l].oneval;
node[x].sumval=1LL*tree[l].num*tree[l].oneval;
return ;
}else{
int mid=(l+r)/;
build(l,mid,x*);
build(mid+,r,x*+);
}
node[x].sumnum=node[*x].sumnum+node[*x+].sumnum;
node[x].sumval=node[*x].sumval+node[*x+].sumval;
return ;
}
//LL query(int l,int r,int x){
// if(l<=node[x].l && node[x].r<=r)return node[x].exis;
// if(node[x].r<l || r<node[x].l)return 0;
// LL ans=0;
// if(l<=node[x*2].r)ans+=query(l,r,2*x);
// if(node[x*2+1].l<=r)ans+=query(l,r,2*x+1);
// return ans;
//}
void erase(int id,int x){
if(node[x].l==node[x].r){
node[x].sumnum=;
node[x].sumval=;
node[x].oneval=;
return ;
}
if(id<=node[x*].r){
erase(id,x*);
}else{
erase(id,x*+);
}
node[x].sumval=node[x*].sumval+node[x*+].sumval;
node[x].sumnum=node[x*].sumnum+node[x*+].sumnum;
return ;
}
LL bsearch(LL last,int x){
if(last<=)return ;
if(node[x].l==node[x].r)return last*node[x].oneval;
if(node[x].sumnum==last)return node[x].sumval;
if(node[x].sumnum>last){
if(last<=node[x*].sumnum)return bsearch(last,x*);
else return node[x*].sumval+bsearch(last-node[x*].sumnum,x*+);
}
}
int main(){
int n;
while(~scanf("%d",&n)){
LL nowtrees=;
LL nowcost=;
LL minn=0x3f3f3f3f3f3f3f3f;
for(int i=;i<=n;i++){
scanf("%d %d %d",&tree[i].height,&tree[i].oneval,&tree[i].num);
nowtrees+=tree[i].num;
}
sort(tree+,tree++n,cmp1);
for(int i=;i<=n;i++){
tree[i].valrank=i;
}
build(,n,);
sort(tree+,tree++n,cmp2);
for(int i=;i<=n;i++){
LL nextcost=;
LL talltrees=;
while(i<n && tree[i+].height==tree[i].height){
nowtrees-=tree[i].num;
talltrees+=tree[i].num;
erase(tree[i].valrank,);
nextcost+=1LL*tree[i].num*tree[i].oneval;
++i;
}
nowtrees-=tree[i].num;
talltrees+=tree[i].num;
erase(tree[i].valrank,);
nextcost+=1LL*tree[i].num*tree[i].oneval; minn=min(minn,nowcost+bsearch(nowtrees-talltrees+,));
// printf("time%d:%lld\n",i,nowcost+bsearch(nowtrees-talltrees+1,1)); nowcost+=nextcost;
}
printf("%lld\n",minn);
}
}
牛客多校第七场 C Governing sand 线段树的更多相关文章
- 牛客多校第四场sequence C (线段树+单调栈)
牛客多校第四场sequence C (线段树+单调栈) 传送门:https://ac.nowcoder.com/acm/contest/884/C 题意: 求一个$\max {1 \leq l \le ...
- 2019年牛客多校第四场 B题xor(线段树+线性基交)
题目链接 传送门 题意 给你\(n\)个基底,求\([l,r]\)内的每个基底是否都能异或出\(x\). 思路 线性基交板子题,但是一直没看懂咋求,先偷一份咖啡鸡板子写篇博客吧~ 线性基交学习博客:传 ...
- 2019牛客多校第四场C-sequence(单调栈+线段树)
sequence 题目传送门 解题思路 用单调栈求出每个a[i]作为最小值的最大范围.对于每个a[i],我们都要乘以一个以a[i]为区间内最小值的对应的b的区间和s,如果a[i] > 0,则s要 ...
- 牛客多校第十场 F Popping Balloons 线段树维护稀疏矩阵
题意: 给定一个稀疏矩阵,里面有若干个气球,让你横着开三枪,竖着开三枪,问最多能打爆多少气球,要求相同方向,相邻两枪必须间隔r. 题解: 横向记录每列有多少个气球,分别在哪行上. 然后把这个数据改造成 ...
- 2019牛客训练赛第七场 C Governing sand 权值线段树+贪心
Governing sand 题意 森林里有m种树木,每种树木有一定高度,并且砍掉他要消耗一定的代价,问消耗最少多少代价可以使得森林中最高的树木大于所有树的一半 分析 复杂度分析:n 1e5种树木,并 ...
- 牛客多校第七场 C Bit Compression 思维
链接:https://www.nowcoder.com/acm/contest/145/C来源:牛客网 A binary string s of length N = 2n is given. You ...
- Find the median(2019年牛客多校第七场E题+左闭右开线段树)
题目链接 传送门 题意 每次往集合里面添加一段连续区间的数,然后询问当前集合内的中位数. 思路 思路很好想,但是卡内存. 当时写的动态开点线段树没卡过去,赛后机房大佬用动态开点过了,\(tql\). ...
- 2019牛客多校第七场E Find the median 权值线段树+离散化
Find the median 题目链接: https://ac.nowcoder.com/acm/contest/887/E 题目描述 Let median of some array be the ...
- 两两内积为0(牛客多校第七场)-- CDMA
题意: 构造一个n*n的矩阵,元素只能是-1或1,任意两行内积为0(两两相乘加起来和为0). 思路: #define IOS ios_base::sync_with_stdio(0); cin.tie ...
随机推荐
- rabbitmq使用延迟时报异常
声明交换机为延迟时报异常( unknown exchange type 'x-delayed-message')的解决方法 服务端需下载安装插件: 1.下载插件包 2.将下载后的插件包移至服务安装目录 ...
- python操作pymysql
#_author:来童星#date:2019/12/19import pymysql#1.打开数据库连接db=pymysql.connect('localhost','root','root','te ...
- IntelliJ IDEA下载地址
http://www.jetbrains.org/display/IJOS/Download
- C存储类
C 存储类 存储类定义 C 程序中变量/函数的范围(可见性)和生命周期.这些说明符放置在它们所修饰的类型之前.下面列出 C 程序中可用的存储类: auto register static extern ...
- 如何 修改jsp页面时间格式
先导入文件 <%@ taglib uri="http://java.sun.com/jsp/jstl/fmt" prefix="fmt" %> &l ...
- mockjs 使用以及反向校验
一.背景 前端开发需要依赖后端接口 后端接口输出慢.接口规范随时可能会变,而前端毫无感知 前端需要自己 mock 假数据 json 文件 假数据 json 数据内容是静态的,测试不同返回情况需要修改 ...
- Minimum Snap轨迹规划详解(3)闭式求解
如果QP问题只有等式约束没有不等式约束,那么是可以闭式求解(close form)的.闭式求解效率要快很多,而且只需要用到矩阵运算,不需要QPsolver. 这里介绍Nicholas Roy文章中闭式 ...
- HTTPS 加密原理探究
由于之前项目中IOS系统建议将http协议换成https协议所以查看相关资料在此记录 HTTPS 通讯过程的基本原理 问:Https是什么? 答: HTTP 协议定义了一套规范,让客户端或浏览器可以和 ...
- JS基础复习
js基础语法 Netcape js基础语法规范(ECMAScript1,2,3,3.1,5(IE9),6 ES ES6=es2015) DOM BOM ...
- 一文看懂SATA和NVMe固态硬盘用起来有何区别?
本文摘自:https://www.sohu.com/a/203688929_615464 NVMe固态硬盘正在逐步扩张,而包括三星.东芝在内的大厂并没有停止SATA固态硬盘新品的研发.到底那种固态硬盘 ...