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]的 ...
随机推荐
- Telnet连接远程服务器
使用Telnet远程连接服务器端 现在大多数人使用win7系统.在win7系统中默认已经安装好了telnet服务,我们只需要从服务中将其打开即可, 步骤在首先打开控制面板-->卸载程序--> ...
- html5--5-7 绘制圆/弧
html5--5-7 绘制圆/弧 学习要点 掌握arc() 方法创建圆弧/曲线(用于创建圆或部分圆) 矩形的绘制方法 rect(x,y,w,h)创建一个矩形 strokeRect(x,y,w,hx,y ...
- 矩阵管理——和visitor模式没有本质区别,都是为了避免资源重复
矩阵管理中的员工是双线汇报的模式.其上司有两个,一个是流程上司,一个是专业上司.流程上司负责你的日常考核,专业上司负责你的晋升和任免. 管理条件 相对于矩阵管理的矩阵式组织,适合于某些较为庞大的全球性 ...
- get_extension_funcs 返回某个模块下的所有函数
array get_extension_funcs ( string $module_name ) (参数必选) 该函数根据 module_name 返回模块内定义的所有函数的 ...
- 错误 128 无法将类型“string”隐式转换为“System.Windows.Forms.DataGridViewTextBoxColumn”
原因是DataGridView中列的Name属性值和DataPropertyName属性值一样,比如Name="CardID",DataPropertyName="Car ...
- ABI(Application Binary Interface)
拷贝自维基百科,参考百度百科 ==>调用栈结构与系统相关. 在计算机中,应用二进制接口(英语:application binary interface,缩写为 ABI)描述了应用程序(或者其他类 ...
- c++的const总结(转)
为什么使用const?采用符号常量写出的代码更容易维护:指针常常是边读边移动,而不是边写边移动:许多函数参数是只读不写的.const最常见用途是作为数组的界和switch分情况标号(也可以用枚举符代替 ...
- 20个Flutter实例视频教程-第14节: 展开闭合列表案例
博客地址; https://jspang.com/post/flutterDemo.html#toc-5b0 视频地址: https://www.bilibili.com/video/av397092 ...
- Flutter实战视频-移动电商-57.购物车_在Model中增加选中字段
57.购物车_在Model中增加选中字段 先修改model类 model/cartInfo.dart类增加是否选中的属性 修改provide 修改UI部分pages/cart_page/cart_it ...
- java8--List转为Map、分组、过滤、求和等操作
利用java8新特性,可以用简洁高效的代码来实现一些数据处理~ 定义1个Apple对象: public class Apple { private Integer id; private String ...