当前位置: 首页 > news >正文

洛谷2073 送花 线段树

传送门:https://www.luogu.org/problemnew/show/2073#sub

题目背景

小明准备给小红送一束花,以表达他对小红的爱意。他在花店看中了一些花,准备用它们包成花束。

 

题目描述

这些花都很漂亮,每朵花有一个美丽值W,价格为C。

小明一开始有一个空的花束,他不断地向里面添加花。他有以下几种操作:

操作 含义

1 W C 添加一朵美丽值为W,价格为C的花。

3 小明觉得当前花束中最便宜的一朵花太廉价,不适合送给小红,所以删除最便宜的一朵花。

2 小明觉得当前花束中最贵的一朵花太贵,他心疼自己的钱,所以删除最贵的一朵花。

-1 完成添加与删除,开始包装花束

若删除操作时没有花,则跳过删除操作。

如果加入的花朵价格已经与花束中已有花朵价格重复,则这一朵花不能加入花束。

请你帮小明写一个程序,计算出开始包装花束时,花束中所有花的美丽值的总和,以及小明需要为花束付出的总价格。

 

输入格式

若干行,每行一个操作,以-1结束。

 

输出格式

一行,两个空格隔开的正整数表示开始包装花束时,花束中所有花的美丽值的总和。以及小明需要为花束付出的总价格。

 

样例君

输入

1 1 1

1 2 5

2

1 3 3

3

1 5 2

-1

输出

8 5

 

蒟蒻吐槽

  忍不住想说,数据结构好麻烦啊啊。

  其实这道题和洛谷1198最大数(传送门)蛮像的,反正我是这么认为。因为蒟蒻太弱了,只能暴力建一棵最大的树。每次加入花时,就把花束末尾的编号++,然后单点修改。对于拔花(滑稽),线段树维护最大值最小值,loc数组记录每个价格的花在数列的哪个位置,要是不想记录的话,也可以在pushup的时候顺便把max和min的位置传上来。

  再删除的时候把那个节点的所有值赋成0,代表这个点不再存在了,要是不想写的话,建树的时候打个标记也可以。

  为了便于记录答案和输出,我的树里记录了每个点对应的价值和、美丽度和、max值、min值。

  代码附上,希望dalao们不要嫌弃哈。O(∩_∩)O!

 

代码

#include<cstdio>
#include<algorithm>
using namespace std;

const int N=100010;

struct node
{
    int c,w,mx,mn;
}tr[N<<2];
int ql,qr,w,c,k,n;
int loc[N*10];

void update(int o,int l,int r)
{
    if(ql<=l&&qr>=r)
    {
        tr[o].c=c;
        tr[o].w=w;
        tr[o].mx=tr[o].mn=c;
        return;
    }
    int mid=(l+r)>>1;
    if(ql<=mid)update(o<<1,l,mid);
    if(qr>mid)update(o<<1|1,mid+1,r);
    if(!tr[o<<1].mx&&tr[o<<1|1].mx)tr[o]=tr[o<<1|1];
    if(!tr[o<<1].mx&&!tr[o<<1|1].mx)tr[o].w=tr[o].c=tr[o].mx=tr[o].mn=0;
    if(tr[o<<1].mx&&!tr[o<<1|1].mx)tr[o]=tr[o<<1];
    if(tr[o<<1].mx&&tr[o<<1|1].mx)
    {
        tr[o].mx=max(tr[o<<1].mx,tr[o<<1|1].mx);
        tr[o].mn=min(tr[o<<1].mn,tr[o<<1|1].mn);
        tr[o].w=tr[o<<1].w+tr[o<<1|1].w;
        tr[o].c=tr[o<<1].c+tr[o<<1|1].c;
    }
}

int main()
{
    while(true)
    {
        scanf("%d",&k);
        if(k==1)
        {
            scanf("%d%d",&w,&c);
            if(loc[c])continue;
            n++;
            loc[c]=n;
            ql=qr=n;
            update(1,1,N);
        }
        else if(k==2)
        {
            if(!tr[1].mx)continue;
            ql=qr=loc[tr[1].mx];
            loc[tr[1].mx]=0;
            c=0;w=0;
            update(1,1,N);
        }
        else if(k==3)
        {
            if(!tr[1].mn)continue;
            ql=qr=loc[tr[1].mn];
            loc[tr[1].mn]=0;
            c=0;w=0;
            update(1,1,N);
        }
        else break;
    }
    printf("%d %d",tr[1].w,tr[1].c);
    return 0;
}

 

转载于:https://www.cnblogs.com/mofangk/p/7744240.html

相关文章:

  • Class的继承
  • 002-读书笔记-JavaScript高级程序设计 在HTML中使用JavaScript
  • iOS之CAGradientLayer属性简介和使用
  • 近百年前宝洁发明“肥皂剧”,阿里要创造“种草剧”!
  • python 字符框
  • SpringMVC学习系列 之 数据验证
  • easyui-combobox 设置option内容不换行
  • 3.7 su命令 3.8 sudo命令 3.9 限制root远程登录
  • fs检测文件夹状态
  • webapi 获取请求参数
  • 风险管理:企业要为云端的5种风险承担责任
  • 分享关于Entity Framework 进行CRUD操作实验的结果
  • 文件地理数据库的大小和名称限制
  • OID
  • Hyper-V Server 2012 R2介绍
  • 【162天】黑马程序员27天视频学习笔记【Day02-上】
  • CSS实用技巧
  • Git同步原始仓库到Fork仓库中
  • PermissionScope Swift4 兼容问题
  • STAR法则
  • 从setTimeout-setInterval看JS线程
  • 代理模式
  • 浅谈Golang中select的用法
  • 使用 @font-face
  • 曾刷新两项世界纪录,腾讯优图人脸检测算法 DSFD 正式开源 ...
  • ​LeetCode解法汇总2670. 找出不同元素数目差数组
  • # 安徽锐锋科技IDMS系统简介
  • #NOIP 2014# day.1 T2 联合权值
  • #QT(串口助手-界面)
  • #我与Java虚拟机的故事#连载05:Java虚拟机的修炼之道
  • #我与Java虚拟机的故事#连载14:挑战高薪面试必看
  • (145)光线追踪距离场柔和阴影
  • (2)STL算法之元素计数
  • (5)STL算法之复制
  • (8)Linux使用C语言读取proc/stat等cpu使用数据
  • (Redis使用系列) Springboot 实现Redis 同数据源动态切换db 八
  • (附表设计)不是我吹!超级全面的权限系统设计方案面世了
  • (附源码)计算机毕业设计SSM教师教学质量评价系统
  • (原)本想说脏话,奈何已放下
  • (转)Mysql的优化设置
  • *Django中的Ajax 纯js的书写样式1
  • .\OBJ\test1.axf: Error: L6230W: Ignoring --entry command. Cannot find argumen 'Reset_Handler'
  • .NET Core中Emit的使用
  • .NET 服务 ServiceController
  • .net 提取注释生成API文档 帮助文档
  • .net/c# memcached 获取所有缓存键(keys)
  • .netcore 获取appsettings
  • .NET导入Excel数据
  • .NET命令行(CLI)常用命令
  • .NET微信公众号开发-2.0创建自定义菜单
  • .Net中的集合
  • .php结尾的域名,【php】php正则截取url中域名后的内容
  • @converter 只能用mysql吗_python-MySQLConverter对象没有mysql-connector属性’...
  • @SuppressWarnings(unchecked)代码的作用
  • @基于大模型的旅游路线推荐方案