hdu 4288 线段树 暴力 **
题意:
维护一个有序数列{An},有三种操作:
1、添加一个元素。
2、删除一个元素。
3、求数列中下标%5 = 3的值的和。
解题思路:
看的各种题解,今天终于弄懂了。
由于线段树中不支持添加、删除操作,所以题解写的是用离线做法。
我们来看它是如何解决添加、删除的问题的。
首先将所有出现过的数记录下来,然后排序去重,最后根据去重结果建树,然后每个操作数都会对应线段树中的一个点。
遇到添加、删除操作的时候,只要把那个节点的值改变,然后将它对下标的影响处理好就可以。
那么如何处理这些操作对下标的影响呢?
现在我们考虑一个父区间,假设它的左右子区间已经更新完毕。
显然,左区间中下标%5的情况与父区间中%5的情况完全相同;
可是,右区间中却不一定相同,因为右区间中的下标是以 mid 当作 1 开始的。
那么,只要我们知道左区间中有效元素的个数 cnt,我们就能知道右区间中的下标 i 在父区间中对应的下标为 i+cnt。
所以,虽然我们最终要的只是总区间中下标%5 = 3的和。但是在更新时我们需要知道右区间%5的所有情况。
于是我们要在线段树的每个节点开一个 sum[5] 和一个 cnt,分别记录这个节点中下标%5的5种情况的和与有效元素的个数。
而查询时,直接访问总区间的 sum[3] 即可。
如此,题目便可解了。复杂度O(M logN logN)。
以前用的是线段树,这次用暴力来了一发
#include<cstdio>
#include<iostream>
#include<algorithm>
#include<cstring>
#include<cmath>
#include<queue>
#include<map>
using namespace std;
#define MOD 1000000007
const int INF=0x3f3f3f3f;
const double eps=1e-;
typedef long long ll;
#define cl(a) memset(a,0,sizeof(a))
#define ts printf("*****\n");
const int N=;
int n,m,tt;
int main()
{
int i,j,k,ca=;
#ifndef ONLINE_JUDGE
freopen("1.in","r",stdin);
#endif
while(scanf("%d",&n)!=EOF)
{
int len=;
vector<int> vc;
int x;
vector<int>::iterator it;
char s[];
while(n--)
{
scanf("%s",s);
if(s[]=='a')
{
len++;
scanf("%d",&x);
it=lower_bound(vc.begin(),vc.end(),x);
vc.insert(it,x);
}
else if(s[]=='d')
{
len--;
scanf("%d",&x);
it=lower_bound(vc.begin(),vc.end(),x);
vc.erase(it);
}
else
{
ll sum=;
for(i=;i<len;i+=)
{
sum+=vc[i];
}
printf("%I64d\n",sum);
}
}
}
}
#include<cstdio>
#include<iostream>
#include<algorithm>
#include<cstring>
#include<cmath>
#include<queue>
#define lson l,mid,rt<<1
#define rson mid+1,r,rt<<1|1
#define root 1,n,1
#define mid ((l+r)>>1)
#define ll long long
#define cl(a) memset(a,0,sizeof(a))
#define ts printf("*****\n");
using namespace std;
const int MAXN=;
ll sum[MAXN<<][];
vector<int> num;
int cnt[MAXN<<],val[MAXN];
char cz[MAXN],s[];
int n,m,t;
int getid(int v)
{
return lower_bound(num.begin(),num.end(),v)-num.begin()+;
}
void pushup(int rt)
{
cnt[rt]=cnt[rt<<]+cnt[rt<<|];
for(int i=;i<;i++) sum[rt][i]=sum[rt<<][i];
for(int i=;i<;i++) sum[rt][(i+cnt[rt<<])%]+=sum[rt<<|][i]; //这两个不能放一起,找了好长时间
}
int tot=;
void update(int pos,int v,int l,int r,int rt)
{
if(l==r)
{
sum[rt][]=num[pos-]*v;
cnt[rt]=v;
return;
}
if(pos<=mid) update(pos,v,lson);
else update(pos,v,rson);
pushup(rt);
}
int main()
{
int i,j,k,q;
#ifndef ONLINE_JUDGE
freopen("1.in","r",stdin);
#endif
while(~scanf("%d",&n))
{
num.clear();
for(i=;i<=n;i++)
{
scanf("%s",s);
cz[i]=s[];
if(s[]!='s')
{
scanf("%d",val+i);
num.push_back(val[i]);
}
}
cl(sum),cl(cnt);
sort(num.begin(),num.end());
num.erase(unique(num.begin(),num.end()),num.end());
int sumn=num.size();
for(int i=;i<=n;i++)
{
if(cz[i] == 'a') update(getid(val[i]),,,sumn,);
else if(cz[i] == 'd') update(getid(val[i]),,,sumn,);
else printf("%I64d\n",sum[][]);
}
}
return ;
}
hdu 4288 线段树 暴力 **的更多相关文章
- hdu 6430 线段树 暴力维护
Problem E. TeaTree Time Limit: 8000/4000 MS (Java/Others) Memory Limit: 524288/524288 K (Java/Oth ...
- V - Can you answer these queries? HDU - 4027 线段树 暴力
V - Can you answer these queries? HDU - 4027 这个题目开始没什么思路,因为不知道要怎么去区间更新这个开根号. 然后稍微看了一下题解,因为每一个数开根号最多开 ...
- hdu 4288 线段树+离线+离散化
http://acm.hdu.edu.cn/showproblem.php?pid=4288 開始的时候,果断TLE,做的方法是,线段树上只维护%5==3的坐标,比方1 2 3 4 5 6 7 假设 ...
- HDU 4288 线段树+离散化
题意: n个操作 在[1, 100000] 的区间上add 或del数( 必不会重复添加或删除不存在的数) sum 求出整个集合中 (下标%5 == 3 位置) 的数 的和 注意数据类型要64位 ...
- hdu 5877 线段树(2016 ACM/ICPC Asia Regional Dalian Online)
Weak Pair Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 262144/262144 K (Java/Others)Total ...
- hdu 3974 线段树 将树弄到区间上
Assign the task Time Limit: 15000/5000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) ...
- hdu 3436 线段树 一顿操作
Queue-jumpers Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) To ...
- hdu 3397 线段树双标记
Sequence operation Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Othe ...
- hdu 4578 线段树(标记处理)
Transformation Time Limit: 15000/8000 MS (Java/Others) Memory Limit: 65535/65536 K (Java/Others) ...
随机推荐
- php内核和瓦力上线部署
http://www.php-internals.com/ http://www.walle-web.io/
- [转]Unchecked Exception 和 Checked Exception 比较
Throwable类是所有异常的始祖,它有两个直接子类Error / Exception: Error仅在Java虚拟机中发生动态连接失败或其它的定位失败的时候抛出一个Error对象.一般程序不用 ...
- Python操作PDF与Tiff文件
1.PDF文件的合并与拆分 pypdf http://www.douban.com/note/455252403/ http://www.redicecn.com/html/Python/201301 ...
- Qt 程序运行图标
Qt5 添加程序图标在pro直接添加一句: RC_ICONS+=resource\appicons\app.ico resource程序代码目录下文件夹. Qt4方式 1.在工程文件夹新建一个res目 ...
- Django~queries
API queries create, retrieve, update and delete
- [转] git fetch与pull
原文: http://www.tech126.com/git-fetch-pull/ Git中从远程的分支获取最新的版本到本地有这样2个命令:1. git fetch:相当于是从远程获取最新版本到本地 ...
- hdu 1556.Color the ball 解题报告
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1556 题目意思:有 n 个气球从左到右排成一排,编号依次为1,2,3,...,n.给出 n 对 a, ...
- ORACLE、MYSQL的JDBC配置
info.jdbc.driverClassName=oracle.jdbc.driver.OracleDriver info.jdbc.url=jdbc:oracle:thin:@192.168.18 ...
- 【Git】笔记5 分支管理2
来源:廖雪峰 通常,合并分支时,如果可能,Git会用Fast forward模式,但这种模式下,删除分支后,会丢掉分支信息. 如果要强制禁用Fast forward模式,Git就会在merge时生成一 ...
- -bash: pod: command not found
OS X 系统没升级之前用的 cocoapods 一点儿问题都没有,但是升级成版本10.11.4 OS X EI Capitan之后,在终端除了cd 指令可以用之外,其他任何指令输入都是提示-bash ...