题意:
有nnn种 T 恤,每种有价格 cic_ici​ 和品质 qiq_iqi​。
有 mmm 个人要买 T 恤,第 iii 个人有 viv_ivi​​ 元,每人每次都会买一件能买得起的 qiq_iqi​​ 最大的 T 恤。一个人只能买一种 T 恤一件,所有人之间都是独立的。
问最后每个人买了多少件 T 恤?如果有多个 qiq_iqi​​ 最大的 T 恤,会从价格低的开始买。

题解:
对所有衣服按照q[i]q[i]q[i]从大到小排序
对每个人维护a[i]a[i]a[i]表示其剩余的钱,b[i]b[i]b[i]表示其买的衣服数量
对所有人按照a[i]a[i]a[i]从小到大排序,初始b[i]=0b[i]=0b[i]=0
之后枚举每件衣服j=1−>nj=1->nj=1−>n
衣服j对人的影响就是把全局a[i]>=q[j]a[i]>=q[j]a[i]>=q[j]的人都a[i]−=q[j]a[i]-=q[j]a[i]−=q[j],并且b[i]++b[i]++b[i]++

用一棵平衡树维护每个人,按aaa从小到大排列
每次找出所有a[i]>=p[j]a[i]>=p[j]a[i]>=p[j]的人,将其a[i]−=p[j]a[i]-=p[j]a[i]−=p[j],并且b[i]++b[i]++b[i]++
这里我们考虑令x=p[j]x=p[j]x=p[j],所有在[0,x)[0,x)[0,x)内的数不动,把所有在[x,2x][x,2x][x,2x]内的数暴力修改,之后将>2x>2x>2x的数直接打一个b加,a减的标记

可以发现[x,2x][x,2x][x,2x]内的元素至少减半了,所以这样的暴力操作对每个点最多进行O(logv)O(logv)O(logv)次

找了一天bug,头晕加眼花
代码:

#include<bits/stdc++.h>
using namespace std;
const int maxn=2e5+10;
mt19937 rnd(233);
struct FHQ{int cnt,root;int ls[maxn],rs[maxn],val[maxn],key[maxn],siz[maxn];int sum[maxn],lazy[maxn],sub[maxn];int newnode(int x){val[++cnt]=x;key[cnt]=rnd();siz[cnt]=1;return cnt;}
//    void update(int node){//        siz[node]=siz[ls[node]]+siz[rs[node]]+1;
//    }void push_down(int node){if(lazy[node]){if(ls[node]) lazy[ls[node]]+=lazy[node],sum[ls[node]]+=lazy[node];if(rs[node]) lazy[rs[node]]+=lazy[node],sum[rs[node]]+=lazy[node];lazy[node]=0;}if(sub[node]){if(ls[node]) val[ls[node]]-=sub[node],sub[ls[node]]+=sub[node];if(rs[node]) val[rs[node]]-=sub[node],sub[rs[node]]+=sub[node];sub[node]=0;}}void split_val(int node,int vals,int &x,int &y){if(!node){x=y=0;return ;}push_down(node);if(val[node]<=vals){x=node;split_val(rs[node],vals,rs[node],y);}else{y=node;split_val(ls[node],vals,x,ls[node]);}//update(node);}int mer(int x,int y){  //大顶堆if(!x||!y) return x+y;if(key[x]>key[y]){push_down(x);rs[x]=mer(rs[x],y);//update(x);return x;}else{push_down(y);ls[y]=mer(x,ls[y]);//update(y);return y;}}void ins(int vals){int x=0,y=0;split_val(root,vals,x,y);root=mer(mer(x,newnode(vals)),y);}int x,y,z;void sol(int pric){x=0,y=0,z=0;split_val(root,pric-1,x,y);lazy[y]++;sub[y]+=pric;sum[y]++;val[y]-=pric;split_val(y,pric-1,y,z);dfs(y);root=mer(x,z);}void dfs(int node){if(!node) return;push_down(node);dfs(ls[node]);dfs(rs[node]);int xx=0,yy=0;ls[node]=rs[node]=0;split_val(x,val[node],xx,yy);x=mer(mer(xx,node),yy);}void print(int node){if(!node) return ;push_down(node);print(ls[node]);print(rs[node]);}
}fhq;struct Case{int c,q;bool operator < (const Case & a)const{if(q!=a.q) return q>a.q;else return c<a.c;}
}a[maxn];int main() {ios::sync_with_stdio(false);cin.tie(0);int n;cin>>n;for(int i=1;i<=n;i++){cin>>a[i].c>>a[i].q;}sort(a+1,a+1+n);int q;cin>>q;for(int i=1;i<=q;i++){int x;cin>>x;fhq.ins(x);}for(int i=1;i<=n;i++){fhq.sol(a[i].c);}fhq.print(fhq.root);for(int i=1;i<=q;i++){cout<<fhq.sum[i]<<" ";}
}

