vj题目链接:

https://vjudge.net/contest/235444#problem/F

题意:

有 n 个待建的喷泉,每个的建造代价为pi coins或者pi diamonds(coins 和 diamonds 不可互相兑换),每个喷泉的魅力为bi。问在原有c coins和d diamonds 的情况下,选择两个喷泉,使得在能支付代价的前提下,魅力值最高?如果拥有的钱不足以支付两个喷泉,就输出0,否则输出两个喷泉的最大b值的和。

  1 #include<iostream>
  2 #include<cstdio>
  3 #include<algorithm>
  4 #include<cstring>
  5 using namespace std;
  6 int maxn=100010;
  7 int tree[2][400010];
  8 int b,p;
  9 char ch;
 10 void build(int t,int rt,int l,int r)//新建二叉搜索树
 11 {
 12     if(l==r)
 13     {
 14         tree[t][rt]=0;
 15         return ;
 16     }
 17     int mid=(l+r)>>1;
 18     build(t,rt<<1,l,mid);
 19     build(t,(rt<<1)+1,mid+1,r);
 20 }
 21 int query(int t,int rt,int l,int r,int ql,int qr)//查询二叉搜索树
 22 {
 23     if(ql<=l&&qr>=r)
 24     {
 25         return tree[t][rt];
 26     }
 27     int mid=(l+r)>>1;
 28     int ll=0,rr=0;
 29     if(ql<=mid)
 30     {
 31         ll=query(t,rt<<1,l,mid,ql,qr);
 32     }
 33     if(qr>mid)
 34     {
 35         rr=query(t,(rt<<1)+1,mid+1,r,ql,qr);
 36     }
 37     return max(ll,rr);
 38 }
 39 void update(int t,int rt,int l,int r,int q,int v)//更新二叉搜索树
 40 {
 41     if(l==r)
 42     {
 43         tree[t][rt]=max(tree[t][rt],v);
 44         return ;
 45     }
 46     int mid=(l+r)>>1;
 47     if(q<=mid)
 48     {
 49         update(t,rt<<1,l,mid,q,v);
 50     }
 51     if(q>mid)
 52     {
 53         update(t,(rt<<1)+1,mid+1,r,q,v);
 54     }
 55     tree[t][rt]=max(tree[t][rt<<1],tree[t][(rt<<1)+1]);
 56
 57 }
 58 int main()
 59 {
 60     int n,c,d;
 61     cin>>n>>c>>d;
 62     build(0,1,0,c);
 63     build(1,1,0,d);
 64     int maxc=0,maxd=0;
 65     int ans=0;
 66     for(int i=0;i<n;i++)
 67     {
 68         cin>>b>>p>>ch;
 69         if(ch=='C')
 70         {
 71             if(p<=c)
 72             {
 73                 maxc=max(maxc,b);
 74                 int p1=c-p;
 75                 int b1=query(0,1,0,c,0,p1);
 76                 cout<<b1<<endl;
 77             if(b1!=0)
 78             {
 79                 ans=max(ans,b1+b);
 80             }
 81             update(0,1,0,c,p,b);
 82             }
 83         }
 84         else if(ch=='D')
 85         {
 86             if(p<=d)
 87             {
 88                 maxd=max(maxd,b);
 89                 int p2=d-p;
 90                 int b2=query(1,1,0,d,0,p2);
 91             if(b2!=0)
 92             {
 93                 ans=max(ans,b2+b);
 94             }
 95             update(1,1,0,d,p,b);
 96             }
 97         }
 98     }
 99      if(maxc&&maxd)
100         ans = max(ans,maxc+maxd);
101     cout<<ans;
102 return 0;
103 }

转载于:https://www.cnblogs.com/1013star/p/9280331.html

