#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 离线线段树 + 思维/树状数组 /在线主席树的更多相关文章

  1. SPOJ3267 D-query 离线+树状数组 在线主席树

    分析:这个题,离线的话就是水题,如果强制在线,其实和离线一个思路,然后硬上主席树就行了 离线的代码 #include <iostream> #include <stdio.h> ...

  2. BZOJ2120:数颜色(数状数组套主席树)(带修改的莫对)

    墨墨购买了一套N支彩色画笔(其中有些颜色可能相同),摆成一排,你需要回答墨墨的提问.墨墨会像你发布如下指令: 1. Q L R代表询问你从第L支画笔到第R支画笔中共有几种不同颜色的画笔. 2. R P ...

  3. [bzoj3196][Tyvj1730]二逼平衡树_树套树_位置线段树套非旋转Treap/树状数组套主席树/权值线段树套位置线段树

    二逼平衡树 bzoj-3196 Tyvj-1730 题目大意:请写出一个维护序列的数据结构支持:查询给定权值排名:查询区间k小值:单点修改:查询区间内定值前驱:查询区间内定值后继. 注释:$1\le ...

  4. BZOJ_3196_Tyvj 1730 二逼平衡树_树状数组套主席树

    BZOJ_3196_Tyvj 1730 二逼平衡树_树状数组套主席树 Description 您需要写一种数据结构(可参考题目标题),来维护一个有序数列,其中需要提供以下操作: 1.查询k在区间内的排 ...

  5. ZOJ 2112 Dynamic Rankings(树状数组套主席树 可修改区间第k小)题解

    题意:求区间第k小,节点可修改 思路:如果直接用静态第k小去做,显然我更改一个节点后,后面的树都要改,这个复杂度太高.那么我们想到树状数组思路,树状数组是求前缀和,那么我们可以用树状数组套主席树,求出 ...

  6. BZOJ 2141 排队(树状数组套主席树)

    解法很多的题,可以块套树状数组,可以线段树套平衡树.我用的是树状数组套主席树. 题意:给出一段数列,m次操作,每次操作是交换两个位置的数,求每次操作后的逆序对数.(n,m<=2e4). 对于没有 ...

  7. 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 ...

  8. 【Luogu】P2617Dynamic Ranking(树状数组套主席树)

    题目链接 树状数组套主席树有点难懂qwq 不好理解 树状数组套主席树的直观理解应该是:树状数组的每一个节点是一棵主席树. 普通区间修改我们是创建1个线段树,树状数组套主席树的时候我们就创建log个线段 ...

  9. bzoj1901--树状数组套主席树

    树状数组套主席树模板题... 题目大意: 给定一个含有n个数的序列a[1],a[2],a[3]--a[n],程序必须回答这样的询问:对于给定的i,j,k,在a[i],a[i+1],a[i+2]--a[ ...

随机推荐

  1. ESP8266-12F 中断

    外部中断: 基于ESP8266的NodeMcu的数字IO的中断功能是通过attachInterrupt,detachInterrupt函数所支持的.除了D0/GPIO16,中断可以绑定到任意GPIO的 ...

  2. 【leetcode】1128. Number of Equivalent Domino Pairs

    题目如下: Given a list of dominoes, dominoes[i] = [a, b] is equivalent to dominoes[j] = [c, d] if and on ...

  3. CSS元素居中汇总

    总结实现不同类型元素居中的几种方法: 一.把margin值设置为auto(实现水平居中) 可以实现元素水平居中对齐 原理:使  margin-left=margin-right  如果设置  marg ...

  4. SQL SERVER 数据库如何限制一列不能重复(已经有主键)

    ALTER TABLE 表名ADDCONSTRAINT 约束名 UNIQUE (列名) -------------------------------------------------------- ...

  5. 错误: 找不到或无法加载主类 org.sang.BlogserverApplication

    错误: 找不到或无法加载主类 org.sang.BlogserverApplication

  6. ASP.net 能写一个上传整个文件夹的东东

    IE的自带下载功能中没有断点续传功能,要实现断点续传功能,需要用到HTTP协议中鲜为人知的几个响应头和请求头. 一. 两个必要响应头Accept-Ranges.ETag 客户端每次提交下载请求时,服务 ...

  7. [转]SQLServer : EXEC和sp_executesql的区别

    MSSQL为我们提供了两种动态执行SQL语句的命令,分别是EXEC和sp_executesql.通常,sp_executesql则更具有优势,它提供了输入输出接口,而EXEC没有.还有一个最大的好处就 ...

  8. 【JavaMail】JavaMail整合RabbitMq发送邮件案例

    前言 Linux安装RabbitMQ:https://www.cnblogs.com/jxd283465/p/11975094.html SpringBoot整合RabbitMQ:https://ww ...

  9. Navicat Premuim远程连接oracle 提示 cannot load oci dll,193的解决方法

    转载:http://blog.51cto.com/xiao987334176/1640991 内网有一台windows server 2012,安装了Navicat 11.1.8 连接oracle的时 ...

  10. 使用tushare获取股票历史数据和实时分笔数据

    使用tushare获取股票历史数据和实时分笔数据   财经数据接口包tushare的使用(一) Tushare是一款开源免费的金融数据接口包,可以用于获取股票的历史数据.年度季度报表数据.实时分笔数据 ...