HDU4288 Coder

题目大意:add即像数字串中添加数字,del n 删除数字串中值为n的元素。sum 按照所给公式求和。

坑点:所给的数字是由小到大排序的,需要注意的是后面如果add一个数字,需要放到合适的位置。比如 3,4,7,9, 如果add 6,6需要放在4,7之间。

这道题一直超时,关键在删除值为n的元素的时候会超时,因为需要遍历。 所以使用二分搜索找到插入n的位置以及删除n的位置。

#include <iostream>
#include <cstring>
#include <string>
#include <cstdio>
#include <algorithm>
#include <set>
#include <vector>
using namespace std;
int N;
vector<int> vc;
void sum(){
    long long summ=0;
    for(int i=2;i<vc.size();i+=5){
        summ+=vc[i];
    }
    cout<<summ<<endl;
}
void del(int n){
    vector<int>::iterator it;
    it=lower_bound(vc.begin(),vc.end(),n);
    vc.erase(it);
}
void add(int n){
    vector<int>::iterator it;
    it=lower_bound(vc.begin(),vc.end(),n);
    vc.insert(it,n);
}
void inpt(){
    string str;
    long long  n;
    cin>>str;
    if(str=="sum") sum();
    else  if(str=="add") {
        scanf("%d",&n);
        add(n);
    }
    else{
        scanf("%d",&n);
        del(n);
    }
}
int main()
{
    while(scanf("%d",&N)!=EOF){
        vc.clear();
         for(int i=0;i<N;i++){
             inpt();
         }
    }
    return 0;
}
时间: 2024-11-05 22:00:12

HDU4288 Coder的相关文章

多颗线段树+间隔点组成的区间求和 hdu4288 coder

题意: hdu4288 有3种操作:1.往集合里加入元素 2.删除集合里的元素 3.对集合里下标模5等于3的元素求和 加入和删除元素就是线段树里的单点更新,但第三种操作就不那么显然了.由于需要求和的元素都是模5等于3的等间隔的点,当我们对一个节点进行更新的时候,它的左子结点的满足条件的下标在这个节点肯定也满足条件,但右子节点模5等于3的下标并不是这个节点的模5等于3的下标,因为当我们计算右子节点的时候下标从1开始计算,而在当前节点的时候右子节点的下标是从左子结点的最后一个下标开始算的,所以我们用

hdu4288 Coder(线段树+离散化)

题目链接: huangjing 题意: 题目中给了三个操作 1:add x 就是把x插进去 2:delete x 就是把x删除 3:sum 就是求下标%5=3的元素的和. 还有一个条件是插入和删除最后都要保证数列有序... 首先告诉一种暴力的写法..因为时间非常充足,需要对stl里面的函数有所了解.. 就是直接申明一个vector的容器,然后直接用vector里面的操作比如 insert,erase等等操作..不过这个效率很低.. 最后跑出来6000多ms..(强哥的代码) 代码: #inclu

hdu4288 Coder(段树+分离)

主题链接: huangjing 题意: 题目中给了三个操作 1:add x 就是把x插进去 2:delete x 就是把x删除 3:sum 就是求下标%5=3的元素的和. 另一个条件是插入和删除最后都要保证数列有序. .. 首先告诉一种暴力的写法. .由于时间很充足,须要对stl里面的函数有所了解. . 就是直接申明一个vector的容器.然后直接用vector里面的操作比方 insert,erase等等操作. .只是这个效率非常低.. 最后跑出来6000多ms. .(强哥的代码) 代码: #i

HDU4288 Coder(线段树)

注意添加到集合中的数是升序的,先将数据读入,再离散化. sum[rt][i]表示此节点的区域位置对5取模为i的数的和,删除一个数则右边的数循环左移一位,添加一个数则右边数循环右移一位,相当于循环左移4位,线段树与树状数组结合,树状数组确定位置. le[rt]表示左移的位数,区间更新懒惰标记 #include <iostream> #include <cstdio> #include<cstdlib> #include<map> #include<alg

线段树题目总结

一.单点更新 1.hdu1166 敌兵布阵:有N个兵营,每个兵营都给出了人数ai(下标从1开始),有四种命令,(1)"Addij",表示第i个营地增加j人.(2)"Sub i j",表示第i个营地减少j人.(3)"Query ij",查询第i个营地到第j个营地的总人数.(4)"End",表示命令结束.解题报告Here. 2.hdu1754 I Hate It:给你N个数,M个操作,操作分两类.(1)"QAB"

线段树总结 (转载 里面有扫描线类 还有NotOnlySuccess线段树大神的地址)

转载自:http://blog.csdn.net/shiqi_614/article/details/8228102 之前做了些线段树相关的题目,开学一段时间后,想着把它整理下,完成了大牛NotOnlySuccess的博文“完全版线段树”里的大部分题目,其博文地址Here,然后也加入了自己做过的一些题目.整理时,更新了之前的代码风格,不过旧的代码仍然保留着. 同样分成四类,不好归到前四类的都分到了其他.树状数组能做,线段树都能做(如果是内存限制例外),所以也有些树状数组的题目,会标示出来,并且放

hdu4288 离线处理线段树

http://acm.hdu.edu.cn/showproblem.php?pid=4288 Problem Description In mathematics and computer science, an algorithm describes a set of procedures or instructions that define a procedure. The term has become increasing popular since the advent of che

java coder的水平

写java写了也12年了,不决的自己是高手,但是也体会了一些变化.总的来说,Java可以分成几个层次: 首先是需求理解层次,这个层次的coder能理解需求,把需求转化成代码: 第二个层次是单测,能够对写出的代码进行测试,单测有几个要素:构造输入,调用服务,获得输出,检验输出.初级的单测只测试最简单的逻辑,复杂单测能测试异常,边界,以及其它复杂的逻辑. 第三个层次是规范,命名,注释,需要能符合规范.符合规范的代码看起来比较专业,不会让人觉得业余. 第四个层次是可读性,代码要可读需要满足一些条件,结

第六周作业——Coder和Hacker的区别

coder和hacker虽然都是写程序的人,但他们在本质上有很大的不同: 我们都知道code的翻译是代码,顾名思义,coder可以说是写代码的人,它在工程师的等级划分中可以说是最底层的.coder知识为了写代码而写代码,他们并不关心写的程序的目的和作用,只是为了完成属于自己的任务,为了自己的生活.他们有一种固定的思维——这是上司交代的工作,必须完成,因为这关系这自己的工资.奖金.而且他们希望自己的工作量最少,所以不会主动做会让自己增加工作量的事,比如对团队开发项目中发现的问题不会提出来,也不会想