Luogu P2073 送花
权值线段树的模板题
然而AC后才发现,可以用\(\tt{set}\)水过……
权值线段树类似于用线段树来实现平衡树的一些操作,代码实现还是比较方便的
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#define ls p<<1
#define rs p<<1|1
#define mid ((l+r)>>1)
using namespace std;
struct zzz{
    int w,c;
}tree[1000000<<2];
inline void up(int p){ //合并线段树的信息
    tree[p].w=tree[ls].w+tree[rs].w;
    tree[p].c=0;
    if(tree[ls].w) tree[p].c+=tree[ls].c;
    if(tree[rs].w) tree[p].c+=tree[rs].c;
}
void build(int l,int r,int p){  //初始化线段树
    if(l==r){
        tree[p].c=l; return ;
    }
    build(l,mid,ls); build(mid+1,r,rs);
}
void add(int l,int r,int p,int k,int f){  //添加一朵美丽值为f,价格为k的花
    if(l==r){
        if(tree[p].w) return ;
        tree[p].w=f; return ;
    }
    else if(k<=mid) add(l,mid,ls,k,f);
    else add(mid+1,r,rs,k,f);
    up(p);
}
void del1(int l,int r,int p){  //去掉最便宜的花
    if(l==r){
        tree[p].w=0; return ;
    }
    if(tree[ls].w) del1(l,mid,ls);
    else del1(mid+1,r,rs);
    up(p);
}
void del2(int l,int r,int p){  //去掉最贵的花
    if(l==r){
        tree[p].w=0; return ;
    }
    if(tree[rs].w) del2(mid+1,r,rs);
    else del2(l,mid,ls);
    up(p);
}
int read(){
    int k=0,f=1; char c=getchar();
    for(;c<'0'||c>'9';c=getchar())
      if(c=='-') f=-1;
    for(;c>='0'&&c<='9';c=getchar())
      k=k*10+c-48;
    return k*f;
}
int main(){
    build(1,1000001,1);
    int k=read();
    while(k!=-1){
        if(k==1){
            int w=read(),c=read();
            add(1,1000001,1,c,w);
        }
        if(k==3) del1(1,1000001,1);
        if(k==2) del2(1,1000001,1);
        k=read();
    }
    cout<<tree[1].w<<" "<<tree[1].c;
    return 0;
}												
											Luogu P2073 送花的更多相关文章
- 【题解】Luogu P2073 送花
		
原题传送门 这题需要用到Splay 我们用一棵splay维护金钱 考虑c<=1000000 我们珂以把每种价格现在对应的美丽值存在一个a数组中 这样讲有珂能不太清楚qaq,还是对着操作一个一个讲 ...
 - luogu P2073 送花 线段树
		
思路&心路 一眼认定沙比提 写的比较慢,写了1小时吧 开心的交上去 卧槽,只有20? 不服不服,拿着题解的代码去对拍 Emma,<100没问题 100000数据错了,还只是错了一个数据 ...
 - Luogu P2073 送花 set
		
这题...一眼set...但是打了一会儿.. 记录一下每个价格对应的美丽度,顺便充当vis数组,如果美丽度不为0,说明set里已经有了... 删除好说,删*s.begin()和*--s.end()就好 ...
 - P2073 送花
		
P2073 送花 题目背景 小明准备给小红送一束花,以表达他对小红的爱意.他在花店看中了一些花,准备用它们包成花束. 题目描述 这些花都很漂亮,每朵花有一个美丽值W,价格为C. 小明一开始有一个空的花 ...
 - 【洛谷】【treap/堆】P2073 送花
		
[题目描述:] 这些花都很漂亮,每朵花有一个美丽值W,价格为C. 小明一开始有一个空的花束,他不断地向里面添加花.他有以下几种操作: 操作 含义 1 W C 添加一朵美丽值为W,价格为C的花. 3 小 ...
 - 洛谷P2073 送花 [2017年6月计划 线段树01]
		
