线段树+离线 hdu5654 xiaoxin and his watermelon candy
传送门:点击打开链接
题意:一个三元组假设满足j=i+1,k=j+1,ai<=aj<=ak,那么就好的。如今告诉你序列。然后Q次询问。每次询问一个区间[l,r],问区间里有多少个三元组满足要求
思路:刚開始看错题目了,原来三元组是连续3个,这作为bc最后一题也太水了把。
。
。
先一遍预处理。把连续3个满足条件的找出来,放到还有一个数组里排序去重,用这个数组来给三元组哈希。再扫一遍给三元组在之前那个排序好的数组里二分一下得到下标,大概就是哈希一下,用一个数字来表示。
之后的查询。事实上就是。在区间内。不同的数字有多少个。
这是一个很经典的线段树+离线的题目,仅仅要按右区间排序,然后xjb搞即可了,就不多说了。
。
#include <map>
#include <set>
#include <cmath>
#include <ctime>
#include <stack>
#include <queue>
#include <cstdio>
#include <cctype>
#include <string>
#include <vector>
#include <cstring>
#include <iomanip>
#include <iostream>
#include <algorithm>
#include <functional>
#define fuck(x) cout<<"["<<x<<"]"
#define FIN freopen("input.txt","r",stdin)
#define FOUT freopen("output.txt","w+",stdout)
using namespace std;
typedef long long LL;
typedef pair<int, int> PII; const int MX = 2e5 + 5; struct Data {
int a, b, c;
bool operator<(const Data &P) const {
if(a == P.a) {
if(b == P.b) return c < P.c;
return b < P.b;
}
return a < P.a;
}
bool operator==(Data &P) const {
return a == P.a && b == P.b && c == P.c;
}
} D[MX], dt;
struct Seg {
int l, r, id;
bool operator<(const Seg &P) const {
return r < P.r;
}
} S[MX];
int n, Q, ans[MX];
int sum[MX << 2], col[MX << 2];
int A[MX], pre[MX], pos[MX], sz; #define lson l, m, rt << 1
#define rson m + 1, r, rt << 1 | 1
void push_up(int rt) {
sum[rt] = sum[rt << 1] + sum[rt << 1 | 1];
}
void push_down(int rt, int len) {
if(col[rt]) {
int sr = len >> 1, sl = len - sr;
col[rt << 1] += col[rt]; col[rt << 1 | 1] += col[rt];
sum[rt << 1] += col[rt] * sl; sum[rt << 1 | 1] += col[rt] * sr;
col[rt] = 0;
}
}
void build(int l, int r, int rt) {
sum[rt] = col[rt] = 0;
if(l == r) return;
int m = (l + r) >> 1;
build(lson); build(rson);
}
int query(int p, int l, int r, int rt) {
if(l == r) return sum[rt];
int m = (l + r) >> 1;
push_down(rt, r - l + 1);
if(p <= m) return query(p, lson);
else return query(p, rson);
}
void update(int L, int R, int l, int r, int rt) {
if(L <= l && r <= R) {
sum[rt] += r - l + 1;
col[rt] += 1;
return;
}
int m = (l + r) >> 1;
push_down(rt, r - l + 1);
if(L <= m) update(L, R, lson);
if(R > m) update(L, R, rson);
push_up(rt);
} int main() {
int T; //FIN;
scanf("%d", &T);
while(T--) {
sz = 0;
scanf("%d", &n);
build(1, n, 1); for(int i = 1; i <= n; i++) scanf("%d", &A[i]);
for(int i = 3; i <= n; i++) {
if(A[i - 2] <= A[i - 1] && A[i - 1] <= A[i]) {
sz++;
D[sz].a = A[i - 2]; D[sz].b = A[i - 1]; D[sz].c = A[i];
}
}
sort(D + 1, D + 1 + sz);
sz = unique(D + 1, D + 1 + sz) - D - 1;
for(int i = 1; i <= sz; i++) pos[i] = 0;
for(int i = 1; i <= n; i++) {
if(i >= 3 && A[i - 2] <= A[i - 1] && A[i - 1] <= A[i]) {
dt.a = A[i - 2]; dt.b = A[i - 1]; dt.c = A[i];
int id = lower_bound(D + 1, D + 1 + sz, dt) - D;
pre[i] = pos[id];
pos[id] = i;
} else pre[i] = -1;
} scanf("%d", &Q);
for(int i = 1; i <= Q; i++) {
S[i].id = i;
scanf("%d%d", &S[i].l, &S[i].r);
}
sort(S + 1, S + 1 + Q); int cur = 1;
for(int r = 1; r <= n; r++) {
if(pre[r] != -1) update(pre[r] + 1, r, 1, n, 1);
while(cur <= Q && S[cur].r == r) {
if(S[cur].l + 2 <= S[cur].r) ans[S[cur].id] = query(S[cur].l + 2, 1, n, 1);
else ans[S[cur].id] = 0;
cur++;
}
} for(int i = 1; i <= Q; i++) printf("%d\n", ans[i]);
}
return 0;
}
线段树+离线 hdu5654 xiaoxin and his watermelon candy的更多相关文章
- HDU 5654 xiaoxin and his watermelon candy 离线树状数组 区间不同数的个数
xiaoxin and his watermelon candy 题目连接: http://acm.hdu.edu.cn/showproblem.php?pid=5654 Description Du ...
- 【HDOJ 5654】 xiaoxin and his watermelon candy(离线+树状数组)
pid=5654">[HDOJ 5654] xiaoxin and his watermelon candy(离线+树状数组) xiaoxin and his watermelon c ...
- HDU 5654 xiaoxin and his watermelon candy 离线树状数组
xiaoxin and his watermelon candy Problem Description During his six grade summer vacation, xiaoxin g ...
- 牛客练习赛53 E-老瞎眼pk小鲜肉(思维+线段树+离线)
前言 听说是线段树离线查询?? 做题做着做着慢慢对离线操作有点感觉了,不过也还没参透,等再做些题目再来讨论离线.在线操作. 这题赛后看代码发现有人用的树状数组,$tql$.当然能用树状数组写的线段树也 ...
- 数据结构(主席树):HDU 5654 xiaoxin and his watermelon candy
Problem Description During his six grade summer vacation, xiaoxin got lots of watermelon candies fro ...
- HDU 4638-Group(线段树+离线处理)
题意: 给n个编号,m个查询每个查询l,r,求下标区间[l,r]中能分成标号连续的组数(一组内的标号是连续的) 分析: 我们认为初始,每个标号为一个组(线段树维护区间组数),从左向右扫序列,当前标号, ...
- HDU 4630-No Pain No Game(线段树+离线处理)
题意: 给你n个数的序列a,q个询问,每个询问给l,r,求在下标i在[l,r]的区间任意两个数的最大公约数中的最大值 分析: 有了hdu3333经验,我们从左向右扫序列,如果当前数的约数在前面出现过, ...
- HDU 4288 Coder 【线段树+离线处理+离散化】
题意略. 离线处理,离散化.然后就是简单的线段树了.需要根据mod 5的值来维护.具体看代码了. /* 线段树+离散化+离线处理 */ #include <cstdio> #include ...
- SPOJ--K-query (线段树离线) 离线操作解决一些问题
K-query Given a sequence of n numbers a1, a2, ..., an and a number of k- queries. A k-query is a tri ...
随机推荐
- 把datagrid转换成gridview
public gridview datagrid2gridview(datagrid dg) { gridview gv = new gridview(); foreach(var p in dg.c ...
- Android使用的webcview中带有音乐播放控件,在关闭或分享时处于界面不可见状态下,声音仍在播放的问题解决
一. 问题出现原因 我们在做APP分享时,分享webview加载带有音乐播放控件的网页.当弹出分享界面,webview的网页处于后台状态或关闭该网页时,音乐声仍在播放.出现该类现象使我 ...
- [Android]异常4-javax.mail.AuthenticationFailedException
javax.mail.AuthenticationFailedException 背景:JavaMail发送电子邮件 异常原因: 可能一>发件人帐号.密码有误 可能二>需要使用SSL安全认 ...
- IC验证概念总结
一份代码,在写完之后,一定要再经过一次或多次整理和打磨,才能算完成的:一份代码,一定要把其有效代码行,精简.锤炼到最少.最短.最有效,才能算完成的. 下面这些问题和回答是忘记是在哪里看到的了,参考 ...
- JS高级——沙箱
基本概念 1.沙箱:与外界隔绝的一个环境,外界无法修改该环境内任何信息,沙箱内的东西单独属于一个世界 2.苹果手的app使用的就是沙箱模式去运行,隔离app的空间,每个app独立运行 js沙箱基本模式 ...
- (转) Arcgis4js实现链家找房的效果
http://blog.csdn.net/gisshixisheng/article/details/71009901 概述 买房的各位亲们不知是否留意过链家的"地图找房",这样的 ...
- 微信小程序video监测播放进度
video组件提供的进度相关的监测只有 bindtimeupdate ,官方说明这个函数250ms触发一次,在开发者工具上基本符合,但在真机上每隔1秒触发一次.达不到我们要求的精度.对比下音频,wx. ...
- TP调用JS
echo "<script>alert('删除成功');window.location.href='?c=Banner&a=index' </script>& ...
- [工具]ps
ps 如果想看一个进程的启动时间,可以用lstart来看 [root@jiangyi02.sqa.zmf /home/ahao.mah] #ps -eo pid,lstart,etime,cmd |g ...
- ajax 禁用按钮防止重复提交
<!DOCTYPE html><html lang="en"><head> <meta charset="UTF-8" ...