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]的 ...
随机推荐
- html5--5-5 绘制填充矩形
html5--5-5 绘制填充矩形 学习要点 掌握绘制矩形的方法:strkeRect()/fillRect() 掌握绘制路径的 beginPath()和closePath() 矩形的绘制方法 rect ...
- hdu 1280 前m大的数(排序)
题意:排序 思路:排序 #include<iostream> #include<stdio.h> #include<algorithm> using namespa ...
- nyoj 1030 hihocoder 1338
题目链接1: 点这里打开. 题目链接2: 点击打开链接 思路:dp,dp[i][j] 表示某个人在区间 i,j上的得分. sum数组表示前 n 项和, num 数组用来存输入的数字. 因为取数字是 ...
- ASoC框架
ASoC框架分为3部分: 1. platform(用来描述芯片的DAI接口,负责数据传输): DAI:snd_soc_dai_driver, 用来表示支持哪些格式数据, 提供设置格式的函数, 启动数据 ...
- Uploadify API在项目上的应用
在项目开发中,前端使用easyui,jq的时候,我么涉及到导入的时候都要用到这个上传插件,用法是: 1:先初始化上传控件 2:打开导入的easyui dialog弹出框,dialog里面将上传的inp ...
- flex(1)
flex使用的actionscript语言遵守ECMA-262标准,这与javascript语言是一致的,由此可见二者语法的相似.
- lua中文教程【高级知识】
一.编译和运行和调试 1.lua和其他解释型语言一样,先转换成为中间码再执行 2.dofile和loadfile的区别:loadfile编译返回不执行,返回错误代码:dofile执行,返回错误信息 3 ...
- POJ 3262 Protecting the Flowers 贪心(性价比)
Protecting the Flowers Time Limit: 2000MS Memory Limit: 65536K Total Submissions: 7812 Accepted: ...
- HDU2846【字典树】
题意: 百度. 思路: 一个串的插入只能搞出这个串的前缀,然而对于要query的串是子串,所以插入的时候暴力插入所有字母开头的串.... 然后还要注意到自己的串本身会叠加字典树中的前缀,要标记掉. # ...
- 在OpenCV for Android 2.4.5中使用SURF(nonfree module)
http://blog.csdn.net/ruifdu/article/details/9120559 在OpenCV4Android中没有nonfree module,因此也就没有了SURF和SIF ...