【HDOJ 5654】 xiaoxin and his watermelon candy(离线+树状数组)

xiaoxin and his watermelon candy

Time Limit: 4000/4000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)
Total Submission(s): 233    Accepted Submission(s): 61

Problem Description
During his six grade summer vacation, xiaoxin got lots of watermelon candies from his leader when he did his internship at Tencent. Each watermelon candy has it's sweetness which denoted by an integer number.

xiaoxin is very smart since he was a child. He arrange these candies in a line and at each time before eating candies, he selects three continuous watermelon candies from a specific range [L, R] to eat and the chosen triplet must satisfies:

if he chooses a triplet (ai,aj,ak) then:
1. j=i+1,k=j+1
2.  ai≤aj≤ak

Your task is to calculate how many different ways xiaoxin can choose a triplet in range [L, R]?
two triplets (a0,a1,a2) and (b0,b1,b2) are thought as different if and only if:
a0≠b0 or a1≠b1 or a2≠b2

Input
This problem has multi test cases. First line contains a single integer T(T≤10) which represents the number of test cases.

For each test case, the first line contains a single integer n(1≤n≤200,000)which represents number of watermelon candies and the following line contains n integer numbers which are given in the order same with xiaoxin arranged them from left to right.
The third line is an integer Q(1≤200,000) which is the number of queries. In the following Q lines, each line contains two space seperated integers l,r(1≤l≤r≤n) which represents the range [l, r].

Output
For each query, print an integer which represents the number of ways xiaoxin can choose a triplet.
Sample Input
1 5 1 2 3 4 5 3 1 3 1 4 1 5
Sample Output
1 2 3
Source
BestCoder Round #77 (div.1)
Recommend
wange2014   |   We have carefully selected several similar problems for you:  5650 5649 5648 5646 5645 

题目大意:有n个糖果,从左到右列出每个糖果的甜度

之后有Q次查询,每次查询[L,R]中三元组的个数

这个三元组要求满足为连续的三个值,然后这三个值为非递减。

问[L,R]中不重复的三元组的个数。重复表示三元组中三个数均对影响等。如果重复则只记一次

正解为主席树………………额………………恩…………

搜到这个离线+树状数组的写法,给大家分享下

思路很巧妙。先离线存储所有查询。

然后对查询进行排序,以右边界从小到大排序。

然后从1到n开始枚举位置pos

每到一个位置,看一下从当前往后连续的三个满不满足题目中三元组的要求,如果满足,在树状数组中1的位置+1 pos+1处-1

现在让我们先不考虑重复。经过如上处理,对于所有右边界等于pos+2的区间,树状数组中0~L的值即为三元组个数!

因为如果满足R等于pos+2 其实就是找所有出现过的l >= L的三元组,在遍历的过程中,每个满足要求的三元组pos+1处-1了,其实就是求0~L的区间和了

想想看~~

至于R 等于pos+2 由于对查询按照R排序了,所以在遍历的过程中对于每个pos都把查询遍历到右区间pos+2就好啦

这里没有去重,关于去重,我是琢磨了好久……做法就是哈希,哈希三元组。如果没出现过,跟上面一样,在线段树1处+1

如果出现过,需要在上次出现的位置+1处 累加上一个1

这样就可以避免重复统计了

做这道题真长记性……由于要哈希,排序必须对所有元素都进行比较。否则会出现重叠!这也是跟其内部实现相关。

代码如下:

#include <iostream>
#include <cmath>
#include <vector>
#include <cstdlib>
#include <cstdio>
#include <cstring>
#include <queue>
#include <stack>
#include <list>
#include <algorithm>
#include <map>
#include <set>
#define LL long long
#define Pr pair<int,int>
#define fread() freopen("in.in","r",stdin)
#define fwrite() freopen("out.out","w",stdout)using namespace std;
const int INF = 0x3f3f3f3f;
const int msz = 10000;
const int mod = 1e9+7;
const double eps = 1e-8;int bit[233333];
int n;int Lowbit(int x)
{return x&(-x);
}int sum(int x)
{int ans = 0;while(x){ans += bit[x];x -= Lowbit(x);}return ans;
}void add(int x,int d)
{while(x <= n){bit[x] += d;x += Lowbit(x);}
}struct Point
{int l,r,id;bool operator <(const struct Point a)const{return r == a.r? l == a.l? id < a.id: l < a.l: r < a.r;}Point(int _l = 0,int _r = 0,int _id = 0):l(_l),r(_r),id(_id){};
};Point pt[233333];
int num[233333];
int ans[233333];
int p[233333];int main()
{int t,m;scanf("%d",&t);while(t--){scanf("%d",&n);for(int i = 1; i <= n; ++i)scanf("%d",&num[i]);scanf("%d",&m);for(int i = 0; i < m; ++i){scanf("%d%d",&pt[i].l,&pt[i].r);pt[i].id = i;}memset(ans,0,sizeof(ans));memset(bit,0,sizeof(bit));sort(pt,pt+m);map <Point,int> mp;int j = 0;int tp = 1;for(int i = 1; i <= n-2; ++i){if(num[i] <= num[i+1] && num[i+1] <= num[i+2]){if(!mp[Point(num[i],num[i+1],num[i+2])]){mp[Point(num[i],num[i+1],num[i+2])] = tp;p[tp++] = 0;}int x = mp[Point(num[i],num[i+1],num[i+2])];add(p[x]+1,1);add(i+1,-1);p[x] = i;}for(; j < m && pt[j].r <= i+2; ++j){if(pt[j].l+2 > pt[j].r) continue;ans[pt[j].id] = sum(pt[j].l);}}for(int i = 0; i < m; ++i)printf("%d\n",ans[i]);}return 0;
}


