题目链接:

Codeforces702F

题目大意:有$n$种T恤,每种有一个价格$c_{i}$和品质$q_{i}$且每种数量无限。现在有$m$个人,第$i$个人有$v_{i}$元,每人每次会买他能买得起的品质最高的一件T恤(当两件T恤品质相同时优先买价格低的),每人只能买一件每种T恤。求最后每个人买的T恤件数。

暴力的方法是将T恤品质从大到小排序,对于每个人从第一种T恤(排序后的第一种)开始模拟每件T恤,能买就买,不能买就跳过。

发现暴力的方法是对于每个人决策每件T恤,我们可以对于每件T恤来决策哪些人能买,用非旋转$treap$来维护每个人还剩的钱数。

那么每次就是将权值大于$q_{i}$的人的权值都减少$q_{i}$并把答案都增加$1$。

对于区间修改我们直接打标记即可,但问题是无法将被修改的部分和没被修改的部分合并。

因为非旋转$treap$的合并要求一棵树的最大权值小于另一棵树的最小权值,而被修改部分在权值减小之后会有一部分的权值比未被修改部分最大权值小。

那么我们就把这部分暴力插入到未被修改的那棵树中,剩下被修改的那部分直接合并。

假设被暴力插入的权值为$x$,那么$x-q_{i}<q_{i},x>=q_{i}$,也就是说$2q_{i}>x,q_{i}>\frac{x}{2}$,即每次暴力插入的数权值减半,所以每个数最多暴力插入$log_{v_{i}}$次。

总时间复杂度是$O((n+\sum log_{v_{i}})log_{m})$。

#include<set>
#include<map>
#include<queue>
#include<stack>
#include<cmath>
#include<cstdio>
#include<bitset>
#include<vector>
#include<cstring>
#include<iostream>
#include<algorithm>
#define ll long long
using namespace std;
int ls[200010];
int rs[200010];
int val[200010];
int num[200010];
int r[200010];
int sum[200010];
int tag[200010];
int res[200010];
int root;
int n,m,x;
int cnt;
int a,b,c,d;
int L,R;
struct lty
{int c,v;
}q[200010];
queue<int>Q;
inline int build(int v)
{int rt=++cnt;r[rt]=rand();val[rt]=v;return rt;
}
inline void add(int rt,int x,int y)
{tag[rt]+=x;val[rt]+=x;sum[rt]+=y;res[rt]+=y;
}
inline void pushdown(int rt)
{if(tag[rt]&&sum[rt]){add(ls[rt],tag[rt],sum[rt]);add(rs[rt],tag[rt],sum[rt]);tag[rt]=sum[rt]=0;}
}
inline int merge(int x,int y)
{if(!x||!y){return x+y;}pushdown(x);pushdown(y);if(r[x]<r[y]){rs[x]=merge(rs[x],y);return x;}else{ls[y]=merge(x,ls[y]);return y;}
}
inline void split(int rt,int &x,int &y,int k)
{if(!rt){x=y=0;return ;}pushdown(rt);if(val[rt]>=k){y=rt;split(ls[rt],x,ls[y],k);}else{x=rt;split(rs[rt],rs[x],y,k);}
}
inline bool cmp(lty a,lty b)
{return a.v==b.v?a.c<b.c:a.v>b.v;
}
inline void dfs(int rt)
{pushdown(rt);if(ls[rt]){dfs(ls[rt]);}if(rs[rt]){dfs(rs[rt]);}
}
int main()
{scanf("%d",&n);for(int i=1;i<=n;i++){scanf("%d%d",&q[i].c,&q[i].v);}sort(q+1,q+1+n,cmp);scanf("%d",&m);for(int i=1;i<=m;i++){scanf("%d",&x);split(root,a,b,x);root=merge(merge(a,build(x)),b);}for(int i=1;i<=n;i++){split(root,a,b,q[i].c);split(b,b,c,2*q[i].c);add(b,-q[i].c,1);add(c,-q[i].c,1);Q.push(b);while(!Q.empty()){int now=Q.front();Q.pop();pushdown(now);if(ls[now]){Q.push(ls[now]);}if(rs[now]){Q.push(rs[now]);}ls[now]=rs[now]=0;split(a,a,d,val[now]);a=merge(merge(a,now),d);}root=merge(a,c);}dfs(root);for(int i=1;i<=m;i++){printf("%d ",res[i]);}
}

转载于:https://www.cnblogs.com/Khada-Jhin/p/10697330.html

