【HDOJ 5654】 xiaoxin and his watermelon candy(离线+树状数组)
【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
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
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].
题目大意:有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(离线+树状数组)相关推荐
- hdu 4605 Magic Ball Game (在线主席树/离线树状数组)
版权声明:本文为博主原创文章,未经博主允许不得转载. hdu 4605 题意: 有一颗树,根节点为1,每一个节点要么有两个子节点,要么没有,每个节点都有一个权值wi .然后,有一个球,附带值x . 球 ...
- HDU3333 Turing Tree 离线树状数组
题意:统计一段区间内不同的数的和 分析:排序查询区间,离线树状数组 #include <cstdio> #include <cmath> #include <cstrin ...
- 牛客小白9 换个角度思考(离线+树状数组)
title: 牛客小白9 换个角度思考(离线+树状数组) date: 2018-11-29 15:25:18 tags: [离线,树状数组] categories: ACM 题目链接 题目描述 给定一 ...
- 数据结构一【树状数组】普通、二维、离线树状数组的(单点修改,单点查询,区间修改,区间查询)模板及应用例题总结
文章目录 树状数组 lowbit 线段树与树状数组 单点修改 区间查询 区间修改 区间求和 二维树状数组 离线树状数组 例题 POJ:stars MooFest [SDOI2009]HH的项链 Tur ...
- 【BZOJ3653】谈笑风生 离线+树状数组+DFS序
[BZOJ3653]谈笑风生 Description 设T 为一棵有根树,我们做如下的定义: ? 设a和b为T 中的两个不同节点.如果a是b的祖先,那么称"a比b不知道高明到哪里去了&quo ...
- bzoj2754:[SCOI2012]喵星球上的点名 (后缀数组+离线+树状数组)
题目传送门:http://www.lydsy.com/JudgeOnline/problem.php?id=2754 题目分析:最近两个星期都在做数论题,感觉有些无聊.昨天忽然间想起省赛前还有一个这题 ...
- [HEOI2012]采花(思维 + 离线 + 树状数组)
题目链接 分析 我只能说太妙了- 离线 + 树状数组 参考题解: 这个题要和<HH的项链>做对比: 关键就是为什么要离线处理,以及 怎么对区间进行排序和维护: [SDOI2009]HH的项 ...
- 2016 UESTC Training for Data Structures K - 郭大侠与甲铁城 CDOJ 1342 离线树状数组
K - 郭大侠与甲铁城 有一个区间,长度1e5,每个点有一种颜色,颜色属于[1,1000],离线询问某个区间的颜色种树,询问次数也少1e5 我的做法是离线树状数组 首先把区间保存下来,按右端点升序排序 ...
- HDU4417 Super Mario(离线树状数组或者主席树+二分)
Super Mario Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Tota ...
- 牛客网 暑期ACM多校训练营(第一场)J.Different Integers-区间两侧不同数字的个数-离线树状数组 or 可持久化线段树(主席树)...
J.Different Integers 题意就是给你l,r,问你在区间两侧的[1,l]和[r,n]中,不同数的个数. 两种思路: 1.将数组长度扩大两倍,for(int i=n+1;i<=2* ...
最新文章
- 每一个有理想的程序员都应该读的一本书-《rework》
- [react] 受控组件和非受控组件有什么区别?
- 处理工行b2c上海机构问题反思
- JS replace()方法替换变量(可以对变量进行全文替换)
- K8s稳居容器榜首,Docker冲顶技术热词,微服务应用热度不减,2021云原生开发者现状
- 斯威夫特山地车_斯威夫特弦乐
- 用‘slay’干掉某个用户的所有进程
- 帆软报表填报成功后实时刷新当前页面
- php gtk 中文手册,PHP-GTK
- 情景式领导力学习(1) - 介绍
- css 属性 linear-gradient 渐变色
- 计算机CPU处理,吞吐量
- 关于cv::cuda::GpuMat与PtrStepSz
- java马士兵网络编程_学习笔记-马士兵java - 网络编程
- LR常用函数以及参数化设置
- 浅谈大型互联网企业入侵检测及防护策略
- 4. 机器人正运动学---理解变换矩阵
- 8051单片机有几个存储器地址空间?画出它的存储器结构图
- 音质比较好的蓝牙耳机有哪些?四款音质好的蓝牙耳机推荐
- 基于MES的生产管理系统应用
热门文章
- Can‘t reconnect until invalid transaction is rolled back
- ACL-访问控制列表
- 契约精神,姜戈里的医生为什么要杀奴隶主 (标题有剧透),及编程等乱七八糟的...
- javascript 去掉html标签,js怎么去掉html标签
- 重庆金域 :新系统成功上线!重庆金域第一份新系统的报告单2017年9月21日13:00正式发出
- 各证件号码(身份证、护照、军官证、驾驶证、港澳台湾通行证、户口簿)正则表达式校验 完整正确
- NO.3 创建一个图片,并在图片上画线插入文字等
- 自写:二维码签到程序,功能咋能完善一些?
- 数据挖掘:Apriori 关联规则分析算法原理分析与代码实现
- 数据驱动测试一:使用TestNG进行数据驱动