牛客多校第七场 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 ...
随机推荐
- 一个比较独特的"HelloWorld"
为什么说是特殊的helloworld呢给全世界的服务器发送一个请求,这就是我"打招呼"的方式核心内容就是:向所有的ipv4地址发送一个请求即x.x.x.x,如果其是web服务,就拿 ...
- 【Flutter学习】基本组件之容器组件Container
一,前言 Flutter控件本身通常由许多小型.单用途的控件组成,结合起来产生强大的效果,例如,Container是一种常用的控件,由负责布局.绘画.定位和大小调整的几个控件组成,具体来说,Conta ...
- java做题笔记
java做题笔记 1. 初始化过程是这样的: 1.首先,初始化父类中的静态成员变量和静态代码块,按照在程序中出现的顺序初始化: 2.然后,初始化子类中的静态成员变量和静态代码块,按照在程序中出现的顺序 ...
- thinkphp 表单令牌
表单令牌 ThinkPHP支持表单令牌验证功能,可以有效防止表单的重复提交等安全防护.要启用表单令牌功能,需要配置行为绑定, 在应用或者模块的配置目录下面的行为定义文件tags.php中 就是在你的 ...
- Ubuntu下设置静态网址
百度上找的图形界面下设置方式: 因为我这里的ubuntu版本是14.10版本 所以我先点击[系统设置],它位置在桌面左侧的菜单栏后面位置. 在系统设置页面,找到[硬件]选项里面的[网络]一项 然后再使 ...
- 【HTML】框架集(Framesets)
1.Frameset的使用 所谓框架便是网页画面分成几个框窗,同时取得多个 URL.只 要 <FRAMESET> <FRAME> 即可,而所有框架标记 要放在一个总起的 htm ...
- 文件下载java代码
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletExcepti ...
- cd 命令行进入目标文件夹
当我在默认路径中使用cd命令时,如果我要进入D:\mytext 文件夹,那么直接使用cd D:\mytext 是不行的 正确的使用是先使用d:进入D盘,然后再进入mytext文件夹
- 用 Flask 来写个轻博客 (2) — Hello World!
Blog 项目源码:https://github.com/JmilkFan/JmilkFan-s-Blog 目录 目录 前文列表 扩展阅读 实现最简单的 Flask 应用 创建 config.py 文 ...
- 2019牛客多校第三场H-Magic Line
Magic Line 题目传送门 解题思路 因为坐标的范围只有正负1000,且所有点坐标都是整数,所以所有点相连构成的最大斜率只有2000,而我们能够输出的的坐标范围是正负10^9.所以我们先把这n个 ...