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[ ...
随机推荐
- 【Heaven Cow与God Bull】题解
题目 Description __int64 ago,there's a heaven cow called sjy... A god bull named wzc fell in love with ...
- mysql分组排序加序号(不用存储过程,就简简单单sql语句哦)
做前端好长时间了,好久没动sql了.在追一个喜欢的女孩,做测试的,有这么个需求求助与本屌丝,机会难得,开始折腾起来,配置mysql,建库,建表.... 一 建表 CREATE TABLE `my_te ...
- MySql的导入导出
可以参看之前的博客:https://www.cnblogs.com/shijinglu2018/p/8672699.html 可以参看视频:https://i.cnblogs.com/EditPost ...
- 开发工具Intellij IDEA:面板介绍
一.面板说明 IDEA面板的全貌如下图 2|0 二.菜单栏 下面会简单介绍下一些常用的部分菜单使用,如有疑问或补充欢迎留言. (1).File文件 1. New:新建一个工程 可以新建project, ...
- 3D Computer Grapihcs Using OpenGL - 08 Text File Shaders
使用之前的方法写Shader是一件很痛苦的事情,把Shader代码直接卸载C++文件中,需要使用很多引号来包裹,既不美观也不方便. 我们这节的目的是使用纯文本文件保存Shader. 首先在工程中创建两 ...
- 爬虫 ---- BeautifulSoup的基础使用
#BeautifulSoup的基础使用from bs4 import BeautifulSoup #导入bs4库 html = "<p class='stylecss'>< ...
- 背包&数位dp(8.7)
背包 0/1背包 设dp[i][j]为前i个物品选了j体积的物品的最大价值/方案数 dp[i][j]=max(dp[i-1][j-w[i]]+v[i],dp[i-1][j])(最大价值) dp[i][ ...
- Node - 模块加载与 lerna 提升
从node_modules 加载模块的过程 如果要加载的模块非核心模块,并且路径不是'/'. '../'和'./'开头,这个模块就会从当前文件夹递归向上在node_modules文件夹中寻找这个模块. ...
- java实现多种加密模式的AES算法-总有一种你用的着
https://blog.csdn.net/u013871100/article/details/80100992 AES-128位-无向量-ECB/PKCS7Padding package com. ...
- shell脚本中执行python脚本并接收其返回值的例子
1.在shell脚本执行python脚本时,需要通过python脚本的返回值来判断后面程序要执行的命令 例:有两个py程序 hello.py 复制代码代码如下: def main(): pri ...