hdu 4288 离线线段树+间隔求和
Coder
Time Limit: 20000/10000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 4838 Accepted Submission(s): 1853
an algorithm that will replace many other employees. An added benefit to the employer is that the coder will also become redundant once their work is done. 1
You are now the signle coder, and have been assigned a new task writing code, since your boss would like to replace many other employees (and you when you become redundant once your task is complete).
Your code should be able to complete a task to replace these employees who do nothing all day but eating: make the digest sum.
By saying “digest sum” we study some properties of data. For the sake of simplicity, our data is a set of integers. Your code should give response to following operations:
1. add x – add the element x to the set;
2. del x – remove the element x from the set;
3. sum – find the digest sum of the set. The digest sum should be understood by

where the set S is written as {a1, a2, ... , ak} satisfying a1 < a2 < a3 < ... < ak
Can you complete this task (and be then fired)?
------------------------------------------------------------------------------
1 See http://uncyclopedia.wikia.com/wiki/Algorithm
In each test case, the first line contains one integer N ( 1 <= N <= 105 ), the number of operations to process.
Then following is n lines, each one containing one of three operations: “add x” or “del x” or “sum”.
You may assume that 1 <= x <= 109.
Please see the sample for detailed format.
For any “add x” it is guaranteed that x is not currently in the set just before this operation.
For any “del x” it is guaranteed that x must currently be in the set just before this operation.
Please process until EOF (End Of File).
add 1
add 2
add 3
add 4
add 5
sum
add 6
del 3
sum
6
add 1
add 3
add 5
add 7
add 9
sum
4
5
/*
hdu 4288 离线线段树+间隔求和
分别有添加,删除,求和
sum是求 i%5==3的所有数的和,而且数列满足a[0] < a[1] ......
开始以为只会在数列后面添加,然后WR
而且最开始觉得求和很麻烦,于是试了下暴力点的TLE 所以先对所有要用的数进行处理,然后每次找出它们应该在的位置,进行插入删除即可。
主要是没想到两边有规律能推出公式,sum[j]保存当前区间mod 5为j的和
tree[i].sum[j]=(ll)(tree[lson].sum[j]+tree[rson].sum[((j-tree[lson].cnt)%5+5)%5]); hhh-2016-03-02 23:14:26
*/
#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <algorithm>
#include <cmath>
#include <map>
#include <queue>
#include <vector>
#define lson (i<<1)
#define rson (i<<1|1)
using namespace std;
typedef long long ll;
typedef long double ld;
const int maxn = 500000+10;
int x[maxn];
int tp[maxn],tot;
char opr[maxn][10];
struct node
{
int l,r;
ll sum[6];
int cnt;
int mid()
{
return (l+r)>>1;
}
} tree[maxn<<2];
int flag;
void push_up(int i)
{
for(int j = 0; j < 5; j++)
{
tree[i].sum[j] = (ll)(tree[lson].sum[j]+tree[rson].sum[((j-tree[lson].cnt)%5+5)%5]);
}
} void build(int i,int l,int r)
{
tree[i].l=l,tree[i].r=r;
tree[i].cnt = 0;
memset(tree[i].sum,0,sizeof(tree[i].sum));
int mid = tree[i].mid();
if(l == r)
return;
build(lson,l,mid);
build(rson,mid+1,r);
} void update(int i,int k,int val)
{
tree[i].cnt += 2*flag-1;
if(tree[i].l == k && tree[i].r == k)
{
tree[i].sum[0] = flag*val;
return ;
}
int mid = tree[i].mid();
if(k <= mid)update(lson,k,val);
else update(rson,k,val);
push_up(i);
} int Search(int k)
{
int l = 0,r = tot-1;
while(l<=r)
{
int mid = (l+r)>>1;
if(tp[mid]<k)
l = mid+1;
else if(tp[mid]>k)
r = mid-1;
else
return mid;
}
}
int main()
{
int n;
while(scanf("%d",&n) != EOF)
{
tot = 0;
for(int i = 0; i<n; i++)
{
scanf("%s",opr[i]);
if(opr[i][0] != 's')
{
scanf("%d",&x[i]);
tp[tot++] = x[i];
}
}
sort(tp,tp+tot);
tot = unique(tp,tp+tot)-tp;//去重
if(!tot)
memset(tree[1].sum,0,sizeof(tree[1].sum));
else
build(1,0,tot);
for(int i =0; i < n; i++)
{
if(opr[i][0] == 's')
{
printf("%I64d\n",tree[1].sum[2]);
}
else if(opr[i][0] == 'a')
{
flag = 1;
int pos = Search(x[i]);
update(1,pos,x[i]);
}
else if(opr[i][0] == 'd')
{
flag =0 ;
int pos = Search(x[i]);
update(1,pos,x[i]);
}
}
}
return 0;
}
hdu 4288 离线线段树+间隔求和的更多相关文章
- hdu 4288 Coder (线段树+离线)
题意: 刚开始有一个空集合.有三种操作: 1.往集合中加入一个集合中不存在的数 x 2.从集合中删除一个已经存在的数 x 3.计算集合的digest sum并输出. digest sum求 ...
- HDU 4288 Coder(线段树)
题意: 给定三种操作 1. add x 向序列中添加x,添加之后序列还保持有序 2. del x 删除序列中值为x的元素 3. sum 求下边模5等于3的元素和 思路: 直接暴力也可以过,就是看暴 ...
- hdu 3333 离线线段树 + 思维/树状数组 /在线主席树
#include<iostream> #include<cstdio> #include<string> #include<cmath> #includ ...
- HDU 3333 & 离线+线段树
题意: 统计一段区间内不同数字之和.如1 1 2 3 1 统计2---5即1+2+3. SOL: 很少打过离线的题目...这种可离线可在线的题不管怎么样一般都是强行在线... 考虑这题,此前做过一个类 ...
- hdu 4267 线段树间隔更新
A Simple Problem with Integers Time Limit: 5000/1500 MS (Java/Others) Memory Limit: 32768/32768 K ...
- HDU 5700 区间交 离线线段树
区间交 题目连接: http://acm.hdu.edu.cn/showproblem.php?pid=5700 Description 小A有一个含有n个非负整数的数列与m个区间.每个区间可以表示为 ...
- POJ 2823 Sliding Window 线段树区间求和问题
题目链接 线段树区间求和问题,维护一个最大值一个最小值即可,线段树要用C++交才能过. 注意这道题不是求三个数的最大值最小值,是求k个的. 本题数据量较大,不能用N建树,用n建树. 还有一种做法是单调 ...
- hdu 4031 attack 线段树区间更新
Attack Time Limit: 5000/3000 MS (Java/Others) Memory Limit: 65768/65768 K (Java/Others)Total Subm ...
- hdu 3016 dp+线段树
Man Down Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total S ...
随机推荐
- centos 开放端口
1.修改文件/etc/sysconfig/iptables [root@zsq ~]# cd /etc/sysconfig/[root@zsq sysconfig]# vi iptables 文件内容 ...
- bzoj千题计划243:bzoj2325: [ZJOI2011]道馆之战
http://www.lydsy.com/JudgeOnline/problem.php?id=2325 设线段树节点区间为[l,r] 每个节点维护sum[0/1][0/1] 从l的A/B区域到r的 ...
- style scoped
scoped: 只在父div和其内容内生效,
- Python 黑客相关电子资源和书籍推荐
原创 2017-06-03 玄魂工作室 玄魂工作室 继续上一次的Python编程入门的资源推荐,本次为大家推荐的是Python网络安全相关的资源和书籍. 在去年的双11送书的时候,其实送过几本Pyth ...
- LXC学习实践(3)快速体验第一个容器
1.搭建第一个 LXC 虚拟计算机 #yum install lxc* 2.安装软件包后要检查 Linux 发行版的内核对 LXC 的支持情况,可以使用下面命令 #lxc-checkconfig #l ...
- 版本名称GA的含义:SNAPSHOT->alpha->beta->release->GA
SNAPSHOT->alpha->beta->release->GA ----------------------------------------------------- ...
- zabbix配置微信报警
首先我们先目睹下微信报警的效果 接下来我们正式开始操作. 一:注册企业微信. 打开企业微信注册:http://work.weixin.qq.com 根据以上提示填入相应的内容,然后注册即可. 二:登录 ...
- mysql(3)—— 内连接、外连接的区别
先来看一下,内连接的语法: SELECT XXX FROM XXX INNER JOIN XXX ON XXX; 这里 INNER 可以省略,在上一篇博客中我们对于笛卡尔积现象的研究中(http:/ ...
- python、java实现二叉树,细说二叉树添加节点、深度优先(先序、中序、后续)遍历 、广度优先 遍历算法
数据结构可以说是编程的内功心法,掌握好数据结构真的非常重要.目前基本上流行的数据结构都是c和c++版本的,我最近在学习python,尝试着用python实现了二叉树的基本操作.写下一篇博文,总结一下, ...
- Python之面向对象四
面向对象进阶 一.关于面向对象的两个内置函数 isinstance 判断类与对象的关系 isinstance(obj,cls)检查obj是否是类 cls 的对象,返回值是bool值 issu ...