HDU 4288 Coder(线段树)
题意:
给定三种操作
1. add x 向序列中添加x,添加之后序列还保持有序
2. del x 删除序列中值为x的元素
3. sum 求下边模5等于3的元素和
思路:
直接暴力也可以过,就是看暴力写的好不好了。用数组直接暴力可过。
暴力代码:
#include <cstdio>
#include <cstring>
#include <algorithm> using namespace std;
const int maxn = ;
typedef long long ll;
int a[maxn]; int main()
{
int n;
while (~scanf("%d", &n))
{
char cmd[];
int d;
int len = ;
while (n--)
{
scanf("%s", cmd);
if (cmd[] == 'a')
{
scanf("%d", &d);
int i;
for (i = len++; i >= ; i--)
{
if (a[i] <= d) break;
a[i + ] = a[i];
}
a[i + ] = d;
}
else if (cmd[] == 'd')
{
scanf("%d", &d);
int i;
for (i = ; i <= len; i++)
if (a[i] == d) break;
for (; i < len; i++)
a[i] = a[i + ];
len--;
}
else
{
ll ans = ;
for (int i = ; i <= len; i += )
ans += (ll)a[i];
printf("%lld\n", ans);
}
}
}
return ;
}
也可以用线段树来维护。先把所有的数据都读进来,然后离散化一下建树。树的每个节点维护一个sum[5],就是模上5之后的余数,还有一个当前区间的有多少个数字的个数。注意:每个节点的sum当中的下边都是对应线段树中该节点的下边来说的。所以叶子节点一定对应1,就是sum[0], 关键就是pushup,因为往上更新的时候,考虑一个父区间,它的左孩子区间对应的sum[i],就是父区间的sum[i],但是右区间的sum[i]对应的不是父区间的sum[i],而是sum[(i + lson.cnt)%5]。所以这样就可以做拉。
#include <cstdio>
#include <cstring>
#include <algorithm> using namespace std;
const int maxn = ;
typedef long long ll;
struct Tree {
int cnt;
ll sum[];
}tree[maxn << ];
int dat[maxn], tmp[maxn];
char cmd[maxn][];
void pushup(int rt)
{
for (int i = ; i < ; i++)
tree[rt].sum[i] = tree[rt<<].sum[i] + tree[rt<<|].sum[((i - tree[rt<<].cnt) % + ) % ];
tree[rt].cnt = tree[rt<<].cnt + tree[rt<<|].cnt;
//当然也可以这么写。
//int j = (i + tree[rt<<1].cnt) % 5;
//tree[rt].sum[j] = tree[rt<<1].sum[j] + tree[rt<<1|1].sum[i];
}
void build(int rt, int l, int r)
{
for (int i = ; i < ; i++) tree[rt].sum[i] = ;
tree[rt].cnt = ;
if (l == r) return;
int mid = (l + r) / ;
build(rt<<, l, mid);
build(rt<<|, mid + , r);
}
void update(int rt, int l, int r, int p, int val, int flag)
{
if (l == r)
{
tree[rt].cnt += flag;
tree[rt].sum[] = val;
return;
}
int mid = (l + r) / ;
if (p <= mid) update(rt<<, l, mid, p, val, flag);
else update(rt<<|, mid + , r, p, val, flag);
pushup(rt);
}
int main()
{
int n;
while (~scanf("%d", &n))
{
int num = ;
for (int i = ; i < n; i++) {
scanf("%s", cmd[i]);
if (cmd[i][] != 's')
{
scanf("%d", &dat[i]);
tmp[num++] = dat[i];
}
}
sort(tmp, tmp + num);
num = unique(tmp, tmp + num) - tmp; build(, , n);
for (int i = ; i < n; i++)
{
int p = lower_bound(tmp, tmp + num, dat[i]) - tmp;
if (cmd[i][] == 's')
printf("%lld\n", tree[].sum[]);
else if (cmd[i][] == 'a')
update(, , n, p, dat[i], );
else update(, , n, p, , -);
}
}
return ;
}
HDU 4288 Coder(线段树)的更多相关文章
- hdu 4288 Coder (线段树+离线)
题意: 刚开始有一个空集合.有三种操作: 1.往集合中加入一个集合中不存在的数 x 2.从集合中删除一个已经存在的数 x 3.计算集合的digest sum并输出. digest sum求 ...
- hdu 4288 离线线段树+间隔求和
Coder Time Limit: 20000/10000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total Su ...
- 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 ...
- HDU 4288 Coder (线段树)
Coder 题目:http://acm.hdu.edu.cn/showproblem.php?pid=4288 题意:有三种类型的操作,(1)."add x",表示往集合里加入�数 ...
- HDU 4288 Coder 【线段树+离线处理+离散化】
题意略. 离线处理,离散化.然后就是简单的线段树了.需要根据mod 5的值来维护.具体看代码了. /* 线段树+离散化+离线处理 */ #include <cstdio> #include ...
- HDU 4288 Coder ( 离散化 + 离线 + 线段树 )
这题跟ZOJ 3606的解题思路很相似. 题意:有3中操作:1.向集合中增加一个数x(1≤x≤1e9):2.从集合中删去一个数x(保证这个数存在):3.查询集合中所有位置满足i%5==3的数a[i]的 ...
- HDU 5877 dfs+ 线段树(或+树状树组)
1.HDU 5877 Weak Pair 2.总结:有多种做法,这里写了dfs+线段树(或+树状树组),还可用主席树或平衡树,但还不会这两个 3.思路:利用dfs遍历子节点,同时对于每个子节点au, ...
- HDU4288:Coder(线段树单点更新版 && 暴力版)
Problem Description In mathematics and computer science, an algorithm describes a set of procedures ...
随机推荐
- JS模块加载器加载原理是怎么样的?
路人一: 原理一:id即路径 原则.通常我们的入口是这样的: require( [ 'a', 'b' ], callback ) .这里的 'a'.'b' 都是 ModuleId.通过 id 和路径的 ...
- [BZOJ 2594] [Wc2006]水管局长数据加强版 【LCT】
题目链接:BZOJ - 2594 题目分析 这道题如果没有删边的操作,那么就是 NOIP2013 货车运输,求两点之间的一条路径,使得边权最大的边的边权尽量小. 那么,这条路径就是最小生成树上这两点之 ...
- uva 1428 - Ping pong
树状数组,把他们的技能值作为轴: 首先按照编号从小到大插入值,这样就可以得到,技能值比当前小的人数: 然后按照编号从大到小再插一遍: 代码: #include<cstdio> #inclu ...
- NWERC 2012 Problem I Idol
又是个2-sat的模板题: 反正评委的选择必须有一个是正确的,1错误,那么2就必须正确: 这就是一个2-sat问题. 直接上白书的模板啊,不过稍微要注意的一点是对于第一个点必须要选择,不然就违反了题意 ...
- 子窗体显示在任务栏,且子窗体中又有弹窗(CreateParams修改三个风格参数)
子窗体显示在任务栏时, procedure Tfrm_SendSmartMsg.CreateParams(var Params: TCreateParams);begin inherited; P ...
- 【HDOJ】1892 See you~
wa了十次,原来变量名写错.二维树状数组. #include <cstdio> #include <cstring> #define MAXN 1002 int nums[MA ...
- Error: opening registry key 'Software\JavaSoft\Java Runtime Environment' Error: could not find java.dll
java -jar yxCollector-1.1.0.jarError: opening registry key 'Software\JavaSoft\Java Runtime Environme ...
- House Robber II——Leetcode
After robbing those houses on that street, the thief has found himself a new place for his thievery ...
- js 中 json对象 与 json字符串 间相互转换
在数据传输过程中,json是以文本,即字符串的形式传递的,而JS操作的是JSON对象,所以,JSON对象和JSON字符串之间的相互转换是关键 JSON字符串: var str1 = '{ " ...
- Java程序员必知的8大排序算法
8种排序之间的关系 直接插入排序 (1)基本思想:在要排序的一组数中,假设前面(n-1)[n>=2] 个数已经是排 好顺序的,现在要把第n个数插到前面的有序数中,使得这n个数 也是排好顺序的.如 ...