Coder(线段树)
求一部分和的线段树,因为是对5取余,所以给定一段区间a-b,假设其位置会有变化,最多会有5种和,那么就可以保留这五种和,在用lz进行延迟标记时,保存位置变化了多少也就知道了该从当前和转到哪一个和。
当时把lz标记那么部分写成覆盖了,应该是+=,WA了两次。
#include <iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<stdlib.h>
#include<vector>
#include<cmath>
#include<queue>
#include<set>
#include<map>
using namespace std;
#define N 100010
#define LL __int64
#define INF 0xfffffff
const double eps = 1e-;
const double pi = acos(-1.0);
const double inf = ~0u>>;
map<int,int>f;
LL s[N<<][];
int lz[N<<],fg[N<<],a[N];
struct node
{
int x;
char sr[];
}p[N];
void up(int w)
{
int i;
for(i = ; i < ; i++)
s[w][i] = s[w<<][i]+s[w<<|][i];
fg[w] = fg[w<<]+fg[w<<|];
}
void down(int w,int m)
{
int i;
if(lz[w])
{
lz[w<<] += lz[w];
lz[w<<|] += lz[w];
LL x[],y[];
for(i = ;i < ; i++)
{
x[i] = s[w<<][i];
y[i] = s[w<<|][i];
}
for(i = ; i < ; i++)
{
s[w<<][(i+lz[w]%+)%] = x[i];
s[w<<|][(i+lz[w]%+)%] = y[i];
}
lz[w] = ;
}
}
void build(int l,int r,int w)
{
if(l==r)
{
for(int i = ;i < ; i++)
{
s[w][i] = ;
}
fg[w] = ;
return ;
}
int m = (l+r)>>;
build(l,m,w<<);
build(m+,r,w<<|);
up(w);
}
void update(int a,int b,int d,int l,int r,int w)
{
if(a<=l&&b>=r)
{
int i;
LL x[];
for(i = ; i < ; i++)
{
x[i] = s[w][i];
}
for(i = ; i < ; i++)
s[w][(i+d+)%] = x[i];
lz[w] += d;
return ;
}
down(w,r-l+);
int m = (l+r)>>;
if(a<=m) update(a,b,d,l,m,w<<);
if(b>m) update(a,b,d,m+,r,w<<|);
up(w);
}
void add(int p,int d,int po,int flag,int l,int r,int w)
{
if(l==r)
{
int i;
if(flag)
{
for(i = ; i < ; i++)
if((po+)%==i)
{
s[w][i] = d;
//if(d==4) cout<<i<<endl;
}
else s[w][i] = ;
fg[w] = ;
}
else
{
for(i = ; i< ; i++)
s[w][i] = ;
fg[w] = ;
}
return ;
}
down(w,r-l+);
int m = (l+r)>>;
if(p<=m) add(p,d,po,flag,l,m,w<<);
else add(p,d,po,flag,m+,r,w<<|);
up(w);
}
int query(int a,int b,int l,int r,int w)
{
if(a<=l&&b>=r)
return fg[w];
int m = (l+r)>>;
int res = ;
down(w,r-l+);
if(a<=m)
res+=query(a,b,l,m,w<<);
if(b>m)
res+=query(a,b,m+,r,w<<|);
return res;
}
int main()
{
int n,i;
while(scanf("%d",&n)!=EOF)
{
memset(lz,,sizeof(lz));
f.clear();
int g = ;
for(i = ; i <= n ;i++)
{
scanf("%s",p[i].sr);
if(p[i].sr[]=='s') continue;
scanf("%d",&p[i].x);
a[++g] = p[i].x;
}
sort(a+,a+g+);
int o = ;
f[a[]] = ;
for(i = ; i <= g; i++)
if(a[i]!=a[i-])
f[a[i]] = ++o;
build(,o,);
for(i = ; i <= n ;i++)
{
if(p[i].sr[]=='a')
{
int k = query(,f[p[i].x],,o,);
add(f[p[i].x],p[i].x,k,,,o,);
if(f[p[i].x]<o)
update(f[p[i].x]+,o,,,o,);
}
else if(p[i].sr[]=='d')
{
//int k = query(1,f[p[i].x],1,o,1);
add(f[p[i].x],p[i].x,,,,o,);
if(f[p[i].x]<o)
update(f[p[i].x]+,o,-,,o,); }else
printf("%I64d\n",s[][]);
}
}
return ;
}
Coder(线段树)的更多相关文章
- HDU4288:Coder(线段树单点更新版 && 暴力版)
Problem Description In mathematics and computer science, an algorithm describes a set of procedures ...
- hdu4428(Coder)线段树
Coder Time Limit: 20000/10000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Sub ...
- HDU4288 Coder(线段树)
注意添加到集合中的数是升序的,先将数据读入,再离散化. sum[rt][i]表示此节点的区域位置对5取模为i的数的和,删除一个数则右边的数循环左移一位,添加一个数则右边数循环右移一位,相当于循环左移4 ...
- HDU 4288 Coder(线段树)
题意: 给定三种操作 1. add x 向序列中添加x,添加之后序列还保持有序 2. del x 删除序列中值为x的元素 3. sum 求下边模5等于3的元素和 思路: 直接暴力也可以过,就是看暴 ...
- hdu 4288 Coder (线段树+离线)
题意: 刚开始有一个空集合.有三种操作: 1.往集合中加入一个集合中不存在的数 x 2.从集合中删除一个已经存在的数 x 3.计算集合的digest sum并输出. digest sum求 ...
- HDU 4288 Coder (线段树)
Coder 题目:http://acm.hdu.edu.cn/showproblem.php?pid=4288 题意:有三种类型的操作,(1)."add x",表示往集合里加入�数 ...
- 线段树(多棵) HDOJ 4288 Coder
题目传送门 题意:集合,add x, del x, 求和 分析:首先,暴力可以过这题.用上线段树能大大降低时间的消耗,具体就是类似开了5棵线段树,每个节点都有5个空间,表示该区间的id%5后的和,区间 ...
- 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]的 ...
随机推荐
- UUID 和 GUID 的区别(转)
UUID是一个由4个连字号(-)将32个字节长的字符串分隔后生成的字符串,总共36个字节长.比如:550e8400-e29b-41d4-a716-446655440000 http://gohands ...
- CQOI2017 部分题解
部分题解是指没写那道算几. BZOJ上目前没有day2的题面D2T2的图. BZOJ4813 小Q的棋盘 显然可以$O(n^2)$DP,然而可以$O(n)$贪心:只有一条从根出发的一条链上的边可以只经 ...
- AutoIT:界面与自动化操作结合来简化日常劳动: .Net Reactor验证License,设置License,创建License,截图AutoIt自动化实现。(七)
版本六中存在一个显著问题是: 当exe文件生存之后,运行的时候,通过consoleWrite函数打印出来的数据是无法展示出来的.这就存在一个问题:当运行失败的时候,我还是看不到任何log信息. 于是, ...
- C++对C的增强
一.namespace命名空间 1.C++命名空间基本常识所谓namespace,是指标识符的各种可见范围.c++标准程序库中的所有标识符都被定义与一个名为std的namespace中. 1.1:&l ...
- bzoj 3027 [Ceoi2004] Sweet —— 生成函数
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=3027 就是 (1+x+x2+...+xm[i]) 乘起来: 原来想和背包一样做,然而时限很短 ...
- json数组对象和对象数组 ---OK
一.Json的简单介绍 从结构上看,所有的数据最终都可以分成三种类型: 第一种类型是scalar(标量),也就是一个单独的string(字符串)或数字(numbers),比如“北京”这个单独的词. 第 ...
- Linux下使用《du》命令查看某文件及目录的大小
du -ah --max-depth=1 这个是我想要的结果 a表示显示目录下所有的文件和文件夹(不含子目录),h表示以人类能看懂的方式,max-depth表示目录的深度. du -sh 目 ...
- tetrahedron
题意: 求解一个四面体的内切球. 解法: 首先假设内切球球心为$(x0,x1,x2)$,可以用$r = \frac{3V}{S_1+S_2+S_3+S_4}$得出半径, 这样对于四个平面列出三个方程, ...
- jQuery.ajax各种参数及属性设置
$.ajax({ type: "post", url: url, dataType:'html', success: funct ...
- 3.11-3.14 Hive 企业使用优化2
一.查看HQL执行计划explain 1.explain hive在执行的时候会把所对应的SQL语句都会转换成mapreduce代码执行,但是具体的MR执行信息我们怎样才能看出来呢? 这里就用到了ex ...