HDU 4638 Group(分组)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4638
题意:给出一个数列,若干询问。每次询问区间[L,R]的最少有多少段?每一段是连续的一段且这段内的数字也是连续的。
思路:对于新加入一个数字x,若之前x-1和x+1都已经加入了,那么总段数减1,若都没有加入,则总段数加1,若只加入一个,则总段数不变。然后,我们将数列分成 sqrt(n)段,将询问按照左端点放到相应的段中。同一段中按照右端点升序排序。那么在同一段中,右侧最多移动长度n左侧最左移动sqrt(n)。
struct node
{
int L,R,id;
void get()
{
RD(L,R);
L--; R--;
}
int operator<(const node &a) const
{
return R<a.R;
}
};
node a[N];
int n,m,d[N],ans[N],h[N];
vector<node> V[505];
int main()
{
rush()
{
RD(n,m);
int i,len=sqrt(n+1.0),cnt=(n+len-1)/len;
FOR0(i,cnt) V[i].clear();
FOR0(i,n) RD(d[i]);
FOR1(i,m)
{
a[i].get(),a[i].id=i;
V[a[i].L/len].pb(a[i]);
}
FOR0(i,cnt) sort(V[i].begin(),V[i].end());
int x,j,k=1,t,l,r;
FOR0(i,cnt)
{
l=i*len; r=l-1; x=0; clr(h,0);
FOR0(j,SZ(V[i]))
{
while(r<V[i][j].R)
{
t=d[++r];
if(h[t-1]&&h[t+1]) x--;
else if(!h[t-1]&&!h[t+1]) x++;
h[t]=1;
}
while(l>V[i][j].L)
{
t=d[--l];
if(h[t-1]&&h[t+1]) x--;
else if(!h[t-1]&&!h[t+1]) x++;
h[t]=1;
}
while(l<V[i][j].L)
{
t=d[l++];
if(h[t-1]&&h[t+1]) x++;
else if(!h[t-1]&&!h[t+1]) x--;
h[t]=0;
}
ans[V[i][j].id]=x;
}
}
FOR1(i,m) PR(ans[i]);
}
}
HDU 4638 Group(分组)的更多相关文章
- hdu 4638 Group
http://acm.hdu.edu.cn/showproblem.php?pid=4638 问题其实就是求[L,R]中有多少个连续的段 若每一个人都是一个段 那么[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 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是否已经添 ...
- hdu 4638 Group 莫队算法
题目链接 很裸的莫队, 就不多说了... #include<bits/stdc++.h> using namespace std; #define pb(x) push_back(x) # ...
- HDU 4638 Group(莫队)题解
题意:n个数,每个数有一个值,每次询问一个区间,问你这个区间能分成连续的几段(比如7 1 2 8 就是两端 1 2 和 7 8) 思路:莫队.因为L.R移动顺序wa了20发...问了一下别人,都是先扩 ...
随机推荐
- 【BZOJ】【3210】花神的浇花集会
曼哈顿距离与切比雪夫距离 QAQ蒟蒻并不知道切比雪夫距离是什么……并不会做这道题…… 去膜拜了PoPoQQQ大爷的题解: 题目大意:给定平面上的n个点,求一个点到这n个点的切比雪夫距离之和最小 与31 ...
- 【BZOJ】【1001】 【BJOI2006】狼抓兔子
平面图最小割->对偶图最短路 平面图最小割转对偶图最短路= = 想到了就比较好写了…… 可能是我对区域的标号方式比较奇特?反正我没有特判n==1||m==1也能过2333(机智吧-(滚开啦你个自 ...
- 好用到没朋友的大数模板(c++) 2014-10-01 15:06 116人阅读 评论(0) 收藏
#include <iostream> #include <cstring> using namespace std; #define DIGIT 4 //四位隔开,即万进制 ...
- [工作积累] error: bad class file magic (cafebabe) or version (0033.0000)
Update Android SDK build tool to latest can solve my problem.
- cache应用(asp.net 2.0 SQL数据缓存依赖 [SqlCacheDependency ] )
Asp.net 2.0 提供了一个新的数据缓存功能,就是利用sql server2005 的异步通知功能来实现缓存 1.首先在sqlserver2005 中创建一个test的数据库. 在SQL Ser ...
- Gvim for php 安装配置
VIM for PHP Windows 2011-05-14 11:51:51| 分类: Php|举报|字号 订阅 虽然vim本质上只是一个编辑器.但只要配合一些适当的插件,vim也能变成一 ...
- 在WCF中使用消息队列
在一些大型的解决方案中,假设我们的服务没有办法一直在线,或者因为这样那样的原因宕机了,有没有什么办法让客户端的影响最小化呢?答案是可以通过消息队列的方式,哪怕服务是没有在线的,客户端依然可以继续操作. ...
- 学了C语言,如何写个程序计算出每个月的第一个星期一对应的日期
在前面,我们分别利用泰勒公式和C标准库中的mktime()函数推算了某个特定日期所对应的星期几,刚做完这些,就又遇到了一个与日期相关的新任务: 老板把每个月例会的时间定在了每个月的第一个星期一,他让我 ...
- iOS 开发--转场动画
"用过格瓦拉电影,或者其他app可能都知道,一种点击按钮用放大效果实现转场的动画现在很流行,效果大致如下:" 本文主讲SWIFT版,OC版在后面会留下Demo下载 在iOS中,在同 ...
- SIM卡
SIM卡是(Subscriber Identity Module 客户识别模块)的缩写 也称为用户身份识别卡.智能卡,GSM数字移动电话机必须装上此卡方能使用.在电脑芯片上存储了数字移动电话客户的信息 ...