CF-557C Arthur and Table 权值线段树
Arthur and Table
题意
一个桌子有n个腿,每个腿都有一个高度,当且仅当最高的腿的数量大于桌子腿数量的一半时,桌子才是稳定的。特殊的是当只有一个腿时,桌子是稳定的,当有两个腿时两个腿必须都得是最高的,才稳定。
分析
这题其实和去年的牛客的一道砍树题一样的(但是我没想起来那题,当时看的题解,稍微改了一下代码,就交了印象不深刻。。。)
首先我们按照桌子腿的高度从小到大排序,然后枚举当前最高的高度。
大于当前高度的肯定都要删除掉,用一个suf后缀来维护。
我们知道当前高度的桌腿的数量,根据这个数量算出小于这个高度的我们要删除几个?x个
然后我们用一颗权值线段树维护桌腿的数量以及价值。
查询前x个最小的权值和,当前高度的花费就是suf[i+1]+query(x)。
代码
#include<bits/stdc++.h>
#define pb push_back
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
const int N=1e5+10;
const int mod=1e9+7;
const int inf=0x3f3f3f3f;
const double eps=1e-14;
struct note
{
int wei,val;
}arr[N];
bool cmp(note a,note b)
{
return a.wei<b.wei;
}
int suf[N];
struct tree
{
int num,sum;
}node[N];
void build(int rt,int l,int r)
{
node[rt].num=node[rt].sum=0;
if(l==r) return ;
int mid=(l+r)/2;
build(rt*2,l,mid);
build(rt*2+1,mid+1,r);
}
void pushup(int rt)
{
node[rt].num=node[rt*2].num+node[rt*2+1].num;
node[rt].sum=node[rt*2].sum+node[rt*2+1].sum;
}
void update(int rt,int l,int r,int pos)
{
if(l==r)
{
node[rt].num++;
node[rt].sum+=l;
return;
}
int mid=(l+r)/2;
if(pos<=mid) update(rt*2,l,mid,pos);
else update(rt*2+1,mid+1,r,pos);
pushup(rt);
}
int query(int rt,int l,int r,int k)
{
if(l==r) return k*l;
int lnum=node[rt*2].num;//左子树中桌腿数量
int mid=(l+r)/2;
if(k<=lnum) return query(rt*2,l,mid,k);
else return node[rt*2].sum+query(rt*2+1,mid+1,r,k-lnum);
}
int main()
{
int n;
scanf("%d",&n);
for(int i=1;i<=n;i++)
scanf("%d",&arr[i].wei);
for(int i=1;i<=n;i++)
scanf("%d",&arr[i].val);
sort(arr+1,arr+1+n,cmp);//按照高度从小到大排序
for(int i=n;i;i--)//计算后缀
suf[i]=suf[i+1]+arr[i].val;
int now,ans=inf;
build(1,1,200);
for(int i=1;i<=n;i++)
{
now=0;
int j=i;
while(j<=n&&arr[j].wei==arr[i].wei)//计算当前高度的桌腿的数量,下标
{
j++;
now++;
}
int x=max(i-now,0);//小于当前高度,要删去的数量
ans=min(ans,suf[j]+query(1,1,200,x));//计算贡献
for(int k=i;k<j;k++)//把当前高度更新如线段树
update(1,1,200,arr[k].val);
i=j-1;
}
printf("%d\n",ans);
return 0;
}
CF-557C Arthur and Table 权值线段树的更多相关文章
- 【树状数组套权值线段树】bzoj1901 Zju2112 Dynamic Rankings
谁再管这玩意叫树状数组套主席树我跟谁急 明明就是树状数组的每个结点维护一棵动态开结点的权值线段树而已 好吧,其实只有一个指针,指向该结点的权值线段树的当前结点 每次查询之前,要让指针指向根结点 不同结 ...
- 【BZOJ-2892&1171】强袭作战&大sz的游戏 权值线段树+单调队列+标记永久化+DP
2892: 强袭作战 Time Limit: 50 Sec Memory Limit: 512 MBSubmit: 45 Solved: 30[Submit][Status][Discuss] D ...
- BZOJ 3110 ZJOI 2013 K大数查询 树套树(权值线段树套区间线段树)
题目大意:有一些位置.这些位置上能够放若干个数字. 如今有两种操作. 1.在区间l到r上加入一个数字x 2.求出l到r上的第k大的数字是什么 思路:这样的题一看就是树套树,关键是怎么套,怎么写.(话说 ...
- 动态求区间K大值(权值线段树)
我们知道我们可以通过主席树来维护静态区间第K大值.我们又知道主席树满足可加性,所以我们可以用树状数组来维护主席树,树状数组的每一个节点都可以开一颗主席树,然后一起做. 我们注意到树状数组的每一棵树都和 ...
- 线段树(单标记+离散化+扫描线+双标记)+zkw线段树+权值线段树+主席树及一些例题
“队列进出图上的方向 线段树区间修改求出总量 可持久留下的迹象 我们 俯身欣赏” ----<膜你抄> 线段树很早就会写了,但一直没有总结,所以偶尔重写又会懵逼,所以还是要总结一下. ...
- 【BZOJ3685】【zkw权值线段树】普通van Emde Boas树
原题传送门 因为马上要开始搞树套树了,所以学了一波权值线段树...毕竟是会点zkw线段树的,所以zkw线段树大法好! 解题思路: 介绍一下权值线段树吧,其实感觉就是线段树的本义,就是你用线段树维护了数 ...
- BZOJ_2161_布娃娃_权值线段树
BZOJ_2161_布娃娃_权值线段树 Description 小时候的雨荨非常听话,是父母眼中的好孩子.在学校是老师的左右手,同学的好榜样.后来她成为艾利斯顿第二 代考神,这和小时候培养的良好素质是 ...
- BZOJ_3685_普通van Emde Boas树_权值线段树
BZOJ_3685_普通van Emde Boas树_权值线段树 Description 设计数据结构支持: 1 x 若x不存在,插入x 2 x 若x存在,删除x 3 输出当前最小值,若不存 ...
- B20J_2733_[HNOI2012]永无乡_权值线段树合并
B20J_2733_[HNOI2012]永无乡_权值线段树合并 Description:n座岛,编号从1到n,每座岛都有自己的独一无二的重要度,按照重要度可以将这n座岛排名,名次用1到 n来表示.某些 ...
随机推荐
- springboot前后端分离跨域
@Configurationpublic class CrossConfig implements WebMvcConfigurer { @Override public void addCorsMa ...
- mysql 使用记录
修改 mysql 数据库密码 mysqladmin -u username -h host_name password -P <port> "new_password" ...
- [Asp.Net Core] Blazor Server Side 项目实践 - 切换页面时保留状态
前言: 这是 项目实践系列 , 算是中高级系列博文, 用于为项目开发过程中不好解决的问题提出解决方案的. 不属于入门级系列. 解释起来也比较跳跃, 只讲重点. 因为有网友的项目需求, 所以提前把这些解 ...
- Java类的使用
在一个Java文件中写两个类:一个基本的类,一个测试类.注意:文件名称和测试类名称一致. 如何使用呢?创建对象使用.如何创建对象呢?格式:类名 对象名 = new 类名(); Student s = ...
- Linux系统防火墙相关操作
服务器重启后防火墙会自动开启,需要把防火墙关闭 以下为对防火墙进行的相关操作 查看防火墙状态 systemctl status firewalld service iptables status 暂时 ...
- C#多线程(15):任务基础③
目录 TaskAwaiter 延续的另一种方法 另一种创建任务的方法 实现一个支持同步和异步任务的类型 Task.FromCanceled() 如何在内部取消任务 Yield 关键字 补充知识点 任务 ...
- tp5--Excel表格导入导出
来源于:https://www.cnblogs.com/MyIsLu/p/6830579.html PHPExcel 扩展包下载地址: https://github.com/P ...
- ajax---post跨域思路
ajax跨域需要加的代码 header("Access-Control-Allow-Methods:GET,POST");
- Mysql使用规范及建议
MySQL数据库使用规范一.建表规约1.[强制]表达是与否概念的字段,必须使用is_xxx的方式命名,数据类型是unsigned tinyint (1表示是,0表示否) 说明:任何字段如果为非负数,必 ...
- 如何创建和部署自己的EOS代币
本文我们将弄清楚什么是EOS代币以及如何自己创建和部署EOS代币. 与以太坊相反,EOS带有即插即用的代币智能合约.以太坊拥有ERC20智能合约,EOS拥有eosio.token智能合约.Eosio. ...