hdu 4288 Coder (vector)

题意:有三种类型的操作

1.”add x”表示往集合里添加数x。2.“del x”表示将集合中数x删除。3.“sum”求出从小到大排列的集合中下标模5为3的数的和。

集合中的数都是唯一的。集合是一个有序的集合。

# include<stdio.h>
# include<algorithm>
# include<iostream>
# include<string.h>
# include<map>
# include<vector>
using namespace std;
int main()
{
    int i,a,n;
    char s[10];
    vector<int>pp;///动态的数组
    vector<int>::iterator it;///迭达器
    while(~scanf("%d",&n))
    {
        pp.clear();
        while(n--)
        {
            scanf("%s",s);
            if(s[0]=='a')
            {
                scanf("%d",&a);
                it=lower_bound(pp.begin(),pp.end(),a);///插入的位置
                pp.insert(it,a);///代插入的位置插入a
            }
            else if(s[0]=='d')
            {
                scanf("%d",&a);
                it=lower_bound(pp.begin(),pp.end(),a);///删除的位置
                pp.erase(it);
            }
            else
            {
                __int64 sum=0;
                for(i=2; i<pp.size(); i+=5)
                    sum+=pp[i];
                printf("%I64d\n",sum);

            }
        }
    }
    return 0;
}
时间: 2024-11-06 09:59:16

hdu 4288 Coder (vector)的相关文章

hdu 4288 Coder

http://acm.hdu.edu.cn/showproblem.php?pid=4288 题意:add 就是在集合里面加上一个数x: del 就是从集合里删去一个数x: sum是求位置i%5==3的数的和. tree[i].sum[5] 里面数组存的是不同位置%5之后分别对应的和. 1 #include <cstdio> 2 #include <cstring> 3 #include <algorithm> 4 #define maxn 100010 5 using

HDU 4288 Coder(模拟) 附:upper_bound与lower_bound的比较

HDU 4288 题意:太长..点进去自己看吧 思路: 一道模拟题,但直接模拟会卡TLE,所以进行些许优化,将复杂度/5. 简而言之就是用一个有序数组来模拟set. 优化是利用lower_bound函数,这里简介下lower_bound 与 upper_bound 的区别: 摘自:http://blog.csdn.net/weiguang_123/article/details/7987823 lower_bound返回[First,last)中,可以插入value的第一个位置,使得插入后仍旧满

HDU 4288 Coder (线段树)

Coder 题目:http://acm.hdu.edu.cn/showproblem.php?pid=4288 题意:有三种类型的操作,(1)."add x",表示往集合里加入?数x.(2)."del x"表示将集合中数x删除.(3)."sum"求出从小到大排列的集合中下标模5为3的数的和.集合中的数都是唯一的. 思路:这题巧妙的地方在于先离线输入,然后离散化.输入的数字依照从小到大排序,然后作为线段树的叶子结点.每一个结点包括两个部分,一是该结

hdu 4288 Coder(树形结构-线段树)

<span style="font-family: 'Times New Roman'; font-size: 12px;">Coder</span> Time Limit: 20000/10000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 3187    Accepted Submission(s): 1258 Problem Descr

hdu 4288 Coder (线段树+离线)

题意: 刚开始有一个空集合.有三种操作: 1.往集合中加入一个集合中不存在的数 x 2.从集合中删除一个已经存在的数 x 3.计算集合的digest sum并输出.       digest sum求法:将集合中所有数从小到大排序,得到a1<a2<...<an. digest sum = sum(ai) where i mod 5 = 3 数据范围: N ( 1 <= N <= 105 ) 1 <= x <= 109. For any “add x” it is

hdu 4858 项目管理(vector模拟)

# include <stdio.h> # include <algorithm> # include <string.h> # include <vector> # define N 100005 using namespace std; vector<int>g[N]; int node[N]; int slove(int x) { int sum=0,i; for(i=0;i<g[x].size();i++) { sum+=node[

线段树(单点更新) HDOJ 4288 Coder

题目传送门 1 #include <cstdio> 2 #include <cstring> 3 #define lson l, m, rt << 1 4 #define rson m + 1, r, rt << 1 | 1 5 6 const int MAX_N = 500000 + 10; 7 int sum[MAX_N << 2]; 8 9 void pushup(int rt) 10 { 11 if (rt >> 1 % 5

hdu 1216 (vector || 打表)

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1216 Assistance Required Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 1468    Accepted Submission(s): 764 Problem Description After the 1997/19

hdu 4288 线段树+离线+离散化

http://acm.hdu.edu.cn/showproblem.php?pid=4288 开始的时候,果断TLE,做的方法是,线段树上仅仅维护%5==3的坐标,比如1 2 3 4 5 6 7  如果删除第三个数,就将3,6的位置全+1,就是向右偏移以为,但是求和还是很慢,所以即使10秒,还是TLE... 正确做法: 1.节点内维护sum[0...4]分别代表区间内%5==i的和 2.结点维护点的个数,cnt 3.离散化处理,然后每次插入时,经过的结点cnt+1或-1,叶子节点Sum[0]就是