hdu 3333 离线线段树 + 思维/树状数组 /在线主席树
#include<iostream>
#include<cstdio>
#include<string>
#include<cmath>
#include<cstring>
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const ll maxn = + ;
ll a[ + ]; struct tree
{
ll l , r;
ll val;
}t[maxn << ]; void push_up(ll rt){
//if(t[rt << 1].val != t[rt << 1|1].val)
t[rt].val = t[rt << ].val + t[rt << |].val;
//else
// t[rt].val += t[rt << 1].val ;
} void build(ll rt,ll l ,ll r){
t[rt].l = l;
t[rt].r = r;
t[rt].val = ;
if(l == r){
//t[rt].val = a[l];
return;
}
ll mid = (l + r) >> ;
build(rt << , l , mid);
build(rt << |,mid+,r);
push_up(rt);
} void updata(ll rt,ll x,ll v){
if(x == t[rt].l && t[rt].r == x){
t[rt].val += v;
return;
}
ll mid = (t[rt].l + t[rt].r) >> ;
if(x <= mid) updata(rt << , x , v);
else updata(rt << |, x , v);
push_up(rt);
} ll query(ll rt,ll l,ll r){
if(l <= t[rt].l && r >= t[rt].r) return t[rt].val;
ll ret = ;
ll mid = (t[rt].l + t[rt].r) >> ;
// if(r <= mid) return query(rt << 1, l, r);
// else if(l > mid) return query(rt << 1|1,l,r);
// else return query(rt << 1,l,mid) + query(rt << 1|1,mid + 1,r);
if (l <= mid) ret += query(rt << , l ,r);
if( r > mid) ret += query(rt << |,l,r);
push_up(rt);
return ret;
} struct node
{
ll x,y,id;
}nod[ + ];
map<ll,ll> mp;
bool cmp(node s1 ,node s2){
//if(s1.y == s2.y)
// return s1.x < s2.x;
return s1.y < s2.y; }
ll ans[ + ];
int main(int argc, char const *argv[])
{
ll tt;
scanf("%lld",&tt);
while(tt--){
ll n;
memset(a,,sizeof a);
memset(t,,sizeof t);
memset(ans,,sizeof ans);
mp.clear();
memset(nod,,sizeof nod);
scanf("%lld",&n);
for(ll i = ;i <= n ; i++){
scanf("%lld",&a[i]);
}
build(,,n);
ll q;
scanf("%lld",&q);
for(ll i = ;i <= q; i++){
ll a,b;
scanf("%lld%d",&a,&b);
//printf("%lld\n",query(1,a,b));
nod[i].x = a,nod[i].y = b,nod[i].id = i;
}
ll i = ;
sort(nod + ,nod + q + ,cmp); for(ll j = ; j <= q;j ++){
for( ;i <= nod[j].y ; i++){
if(mp[a[i]])
//mp[a[i]] = 1; updata(,mp[a[i]],-a[i]);
// mp[a[i]] =
//cout << 1 ;
mp[a[i]] = i;
updata(,i,a[i]);
}
// cout << 3 << endl ;
// cout << nod[j].id << " " << nod[j].x << " " << nod[j].y <<endl;
ans[nod[j].id] = query(,nod[j].x,nod[j].y);
// cout << 1 << endl;
}
// cout << 1 ;
//cout << q << endl;
for(ll i = ;i <= q;i ++){
printf("%lld\n",ans[i] );
}
}
return ;
}
线段树
hdu 3333 离线线段树 + 思维/树状数组 /在线主席树的更多相关文章
- SPOJ3267 D-query 离线+树状数组 在线主席树
分析:这个题,离线的话就是水题,如果强制在线,其实和离线一个思路,然后硬上主席树就行了 离线的代码 #include <iostream> #include <stdio.h> ...
- BZOJ2120:数颜色(数状数组套主席树)(带修改的莫对)
墨墨购买了一套N支彩色画笔(其中有些颜色可能相同),摆成一排,你需要回答墨墨的提问.墨墨会像你发布如下指令: 1. Q L R代表询问你从第L支画笔到第R支画笔中共有几种不同颜色的画笔. 2. R P ...
- [bzoj3196][Tyvj1730]二逼平衡树_树套树_位置线段树套非旋转Treap/树状数组套主席树/权值线段树套位置线段树
二逼平衡树 bzoj-3196 Tyvj-1730 题目大意:请写出一个维护序列的数据结构支持:查询给定权值排名:查询区间k小值:单点修改:查询区间内定值前驱:查询区间内定值后继. 注释:$1\le ...
- BZOJ_3196_Tyvj 1730 二逼平衡树_树状数组套主席树
BZOJ_3196_Tyvj 1730 二逼平衡树_树状数组套主席树 Description 您需要写一种数据结构(可参考题目标题),来维护一个有序数列,其中需要提供以下操作: 1.查询k在区间内的排 ...
- ZOJ 2112 Dynamic Rankings(树状数组套主席树 可修改区间第k小)题解
题意:求区间第k小,节点可修改 思路:如果直接用静态第k小去做,显然我更改一个节点后,后面的树都要改,这个复杂度太高.那么我们想到树状数组思路,树状数组是求前缀和,那么我们可以用树状数组套主席树,求出 ...
- BZOJ 2141 排队(树状数组套主席树)
解法很多的题,可以块套树状数组,可以线段树套平衡树.我用的是树状数组套主席树. 题意:给出一段数列,m次操作,每次操作是交换两个位置的数,求每次操作后的逆序对数.(n,m<=2e4). 对于没有 ...
- Codeforces Round #404 (Div. 2) E. Anton and Permutation(树状数组套主席树 求出指定数的排名)
E. Anton and Permutation time limit per test 4 seconds memory limit per test 512 megabytes input sta ...
- 【Luogu】P2617Dynamic Ranking(树状数组套主席树)
题目链接 树状数组套主席树有点难懂qwq 不好理解 树状数组套主席树的直观理解应该是:树状数组的每一个节点是一棵主席树. 普通区间修改我们是创建1个线段树,树状数组套主席树的时候我们就创建log个线段 ...
- bzoj1901--树状数组套主席树
树状数组套主席树模板题... 题目大意: 给定一个含有n个数的序列a[1],a[2],a[3]--a[n],程序必须回答这样的询问:对于给定的i,j,k,在a[i],a[i+1],a[i+2]--a[ ...
随机推荐
- vim 复制
要复制到别的地方,用 "+y 来复制,注意是三个字符.gg"+yG 1.复制 1)单行复制 在命令模式下,将光标移动到将要复制的行处,按“yy”进行复制: 2)多行复制 在命令模式 ...
- 设计模式学习笔记——Bridge 桥接模式
先说一下我以前对桥接模式的理解:当每个类中都使用到了同样的属性或方法时,应该将他们单独抽象出来,变成这些类的属性和方法(避免重复造轮子),当时的感觉是和三层模型中的model有点单相似,也就是让mod ...
- Android环境配置之正式版AndroidStudio1.0
昨天看见 Android Studio 1.0 正式版本发布了:心里挺高兴的. 算是忠实用户了吧,从去年开发者大会一开始出现 AS 后就开始使用了:也是从那时开始就基本没有用过 Eclipse 了:一 ...
- RabbitMQ中Confirm确认与Return返回消息详解(八)
理解Confirm消息确认机制: 消息的确认,是指生产者投递消息后,如果Broker收到消息,则会给我们生产这一个应答. 生产者进行接收应答,用来确定这条消息是否正常的发送到Broker,这种方式也是 ...
- nginx修改默认运行80端口的方法
修改方法 很简单,修改nginx的配置文件, 对应的值,如图: 将其改为别的端口号,就可以了.
- VMware 15 搭建MacOS 10.14教程
写于2018.12.23 教程原文链接:https://pan.baidu.com/s/1wvNYg_MQH_lwewKbpCQ5_Q ———————————————————————————————— ...
- Linux shell - 重命名文件和文件夹(mv)
linux下重命名文件或文件夹的命令mv既可以重命名,又可以移动文件或文件夹. 例子:将目录A重命名为B mv A B 例子:将/a目录移动到/b下,并重命名为c mv /a /b/c
- Understanding RequireJS for Effective JavaScript Module Loading
Modular programming is used to break large applications into smaller blocks of manageable code. Modu ...
- ERROR 1366 (HY000): Incorrect string value:MySQL数据库、表的字符集为GBK
mysql> update userinfo set MEDIASOURCE = 'CS02-北京' where IMPORTNO = 'IMP201640613101206';ERROR 13 ...
- JXLS (Excel导入、导出工具使用)
JXLS (Excel导入.导出工具使用) 1:简介: jxls是一个简单的.轻量级的excel导出库,使用特定的标记在excel模板文件中来定义输出格式和布局.java中成熟的excel导出工具有p ...