CF702F T-Shirts (排序+平衡树)相关推荐

  1. 查找和排序算法总结(c语言)

    查找 一.线性表的查找 ①折半查找 仅适应于有序数组 思想: 首先就是要是有序的表,然后有三个指针,一个low,一个high,一个mid,分别表示最左.最右.中间.中间通过(low+high)/2 , ...

  2. ubuntu添加系统调用

    这应该是整个操作系统课设中最复杂的部分,主要是对编译系统的了解不深引起.不过回头看来,收获颇多.现总结如下       开始从网上找资料,有一个上一届学长的总结,算是比较详细的说明了-不过后来感觉,整 ...

  3. 2021 第十二届 蓝桥杯 双向排序 题解 栈+文艺平衡树

    2021 第十二届蓝桥杯 双向排序 题解 栈+文艺平衡树 题目描述 思路 实现方法 代码 只用栈 只用栈的代码 题目描述 原题链接:https://www.lanqiao.cn/problems/14 ...

  4. C++ __gnu_pbds(平板电视)超详细教程(C++内置的平衡树,字典树,hash)

    整理的算法模板合集: ACM模板 目录 一.平衡树 例题:luogu P3369 [模板]普通平衡树 1. `rb_tree_tag`版 2. `splay_tree_tag`版 功能不够?自己添加! ...

  5. 【基础练习】【拓扑排序】codevs3294 车站分级题解

    题目来源:NOIP2013 普及第四题 题目描写叙述 Description 一条单向的铁路线上,依次有编号为1, 2, -, n的n个火车站.每一个火车站都有一个级别,最低为1级.现有若干趟车次在这 ...

  6. Redis 为什么用跳表而不用平衡树?

    本文是<Redis内部数据结构详解>系列的第六篇.在本文中,我们围绕一个Redis的内部数据结构--skiplist展开讨论. Redis里面使用skiplist是为了实现sorted s ...

  7. 数据结构——查找:折半查找、二叉查找(排序)树、平衡二叉树

    七大查找算法:https://www.cnblogs.com/zhang-qc/p/8745153.html 学习的地址 https://www.bilibili.com/video/av278314 ...

  8. 数据结构源码笔记(C语言):英文单词按字典序排序的基数排序

    //实现英文单词按字典序排序的基数排序算法#include<stdio.h> #include<malloc.h> #include<string.h>#defin ...

  9. 数据结构源码笔记(C语言):直接选择排序

    //实现直接选择排序算法#include<stdio.h> #include<malloc.h> #define MAXE 20typedef int KeyType; typ ...

最新文章

  1. python字典{:4}_Python字典101:详细的视觉介绍
  2. android 按照星期 时间 定时_Spring Boot实现定时任务的四种方式
  3. linux free 命令
  4. node mysql批量写入_如何使用node.js在MySQL中进行批量插入
  5. python做游戏代码_利用Python基础代码语句,实现2G时代文字小游戏,世界如此简单!...
  6. 2018-2019-2 20175204 张湲祯 实验五《网络编程与安全》实验报告
  7. PowerDesigner pdm生成Access的方法
  8. wether.html5.qq.com,人教版英语九年级全一册Unit 1单元测试卷及参考答案解析(含听力...
  9. 红帽linux 竞争对手,为什么红帽不把CentOS当作竞争对手?
  10. 记一次centos 6 x64位系统修复过程
  11. hive udaf_谈笑间学会大数据初识Hive
  12. android setflag找不到_Android面试题4–Activity之Intent的Flag
  13. 源头防堵信息泄露 监管拟全面推行支付标记化
  14. PyQt5简易本地视频播放器
  15. 基于变量推理的知识图路径推理分析
  16. 写一个简易的手机APP
  17. python中apply函数
  18. openerp 打印报表pdf中文乱码解决办法
  19. 计算机分层和tcp分层_认知分层的机械权威与人类权威
  20. 警告记录 - [Timing 38-316] Clock period ‘10.000‘ specified during out-of-context synthesis of instance

热门文章

  1. 卷积学习与图像识别的技术发展
  2. 什么是近似算法?它适用于哪些问题?这篇文章给你答案
  3. 在 Google Colab 中使用 OpenCV 进行图像处理简介
  4. 时隔多年,ORB-SLAM3终于来了
  5. 【OpenCV 4开发详解】深度神经网络应用实例
  6. 【OpenCV 4开发详解】图像与视频的保存
  7. 黄聪:原生js的音频播放器,兼容pc端和移动端(原创)
  8. laravel 如何自定义全局的方法/类
  9. Uploadify jquery+falsh+UploadHandler.ashx
  10. 导入eclipse工程到Android Studio中