cf799c 树状数组魔改
这题的树状数组是用来维护区间最大值的!非常神奇
第一次见到这种用法,其实和区间求和也没什么差别
/*
树状数组魔改版
有三种方案:选两种c,选两个d,选一个c一个d
前两种方案需要选出符合条件的魅力值最大的物品,枚举的话复杂度n*n,
那么将每件物品按照价格升序排序,同价格时按照魅力值降序排序
枚举每件物品,然后第二件物品就是剩下的钱可以买的魅力值最大的物品
*/
#include<bits/stdc++.h>
using namespace std;
#define ll long long
#define maxn 100005
struct C{int p,b;}c[maxn];
struct D{int p,b;}d[maxn];
int ans,n,C,D,p,b,totc,totd;
char s[];
int bit[maxn];
void update(int x,int val){
while(x<=maxn-){
bit[x]=max(val,bit[x]);
x+=x&-x;
}
}
int query(int x){
int res=;
while(x){
res=max(res,bit[x]);
x-=x&-x;
}
return res;
}
int main(){
totc=totd=ans=;
scanf("%d%d%d",&n,&C,&D);
for(int i=;i<=n;i++){
scanf("%d%d%s",&b,&p,s);
if(s[]=='C' && p<=C)c[++totc].p=p,c[totc].b=b;
else if(s[]=='D' && p<=D)d[++totd].p=p,d[totd].b=b;
} int max1=-,max2=-;
for(int i=;i<=totc;i++)max1=max(max1,c[i].b);
for(int i=;i<=totd;i++)max2=max(max2,d[i].b);
if(max1+ && max2+) ans=max(ans,max1+max2); memset(bit,,sizeof bit);
for(int i=;i<=totc;i++){
int tmp=query(C-c[i].p);
if(tmp>)
ans=max(ans,c[i].b+tmp); update(c[i].p,c[i].b);
} memset(bit,,sizeof bit);
for(int i=;i<=totd;i++){
int tmp=query(D-d[i].p);
if(tmp>)
ans=max(ans,d[i].b+tmp); update(d[i].p,d[i].b);
}
printf("%d\n",ans);
}
cf799c 树状数组魔改的更多相关文章
- HDU 3333 - Turing Tree (树状数组+离线处理+哈希+贪心)
题意:给一个数组,每次查询输出区间内不重复数字的和. 这是3xian教主的题. 用前缀和的思想可以轻易求得区间的和,但是对于重复数字这点很难处理.在线很难下手,考虑离线处理. 将所有查询区间从右端点由 ...
- 【魔改】树状数组 牛客多校第五场I vcd 几何+阅读理解
https://www.nowcoder.com/acm/contest/143/I vc-dimension 题解:分三种情况,组合数学算一下,其中一种要用树状数组维护 技巧(来自UESTC):1. ...
- poj 3486 A Simple Problem with Integers(树状数组第三种模板改段求段)
/* 树状数组第三种模板(改段求段)不解释! 不明白的点这里:here! */ #include<iostream> #include<cstring> #include< ...
- POJ3468--A Simple Problem with Integers--线段树/树状数组 改段求段
题目描述 You have N integers, A1, A2, ... , AN. You need to deal with two kinds of operations. One type ...
- Codeforces 390E Inna and Large Sweet Matrix 树状数组改段求段
题目链接:点击打开链接 题意:给定n*m的二维平面 w个操作 int mp[n][m] = { 0 }; 1.0 (x1,y1) (x2,y2) value for i : x1 to x2 for ...
- HDU 5044 (树链剖分+树状数组+点/边改查)
题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=5044 题目大意:修改链上点,修改链上的边.查询所有点,查询所有边. 解题思路: 2014上海网赛的变 ...
- CodeForces 390E Inna and Large Sweet Matrix(树状数组改段求段)
树状数组仅仅能实现线段树区间改动和区间查询的功能,能够取代不须要lazy tag的线段树.且代码量和常数较小 首先定义一个数组 int c[N]; 并清空 memset(c, 0, sizeof c) ...
- hdu 4970 树状数组 “改段求段”
题意:塔防.给1--n,给出m个塔,每个塔有攻击力,给出k个怪兽的位子和血量,问有几只可以到达n点. 今天刚刚复习了树状数组,就碰到这个题,区间更新.区间求和类型.第三类树状数组可以斩. 注意一下大数 ...
- HDU 1754 I hate it 树状数组维护区间最大值
Problem Description 很多学校流行一种比较的习惯.老师们很喜欢询问,从某某到某某当中,分数最高的是多少.这让很多学生很反感. 不管你喜不喜欢,现在需要你做的是,就是按照老师的要求,写 ...
随机推荐
- 用 Vue 开发一个简单的答题应用(一)
Vue 之类的 MVVM 框架,能帮助我们用更少的代码实现复杂的业务. 为了简单一点,开发计划分成三阶段: 一,数据写死,实现基本的答题效果.支持多种题型. 二,使用本地存储保存数据,支持题目录入的功 ...
- JVM总结(六):早期(编译期)优化
这节我们来总结一下JVM编译器优化问题. JVM编译器优化 Javac编译器 Javac的源码和调试 解析与填充符号表 注解处理器 语法分析与字节码生成 Java语法糖 泛型和类型擦除 自动装箱.拆箱 ...
- UVALive 4254 Processor(二分)
题目链接 题意 有n个任务,每个任务有三个参数ri,di和wi,表示必须在时刻[ri,di]之内执行,工作量为wi.处理器执行速度可以变化,当执行速度为s时,工作量为wi.处理器的速度可以变化,当执行 ...
- 一个奇怪的SystemClock_Config问题解决方法
一直在SystemClock_Config程序死掉,然后下载最新的STm32Cube从新创建项目成功了.
- VS新建项目工具箱图标丢失问题
(1)在电脑里搜索*.tbd文件(2)建一个项目,把需要的工具箱图标加载上,退出 VS. (3)复制一份toolbox.tbd,重命名为toolbox_reset.tbd 然后以后新建项目就可以了.这 ...
- 12. SpringBoot国际化
1).编写国际化配置文件: 2).使用ResourceBundleMessageSource管理国际化资源文件 3).在页面使用fmt:message取出国际化内容 步骤:1).编写国际化配置文件,抽 ...
- 20155332 2016-2017-2 《Java程序设计》第7周学习总结
20155332 2016-2017-2 <Java程序设计>第7周学习总结 教材学习内容总结 了解Lambda语法 了解方法引用 了解Fucntional与Stream API 掌握Da ...
- android 不同Activity之间数据传递
1. 传值Activity package mydemo.mycom.demo2; import android.content.Intent; import android.support.v7.a ...
- javascript 回到顶部
<script type="text/javascript"> window.onload = function(){ var timer = null; //用于判断 ...
- Regex实例
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.T ...