P2073 送花 题目背景 小明准备给小红送一束花,以表达他对小红的爱意.他在花店看中了一些花,准备用它们包成花束. 题目描述 这些花都很漂亮,每朵花有一个美丽值W,价格为C. 小明一开始有一个空的花 ...
 - [洛谷P2073] 送花
		
送花 题目背景 小明准备给小红送一束花,以表达他对小红的爱意.他在花店看中了一些花,准备用它们包成花束. 题目描述 这些花都很漂亮,每朵花有一个美丽值W,价格为C. 小明一开始有一个空的花束,他不断地 ...
 - 洛谷 P2073 送花【Treap】题解+AC代码
		
题目背景 小明准备给小红送一束花,以表达他对小红的爱意.他在花店看中了一些花,准备用它们包成花束. 题目描述 这些花都很漂亮,每朵花有一个美丽值W,价格为C. 小明一开始有一个空的花束,他不断地向里面 ...
 - [Luogu 2073] 送花
		
很容易想到的平衡树,加个维护区间和. 只需要插入和删除操作即可. kth其实都不用的,最小和最大可以从根节点log n一直向左/一直向右跑到叶子节点而求得. 记得每插入完一个点一定要更新区间和!!更新 ...
 
随机推荐
- [poj百练]2754:八皇后 回溯
			
描述 会下国际象棋的人都很清楚:皇后可以在横.竖.斜线上不限步数地吃掉其他棋子.如何将8个皇后放在棋盘上(有8 * 8个方格),使它们谁也不能被吃掉!这就是著名的八皇后问题. 对于某个满足要求的8皇后 ...
 - 解决resignFirstResponder或者endEditing无效的办法
			
当你想要收回弹出的键盘时却发现平时用的resignFirstResponder和endEditing都失去作用时,应该考虑一下当前的TextField是否为第一响应者,如果不是第一响应者的话,自然下面 ...
 - c#之quartz任务调度的使用
			
这里讲下,quartz这种任务调度程序的简单使用 这是使用的quartz的3.x 版本 2.x 版本与此稍有区别,可以在网上查看2.x版本教程 使用语言为c# quartz的使用分为几个步骤 创建一个 ...
 - Luogu P3092 [USACO13NOV]没有找零No Change【状压/二分】By cellur925
			
题目传送门 可能是我退役/NOIP前做的最后一道状压... 题目大意:给你\(k\)个硬币,FJ想按顺序买\(n\)个物品,但是不能找零,问你最后最多剩下多少钱. 注意到\(k<=16\),提示 ...
 - easyui---datalist相关知识
			
datalist 笔记: class:class="easyui-datalist" //对应标准元素:ul 表格线:lines="true" 远程数据绑定: ...
 - Codeforces Round #566 (Div. 2)
			
Codeforces Round #566 (Div. 2) A Filling Shapes 给定一个 \(3\times n\) 的网格,问使用 这样的占三个格子图形填充满整个网格的方案数 如果 ...
 - Codeforces 1154G(枚举)
			
我预处理\(1e7log(1e7)\)的因数被T掉了,就不敢往这个复杂度想了--无奈去看AC代码 结果怎么暴举gcd剪一剪小枝就接近3s卡过去了!vector有锅(确信 const int maxn ...
 - openSUSE 跨版本升级
			
准备工作 此方法通过网络跨版本升级,适合 Leap 升级到下一个发行版(如 42.2 升级到 42.3),也适合 Leap 升级为 Tumbleweed.首先必须确定升级的时候有足够的时间.靠谱的更新 ...
 - java类在eclipse上打jar包,Linux上成功运行的实例
			
1 eclipse下的java项目结构如下图所示: 2 打包的步骤如下: 3 修改minifest.mf文件: 4 .上传需要的三方jar包们和主类打的jar(案例是topV.jar)并且执行jav ...
 - Coroutine(协程)模式与线程
			
概念 协程(Coroutine)这个概念最早是Melvin Conway在1963年提出的,是并发运算中的概念,指两个子过程通过相互协作完成某个任务,用它可以实现协作式多任务,协程(coroutine ...