HDU Group
Group
题目:
给出n个数,是1-n的排列。要求你每次给你一个区间求出这个区间能够被分成的小区间个数。
一个不连续的数能够被分成一个小区间。t-1,t或t,t+1表示连续。
算法:
高速做法应该是线段树。可是,我不会。
学了一个块状数组。
#include <iostream>
#include <algorithm>
#include <vector>
#include <cstdio>
#include <cmath>
#include <cstring>
using namespace std; const int MAXN = 100000 + 10; struct Node{
int l,r,id,b; bool operator < (const Node& rhs) const {
if(b != rhs.b){
return b < rhs.b;
}
return r < rhs.r;
}
}query[MAXN]; int seg[MAXN];
bool vst[MAXN];
int n,m,res;
int ans[MAXN]; void cal(int x,int &l,int &r){
int L = query[x].l, R = query[x].r;
while(L < l){ //须要将左右区间进行放大。否则可能出现左右游标交错的情况
--l;
int t = seg[l];
vst[t] = 1;
if(vst[t-1]&&vst[t+1]) --res;
else if(!vst[t-1]&&!vst[t+1]) ++res;
} while(R > r){
++r;
int t = seg[r];
vst[t] = 1;
if(vst[t-1]&&vst[t+1]) --res;
else if(!vst[t-1]&&!vst[t+1]) ++res;
} while(L > l){
int t = seg[l];
vst[t] = 0;
if(vst[t-1]&&vst[t+1]) ++res;
else if(!vst[t-1]&&!vst[t+1]) --res;
++l;
} while(R < r){
int t = seg[r];
vst[t] = 0;
if(vst[t-1]&&vst[t+1]) ++res;
else if(!vst[t-1]&&!vst[t+1]) --res;
--r;
}
} void solve(){
memset(vst,0,sizeof(vst));
sort(query,query + m);
res = 0;
int l = query[0].l, r = query[0].r;
for(int i = l;i <= r;++i){
int t = seg[i];
vst[t] = 1;
if(vst[t-1] && vst[t+1]) --res;
else if(!vst[t-1]&&!vst[t+1]) ++res;
} ans[query[0].id] = res;
for(int i = 1;i < m;++i){
ans[query[i].id] = (cal(i,l,r),res);
} for(int i = 0;i < m;++i){
printf("%d\n",ans[i]);
} } int main()
{
int T;
scanf("%d",&T);
while(T--){
scanf("%d%d",&n,&m); for(int i = 1;i <= n;++i){
scanf("%d",&seg[i]);
} int B = sqrt(1.0*n);
for(int i = 0;i < m;++i){
scanf("%d%d",&query[i].l,&query[i].r);
query[i].b = query[i].l / B;
query[i].id = i;
} solve();
}
return 0;
}
HDU Group的更多相关文章
- hdu 4638 Group
http://acm.hdu.edu.cn/showproblem.php?pid=4638 问题其实就是求[L,R]中有多少个连续的段 若每一个人都是一个段 那么[L,R]中每一个朋友关系就会减少一 ...
- HDU 4638 Group(分组)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4638 题意:给出一个数列,若干询问.每次询问区间[L,R]的最少有多少段?每一段是连续的一段且这段内的 ...
- HDU 4638 Group 【树状数组,分块乱搞(莫队算法?)】
根据题目意思,很容易得出,一个区间里面连续的段数即为最少的group数. 题解上面给的是用树状数组维护的. 询问一个区间的时候,可以一个一个的向里面添加,只需要判断a[i]-1 和 a[i]+1是否已 ...
- HDU 4638 Group (线段树 | 树状数组 + 离线处理)
Group Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submi ...
- HDU 4638 Group (2013多校4 1007 离线处理+树状数组)
Group Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submi ...
- HDU 5304(Eastest Magical Day Seep Group's Summer-环加外向树生成树计数)[Template:Kirchhoff矩阵]
Eastest Magical Day Seep Group's Summer Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 655 ...
- hdu 4638 Group(离线+树状数组)
Group Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total Subm ...
- HDU 4638 Group 树状数组 + 思路
实际上就是问这个区间编号连续的段的个数,假如一个编号连续的段有(a+b)个人,我把他们分在同一组能得到的分值为(a+b)^2,而把他们分成人数为a和b的两组的话,得到的分值就是a^2+b^2,显然(a ...
- HDU 4638 Group ★(树状数组)
题意 询问一段区间里的数能组成多少段连续的数. 思路 先考虑从左往右一个数一个数添加,考虑当前添加了i - 1个数的答案是x,那么可以看出添加完i个数后的答案是根据a[i]-1和a[i]+1是否已经添 ...
随机推荐
- BZOJ-2115-Xor-WC2011
叙述性说明 分析 我把文库里的粘了过来. 仅仅知道点1到点N的一条路径和图中若干个环.就能通过异或,表示成全部路径.那么.须要多少环才干保证必然能表示成全部路径呢?事实上.并不须要非常多, 由于一些环 ...
- js多物体任意值运动
假如有两个div,一个div要变宽,一个div要变高,你怎么写呢? 哎呀,写2个方法啊,一个控制div1变宽,一个控制div2变高啊 那么你的代码,是不是下面这样的呢! 示例:Div变宽和变高 现象: ...
- 表的顺序结构---重写Arraylist类
重写ArrayList类,为防止冲突,重写为MyArrayList,未继承Iterable类. public class MyArrayList<AnyType>{ int N=10; A ...
- RH033读书笔记(10)-Lab 11 Process Control
Lab 11 Process Control Sequence 1: Job Control 1. [student@stationX ~]$ su - 2. Begin some jobs in t ...
- 参加persist.sys物业写权限的方法
1.于AndroidManifest.xml manifest添加属性android:sharedUserId="android.uid.system" 2.假设AndroidMa ...
- YUV摘要格式
始终保持视频数据YUV联系,因为基于其产品的组织不同的公司格不同的类型定义,派生出多种不同YUV格公式. 大体,YUV从在点的形式的像素组织中,有两个:1.planer状态.2.packet状态. p ...
- SQL优化策略高级优化经常使用-1(The Return Of The King)
1 经常使用的优化策略 1.1 语句 1.1.1使用实际的列名 当我们查询SQL语句时.你是否觉得使用实际的列名比使用*更快呢?答案是肯定的. 为了证实这一点,感兴趣的朋友能够自己验证一下.我这 ...
- 给定一个set字符和一个正数k,找出所有该做set它可以由长度构成k该字符串集合 print-all-combinations-of-given-length
// 给定一个set字符和一个正数k,找出所有该做set它可以由长度构成k该字符串集合 /* Input: set[] = {'a', 'b'}, k = 3 Output: aaa aab aba ...
- ubuntu-14.04 系统安装mysql-5.6.21
1.安装mysql前准备工作 (1).从官网下载mysql-5.6.21.tar.gz (2).tar -zxvf mysql-5.6.21-tar.gz 会生成mysql-5.6.21的目录 ...
- Nginx模块开发入门(转)
前言 Nginx是当前最流行的HTTP Server之一,根据W3Techs的统计,目前世界排名(根据Alexa)前100万的网站中,Nginx的占有率为6.8%.与Apache相比,Nginx在高并 ...