Codeforces Round #413 C. Fountains (线段树的创建、查询、更新)相关推荐

  1. Codeforces 444C DZY Loves Colors 线段树区间更新

    // Codeforces 444C DZY Loves Colors 线段树区间更新// 题目链接:// http://codeforces.com/problemset/problem/444/C ...

  2. 线段树,最大值查询位子(个人模版)

    线段树,最大值查询位子: 1 #include<cstdio> 2 #include<climits> 3 #include<algorithm> 4 5 usin ...

  3. 线段树线段树的创建线段树的查询单节点更新区间更新

    目录 线段树 什么是线段树? 线段树的创建 线段树的查询 单节点更新 区间更新 未完待续 线段树 实现问题:常用于求数组区间最小值 时间复杂度:(1).建树复杂度:nlogn.(2).线段树算法复杂度 ...

  4. 线段树的创建插入查找删除

    一.线段树基本概念 线段树是一种二叉搜索树,与区间树相似,它将一个区间划分成一些单元区间,每个单元区间对应线段树中的一个叶结点.     对于线段树中的每一个非叶子节点[a,b],它的左儿子表示的区间 ...

  5. WUST 1255 巧克力(线段树的单点区间更新查询)

    1355: 巧克力 Time Limit: 1 Sec   Memory Limit: 128 MB   64bit IO Format: %lld Submitted: 190   Accepted ...

  6. CodeForces - 1557D Ezzat and Grid(线段树+dp)

    题目链接:点击查看 题目大意:给出 nnn 个 010101 串,现在问最少需要删掉多少个串,才能使得剩下的串拼起来是连通的 规定两个 010101 串是连通的,当且仅当存在至少一列,在两个串中都为 ...

  7. CodeForces - 1527E Partition Game(dp+线段树)

    题目链接:点击查看 题目大意:给出一个长度为 nnn 的数列,现在需要将其划分成 kkk 段,使得贡献和最小 对于每段区间 [l,r][l,r][l,r] 的贡献为,其中每个数字,其最后一次出现的位置 ...

  8. codeforces 581B Luxurious Houses(线段树点更新,区间查询)

    题目链接: http://codeforces.com/problemset/problem/581/B 题目大意: 给n个不同高度的房子,要求当对于第i个房子来说,他要严格的比后面的房子都高. 思路 ...

  9. codeforces 85D. Sum of Medians(线段树or分块)

    题目链接:codeforces 85D. Sum of Medians 题意: add x 表示向集合中添加x(添加x的时候保证x是第一次被添加入集合) del x 表示从集合中删除x (删除x的时候 ...

最新文章

  1. Mac 新建unix可执行文件
  2. haproxy负载均衡_使用haproxy搭建web集群
  3. 2016宁波计算机程序复赛,宁波第31届中小学生计算机程序设计竞赛复赛试题小学组.PDF...
  4. Delphi 的信息框相关函数
  5. 使用ZeroBrane Studio调试OpenResty Lua脚本
  6. 如何解决js引入混乱_做个笔记,图片如何实现懒加载(LazyLoad按需加载)
  7. cmake 下载和安装
  8. 昆仑通态触摸屏如何把参数由触摸屏传递到PLC_S71200与其他PLC/组态软件无线串口通讯(自由口)...
  9. 利用Python的sympy包求解一元三次方程
  10. ccf201503-1 ccf 图像旋转-内存限制问题
  11. Leetcode 第 201 场周赛 (2020 滴滴校招专场)
  12. 关于Diy51单片机的趣事
  13. 跨站脚本(XSS)漏洞
  14. 六大基酒——朗姆酒的喝法
  15. 菜鸡随笔第二笔:insmod模块时显示已杀死
  16. (raspberry、bananapi)Archlinux 无法安装yaourt解决办法-----手工编译(不难)(适用于package-query找不到)
  17. 2021年中国机动车、汽车和新能源汽车保有量及驾驶人和驾驶证业务办理情况分析「图」
  18. 全球及中国盐酸氟西汀行业行业需求态势与投资战略规划研究报告2022-2028年
  19. className和classList区别
  20. 强大的项目管理软件:OmniPlan Pro 4 mac中文版

热门文章

  1. 用计算机一级考试考的照片要求,2020年全国计算机等级考试报名照片有哪些要求?【附各省标准】...
  2. 红豆集团推出首家无人服装零售店,跟无人便利店有何不同?
  3. MPLAB X IDE v6.00_项目属性(Projiect Properties)_无法更改设置
  4. 蓝牙 - 设备类型设置: Class of Device
  5. 考研数二第十六讲 不定积分-换元积分和分部积分以及有理函数的积分
  6. MATLAB归一化且之和为1
  7. 微聊 仿微信聊天android app 开源
  8. 计算机二级vb应用,计算机二级VB考试练习题及答案
  9. C语言求解1000以内的完数
  10. 新的JAVA基础第一天---数据类型等