【HDOJ 5654】 xiaoxin and his watermelon candy(离线+树状数组)相关推荐

  1. hdu 4605 Magic Ball Game (在线主席树/离线树状数组)

    版权声明:本文为博主原创文章,未经博主允许不得转载. hdu 4605 题意: 有一颗树,根节点为1,每一个节点要么有两个子节点,要么没有,每个节点都有一个权值wi .然后,有一个球,附带值x . 球 ...

  2. HDU3333 Turing Tree 离线树状数组

    题意:统计一段区间内不同的数的和 分析:排序查询区间,离线树状数组 #include <cstdio> #include <cmath> #include <cstrin ...

  3. 牛客小白9 换个角度思考(离线+树状数组)

    title: 牛客小白9 换个角度思考(离线+树状数组) date: 2018-11-29 15:25:18 tags: [离线,树状数组] categories: ACM 题目链接 题目描述 给定一 ...

  4. 数据结构一【树状数组】普通、二维、离线树状数组的(单点修改,单点查询,区间修改,区间查询)模板及应用例题总结

    文章目录 树状数组 lowbit 线段树与树状数组 单点修改 区间查询 区间修改 区间求和 二维树状数组 离线树状数组 例题 POJ:stars MooFest [SDOI2009]HH的项链 Tur ...

  5. 【BZOJ3653】谈笑风生 离线+树状数组+DFS序

    [BZOJ3653]谈笑风生 Description 设T 为一棵有根树,我们做如下的定义: ? 设a和b为T 中的两个不同节点.如果a是b的祖先,那么称"a比b不知道高明到哪里去了&quo ...

  6. bzoj2754:[SCOI2012]喵星球上的点名 (后缀数组+离线+树状数组)

    题目传送门:http://www.lydsy.com/JudgeOnline/problem.php?id=2754 题目分析:最近两个星期都在做数论题,感觉有些无聊.昨天忽然间想起省赛前还有一个这题 ...

  7. [HEOI2012]采花(思维 + 离线 + 树状数组)

    题目链接 分析 我只能说太妙了- 离线 + 树状数组 参考题解: 这个题要和<HH的项链>做对比: 关键就是为什么要离线处理,以及 怎么对区间进行排序和维护: [SDOI2009]HH的项 ...

  8. 2016 UESTC Training for Data Structures K - 郭大侠与甲铁城 CDOJ 1342 离线树状数组

    K - 郭大侠与甲铁城 有一个区间,长度1e5,每个点有一种颜色,颜色属于[1,1000],离线询问某个区间的颜色种树,询问次数也少1e5 我的做法是离线树状数组 首先把区间保存下来,按右端点升序排序 ...

  9. HDU4417 Super Mario(离线树状数组或者主席树+二分)

    Super Mario Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Tota ...

  10. 牛客网 暑期ACM多校训练营(第一场)J.Different Integers-区间两侧不同数字的个数-离线树状数组 or 可持久化线段树(主席树)...

    J.Different Integers 题意就是给你l,r,问你在区间两侧的[1,l]和[r,n]中,不同数的个数. 两种思路: 1.将数组长度扩大两倍,for(int i=n+1;i<=2* ...

最新文章

  1. 每一个有理想的程序员都应该读的一本书-《rework》
  2. [react] 受控组件和非受控组件有什么区别?
  3. 处理工行b2c上海机构问题反思
  4. JS replace()方法替换变量(可以对变量进行全文替换)
  5. K8s稳居容器榜首,Docker冲顶技术热词,微服务应用热度不减,2021云原生开发者现状
  6. 斯威夫特山地车_斯威夫特弦乐
  7. 用‘slay’干掉某个用户的所有进程
  8. 帆软报表填报成功后实时刷新当前页面
  9. php gtk 中文手册,PHP-GTK
  10. 情景式领导力学习(1) - 介绍
  11. css 属性 linear-gradient 渐变色
  12. 计算机CPU处理,吞吐量
  13. 关于cv::cuda::GpuMat与PtrStepSz
  14. java马士兵网络编程_学习笔记-马士兵java - 网络编程
  15. LR常用函数以及参数化设置
  16. 浅谈大型互联网企业入侵检测及防护策略
  17. 4. 机器人正运动学---理解变换矩阵
  18. 8051单片机有几个存储器地址空间?画出它的存储器结构图
  19. 音质比较好的蓝牙耳机有哪些?四款音质好的蓝牙耳机推荐
  20. 基于MES的生产管理系统应用

热门文章

  1. Can‘t reconnect until invalid transaction is rolled back
  2. ACL-访问控制列表
  3. 契约精神,姜戈里的医生为什么要杀奴隶主 (标题有剧透),及编程等乱七八糟的...
  4. javascript 去掉html标签,js怎么去掉html标签
  5. 重庆金域 :新系统成功上线!重庆金域第一份新系统的报告单2017年9月21日13:00正式发出
  6. 各证件号码(身份证、护照、军官证、驾驶证、港澳台湾通行证、户口簿)正则表达式校验 完整正确
  7. NO.3 创建一个图片,并在图片上画线插入文字等
  8. 自写:二维码签到程序,功能咋能完善一些?
  9. 数据挖掘:Apriori 关联规则分析算法原理分析与代码实现
  10. 数据驱动测试一:使用TestNG进行数据驱动