[Codeforces702F]T-Shirts——非旋转treap+贪心相关推荐

  1. 4923: [Lydsy1706月赛]K小值查询 平衡树 非旋转Treap

    国际惯例的题面: 这种维护排序序列,严格大于的进行操作的题都很套路...... 我们按照[0,k],(k,2k],(2k,inf)分类讨论一下就好. 显然第一个区间的不会变化,第二个区间的会被平移进第 ...

  2. BZOJ3223文艺平衡树——非旋转treap

    此为平衡树系列第二道:文艺平衡树您需要写一种数据结构,来维护一个有序数列,其中需要提供以下操作: 翻转一个区间,例如原有序序列是5 4 3 2 1,翻转区间是[2,4]的话,结果是5 2 3 4 1 ...

  3. [NOIP]2017列队——旋转treap/非旋转treap

    Sylvia 是一个热爱学习的女孩子.  前段时间,Sylvia 参加了学校的军训.众所周知,军训的时候需要站方阵. Sylvia所在的方阵中有n × m名学生,方阵的行数为 n,列数为m.  为了便 ...

  4. BZOJ1251序列终结者——非旋转treap

    题目描述 网上有许多题,就是给定一个序列,要你支持几种操作:A.B.C.D.一看另一道题,又是一个序列 要支持几种操作:D.C.B.A.尤其是我们这里的某人,出模拟试题,居然还出了一道这样的,真是没技 ...

  5. luoguP5055 【模板】可持久化文艺平衡树 可持久化非旋转treap

    luoguP5055 [模板]可持久化文艺平衡树 可持久化非旋转treap 好题. Code: #include<bits/stdc++.h> using namespace std; # ...

  6. BZOJ1895Pku3580 supermemo——非旋转treap

    题目描述 给出一个初始序列fA1;A2;:::Ang,要求你编写程序支持如下操作: 1. ADDxyD:给子序列fAx:::Ayg的每个元素都加上D.例如对f1,2, 3,4,5g执行"AD ...

  7. BZOJ1112[POI2008]砖块Klo——非旋转treap

    题目描述 N柱砖,希望有连续K柱的高度是一样的. 你可以选择以下两个动作 1:从某柱砖的顶端拿一块砖出来,丢掉不要了. 2:从仓库中拿出一块砖,放到另一柱.仓库无限大. 现在希望用最小次数的动作完成任 ...

  8. [BJOI2019]送别——非旋转treap

    题目链接: [BJOI2019]送别 我们将每段墙的每一面看成一个点,将每个点与相邻的点(即按题中规则前进或后退一步能走到的点)连接.那么图中所有点就形成了若干个环,而添加一段墙或删除一段墙就是把两个 ...

  9. [TJOI2019]甲苯先生的滚榜——非旋转treap

    题目链接: [TJOI2019]甲苯先生的滚榜 要求维护一个二维权值的集合并支持单点修改,用平衡树维护即可. 因为$n\le 10^6$但$m\le 10^5$,所以最多只有$10^5$个人被操作. ...

最新文章

  1. 边缘加速创新和AI应用,Xilinx推出Kria自适应系统模块产品组合
  2. 单例模式的标准写法、注意事项、作用及测试
  3. 阻带窗函数[数字信号处理]使用窗函数设计FIR滤波器
  4. Java 多线程 笔记 转自http://www.cnblogs.com/lwbqqyumidi/p/3804883.html
  5. android触摸效果,Android UI实现单行文本水平触摸滑动效果
  6. Leetcode每日一题:7.整数反转
  7. Jmeter4.0新版本特性研究
  8. js string转json有斜杠_json 带斜杠时如何解析的实现
  9. NCRE考试感想 四级嵌入式(上)
  10. Python实现C++回调图片:运用高效的跨语言技术
  11. 数学词汇的英译,写文章,读文献必备
  12. shell脚本-字符串和变量
  13. Android AsyncTask详解
  14. 硬件系统工程师宝典(3)-----信号完整性分析是个啥?
  15. 金庸的小说人生(1)
  16. 金字塔图表 html,echarts 金字塔
  17. FreeScale mpc8xxx + vxWorks平台下spi flash驱动开发三步走
  18. Java实现几分钟之后调度任务的定时器
  19. 使用komodo运行python文件
  20. 初入社会的年轻人如何选择行业?

热门文章

  1. 2 自动递增_有石CAD自动下单,1天工作量1小时完成
  2. python日志模块_Python之日志处理(logging模块)
  3. softirq/tasklet/workqueue的区别
  4. android属性动画作用范围,Android开发之动画效果浅析(一)
  5. 微信小程序云开发 mysql_微信小程序云开发学习笔记(一)云数据库
  6. c语言 常量字符串数组,C语言常量以及字符串数组
  7. 简单表单提交php教程,PHP 表单数据提交与接收 超级简单《SSS教程 10》
  8. 飞桨模型保存_史上最全解读|飞桨模型库重大升级,主流算法模型全覆盖
  9. 无监督学习与监督学习的区别
  10. java面试题十五 for循环一个题目