HDU_3333 Turing Tree 【线段树 + 离散化】
一、题目
二、分析
这题主要还是在区间的处理上。
为了保证区间内的数没有重复的,那么可以对区间按右端点从小到大排序,这样对原数组处理时,尽量保证不重复的元素靠右(可以假设右端点固定考虑),就可以保证区间求出来的值是不重复的,对于重复的就把前面位置出现的这个数减掉(即赋值为0)即可。
由于原数组的数比较大,要记录其之前的位置无法直接开数组,所以需要离散化。后面的就是普通的线段树的单点修改和区间查询了。
三、AC代码
#include <bits/stdc++.h> using namespace std;
#define ll long long
#define Min(a,b) ((a)>(b)?(b):(a))
#define Max(a,b) ((a)>(b)?(a):(b))
#define lson (rt<<1)
#define rson (rt<<1|1)
#define P pair<int, int>
const int MAXN = 3e4;
const int MAXQ = 1e5;
ll A[MAXN + 13], Sum[MAXN<<2];
int Pre[MAXN + 13];
vector<ll> vec;
struct node
{
int L, R, id;
bool operator < (const node &t) const {
return R < t.R;
}
}B[MAXQ + 13];
ll Ans[MAXQ + 13]; int getPos(ll x)
{
return lower_bound(vec.begin(), vec.end(), x) - vec.begin();
}
void Push_up(int rt)
{
Sum[rt] = Sum[lson] + Sum[rson];
return;
}
void Update(int rt, int l, int r, int p, ll val)
{
if(l == r) {
Sum[rt] = val;
return;
}
int mid = (l + r) >> 1;
if(p <= mid)
Update(lson, l, mid, p, val);
else
Update(rson, mid + 1, r, p, val);
Push_up(rt);
}
ll Query(int rt, int l, int r, int L, int R)
{
if(L <= l && r <= R) {
return Sum[rt];
}
int mid = (l + r) >> 1;
ll ans = 0;
if(L <= mid)
ans += Query(lson, l, mid, L, R);
if(R > mid)
ans += Query(rson, mid + 1, r, L, R);
return ans;
} int main()
{
//freopen("input.txt", "r", stdin);
// freopen("out.txt", "w", stdout);
int T;
scanf("%d", &T);
while(T--) {
int N, Q;
scanf("%d", &N);
vec.clear();
for(int i = 1; i <= N; i++) {
scanf("%lld", &A[i]);
vec.push_back(A[i]);
}
sort(vec.begin(), vec.end());
vec.erase(unique(vec.begin(), vec.end()), vec.end());
scanf("%d", &Q);
for(int i = 0; i < Q; i++) {
scanf("%d%d", &B[i].L, &B[i].R);
B[i].id = i;
}
sort(B, B + Q);
memset(Sum, 0, sizeof(Sum));
memset(Pre, -1, sizeof(Pre)); //某个数字之前出现的位置
for(int i = 1, j = 0; i <= N; i++) {
int p = getPos(A[i]);
if(Pre[p] != -1) {
Update(1, 1, N, Pre[p], 0);
}
Pre[p] = i;
Update(1, 1, N, i, A[i]);
for(; j < Q; j++) {
if(B[j].R != i) {
break;
}
Ans[B[j].id] = Query(1, 1, N, B[j].L, B[j].R);
}
}
for(int i = 0; i < Q; i++) {
printf("%lld\n", Ans[i]);
}
}
return 0;
}
HDU_3333 Turing Tree 【线段树 + 离散化】的更多相关文章
- HDU 3333 Turing Tree (线段树)
Turing Tree Time Limit: 6000/3000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Tota ...
- HDU 3333 Turing Tree 线段树+离线处理
题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=3333 Turing Tree Time Limit: 6000/3000 MS (Java/Othe ...
- SPOJ D-query && HDU 3333 Turing Tree (线段树 && 区间不相同数个数or和 && 离线处理)
题意 : 给出一段n个数的序列,接下来给出m个询问,询问的内容SPOJ是(L, R)这个区间内不同的数的个数,HDU是不同数的和 分析 : 一个经典的问题,思路是将所有问询区间存起来,然后按右端点排序 ...
- poj 2528 Mayor's posters(线段树+离散化)
/* poj 2528 Mayor's posters 线段树 + 离散化 离散化的理解: 给你一系列的正整数, 例如 1, 4 , 100, 1000000000, 如果利用线段树求解的话,很明显 ...
- D - Mayor's posters(线段树+离散化)
题目: The citizens of Bytetown, AB, could not stand that the candidates in the mayoral election campai ...
- 主席树||可持久化线段树+离散化 || 莫队+分块 ||BZOJ 3585: mex || Luogu P4137 Rmq Problem / mex
题面:Rmq Problem / mex 题解: 先离散化,然后插一堆空白,大体就是如果(对于以a.data<b.data排序后的A)A[i-1].data+1!=A[i].data,则插一个空 ...
- Mayor's posters (线段树+离散化)
Mayor's posters Description The citizens of Bytetown, AB, could not stand that the candidates in the ...
- POJ 2528 Mayor's posters(线段树+离散化)
Mayor's posters 转载自:http://blog.csdn.net/winddreams/article/details/38443761 [题目链接]Mayor's posters [ ...
- [poj2528] Mayor's posters (线段树+离散化)
线段树 + 离散化 Description The citizens of Bytetown, AB, could not stand that the candidates in the mayor ...
- [UESTC1059]秋实大哥与小朋友(线段树, 离散化)
题目链接:http://acm.uestc.edu.cn/#/problem/show/1059 普通线段树+离散化,关键是……离散化后建树和查询都要按照基本法!!!RE了不知道多少次………………我真 ...
随机推荐
- IO - 同步,异步,阻塞,非阻塞 (亡羊补牢篇)【转】
同步(synchronous) IO和异步(asynchronous) IO,阻塞(blocking) IO和非阻塞(non-blocking)IO分别是什么,到底有什么区别? 详细请看下链接: IO ...
- IOS键盘收起后,页面底部留白处理
环境:vue+vant 的H5页面 场景:输入框输入信息时,如登录.注册等表单信息 问题:键盘收回后页面底部留白,导致dialog组件按钮位移,视觉上,其中的按钮无法正常工作 解决方案:监听失去焦点时 ...
- spring boot集成mybatis只剩两个sql 并提示 Cannot obtain primary key information from the database, generated objects may be incomplete
前言 spring boot集成mybatis时只生成两个sql, 搞了一个早上,终于找到原因了 找了很多办法都没有解决, 最后注意到生成sql的时候打印了一句话: Cannot obtain pri ...
- javascript module system all in one
javascript module system all in one AMD & CMD https://github.com/amdjs/amdjs-api/wiki/AMD http:/ ...
- Git Best Practice All In One
Git Best Practice All In One git workflow 本地开发环境: 开发人员自测的,可以是自己本地部署的静态服务器,当然也可类似是运行 npm server类似的环境, ...
- svn conflict & svn cleanup
svn conflict & svn cleanup OK $ svn --help $ svn cleanup Tree Conflicts https://tortoisesvn.net/ ...
- project generators & project scaffold
project generators & project scaffold how to write a node cli & Project Scaffold https://www ...
- Micro Frontends & microservices
Micro Frontends & microservices https://micro-frontends.org/ https://github.com/neuland/micro-fr ...
- qt 获取窗口句柄的线程id和进程id GetWindowThreadProcessId
int lpdwProcessId; int id = GetWindowThreadProcessId((HWND)0x707d6, (LPDWORD)&lpdwProcessId); qD ...
- 「NGK每日快讯」12.17日NGK第44期官方快讯!