zoukankan      html  css  js  c++  java
  • [#413c] Fountains

    http://codeforces.com/contest/799/problem/C

    解题关键:树状数组取最大值,注意先搜索,后加入,此种情况可以取出最大值。

     为什么可以取到最大值?

    1、当分别用两种硬币购买时,一定可以全部访问完。

    2、用一种硬币时, 依然可以遍历完

     1 #include<bits/stdc++.h>
     2 #define fo(i,a,b) for(int i=(a);i<(b);i++)
     3 #define mp make_pair
     4 #define pb push_back
     5 using namespace std;
     6 typedef long long ll;//要建两颗树状数组 
     7 int C[100002],D[100002],maxn=100002;
     8 int read(int *tree,int i){
     9     int s=0;
    10     while(i>0){
    11         s=max(s,tree[i]);
    12         i-=i&-i;
    13     }
    14     return s;
    15 }
    16 void add(int *tree,int i,int x){
    17     while(i<=maxn){
    18         tree[i]=max(tree[i],x);
    19         i+=i&-i;
    20     }
    21 }
    22 //必须先搜索,再加入 
    23 int b,p;
    24 char a;
    25 int main(){
    26     int n,c,d,mm,ans=0;
    27     cin>>n>>c>>d;
    28     fo(i,0,n){
    29         cin>>b>>p>>a;
    30         if(a=='C'){
    31             mm=read(D,d);
    32             if(p>c) continue;
    33             mm=max(mm,read(C,c-p));
    34             add(C,p,b);
    35         }
    36         else{
    37             mm=read(C,c);
    38             if(p>d) continue;
    39             mm=max(mm,read(D,d-p));
    40             add(D,p,b);
    41         }
    42         if(mm){
    43             ans=max(ans,mm+b);
    44         }
    45     }
    46     cout<<ans<<endl;
    47 }
  • 相关阅读:
    一周内签到连续天数求解
    int型动态数组总结
    快速排序总结
    希尔排序总结
    冒泡排序的总结
    桶排序总结
    插入排序的总结
    选择排序的总结
    二分法的五种实现
    安装Yum源
  • 原文地址:https://www.cnblogs.com/elpsycongroo/p/6852601.html
Copyright © 2011-2022 走看看