Group

Problem Description

There are n men ,every man has an ID(1..n).their ID is unique. Whose ID is i and i-1 are friends, Whose ID is i and i+1 are friends. These n men stand in line. Now we select an interval of men to make some group. K men in a group can create K*K value. The value of an interval is sum of these value of groups. The people of same group's id must be continuous. Now we chose an interval of men and want to know there should be how many groups so the value of interval is max.

Input

First line is T indicate the case number.

For each case first line is n, m(1<=n ,m<=100000) indicate there are n men and m query.

Then a line have n number indicate the ID of men from left to right.

Next m line each line has two number L,R(1<=L<=R<=n),mean we want to know the answer of [L,R].

Output

For every query output a number indicate there should be how many group so that the sum of value is max.

Sample Input

1

5 2

3 1 2 5 4

1 5

2 4

Sample Output

1

2

题目大意:

多组数据

给出n和m,a[i]为1到n的不重复数

询问m次

问一段区间内,连续的一段可分为一组(可以打乱顺序),问至少分多少组,

莫队板子题。

这里纠正一下莫队细节

先加再删,不要先删再加

#include <algorithm>
#include <iostream>
#include <cstdio>
#include <cmath>
#include <cstring>
#define maxn 100100
using namespace std;
int n,m,zz,k;
int a[maxn];
int belong[maxn];
int vis[maxn];
int ans;
inline int read()
{
int x=0,f=1;char s=getchar();
while('0'>s||s>'9') {
if(s=='-') f=-1;
s=getchar();
}
while('0'<=s&&s<='9') {
x=x*10+s-'0';
s=getchar();
}
return x*f;
}
struct edge {
int x,y,id;
int ans;
bool operator < (const edge &a) const {
return belong[x]==belong[a.x] ? y<a.y : x<a.x;
}
} q[maxn];
inline int cmp(const edge &a,const edge &b) {
return a.id<b.id;
}
inline void Add(int x) {
int dsr=vis[x+1]+vis[x-1];
dsr==0 ? ++ans : dsr==2?--ans:ans;
++vis[x];
}
inline void Delet(int x) {
int dsr=vis[x+1]+vis[x-1];
dsr==0? --ans : dsr==2?++ans:ans;
--vis[x];
} int main() {
zz=read();
while(zz--) {
memset(a,0,sizeof(a));
memset(belong,0,sizeof(belong));
memset(q,0,sizeof(q));
memset(vis,0,sizeof(vis));
ans=0;
n=read();
m=read();
k=sqrt(n);
for(int i=1; i<=n; ++i) {
a[i]=read();
belong[i]=(i-1)/k+1;
}
for(int i=1,x,y; i<=m; ++i) {
q[i].x=read();
q[i].y=read();
q[i].id=i;
}
sort(q+1,q+1+m);
for(register int i=1,l=1,r=0; i<=m; ++i) {
register int x=q[i].x,y=q[i].y;
while(r < y) Add(a[++r]);
while(r > y) Delet(a[r--]);
while(l < x) Delet(a[l++]);
while(l > x) Add(a[--l]);
q[i].ans=ans;
}
sort(q+1,q+1+m,cmp);
for(int i=1; i<=m; ++i)
printf("%d\n",q[i].ans);
}
return 0;
}

HDU 4638Group (莫队)的更多相关文章

  1. Hdu 5213-Lucky 莫队,容斥原理,分块

    题目:http://acm.hdu.edu.cn/showproblem.php?pid=5213 Lucky Time Limit: 6000/3000 MS (Java/Others)    Me ...

  2. Harvest of Apples (HDU多校第四场 B) (HDU 6333 ) 莫队 + 组合数 + 逆元

    题意大致是有n个苹果,问你最多拿走m个苹果有多少种拿法.题目非常简单,就是求C(n,0)+...+C(n,m)的组合数的和,但是询问足足有1e5个,然后n,m都是1e5的范围,直接暴力的话肯定时间炸到 ...

  3. HDU 4358 莫队算法+dfs序+离散化

    Boring counting Time Limit: 6000/3000 MS (Java/Others)    Memory Limit: 98304/98304 K (Java/Others)T ...

  4. HDU 4638 (莫队)

    题目链接:Problem - 4638 做了两天莫队和分块,留个模板吧. 当插入r的时候,设arr[r]代表r的位置的数字,判断vis[arr[r-1]]和vis[arr[r+1]]是否访问过,如果两 ...

  5. HDU 4638 莫队算法

    Group Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submi ...

  6. hdu 5145(莫队算法+逆元)

    NPY and girls Time Limit: 8000/4000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Tot ...

  7. HDU 6333 莫队+组合数

    Problem B. Harvest of Apples Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 262144/262144 K ...

  8. HDU 6534 莫队+ 树状数组

    题意及思路:https://blog.csdn.net/tianyizhicheng/article/details/90369491 代码: #include <bits/stdc++.h&g ...

  9. HDU 5145 NPY and girls (莫队分块离线)

    题目地址:HDU 5145 莫队真的好奇妙.. 这种复杂度竟然仅仅有n*sqrt(n)... 裸的莫队分块,先离线.然后按左端点分块,按块数作为第一关键字排序.然后按r值作为第二关键字进行排序. 都是 ...

随机推荐

  1. echarts 数据统计报表

    官网   http://echarts.baidu.com/index.html 我们下载好开发包后就可以开始了,第一步引入开发包,和需要的主题文件(可定义自己的主体文件),并定义好页面布局.2.0以 ...

  2. Spark Core(三)Executor上是如何launch task(转载)

    1. 启动任务 在前面一篇博客中(Driver 启动.分配.调度Task)介绍了Driver是如何调动.启动任务的,Driver向Executor发送了LaunchTask的消息,Executor接收 ...

  3. 循环结构 while,do while

    while:先判断条件表达式是否成立,成立则执行循环体,不成立则不执行. 格式:while(条件表达式){ 执行语句(控制循环次数): } 例如: int x=1; while(x<3/*条件表 ...

  4. [LeetCode] 114. Flatten Binary Tree to Linked List_Medium tag: DFS

    Given a binary tree, flatten it to a linked list in-place. For example, given the following tree: 1 ...

  5. webpack2

    中文网址:http://www.css88.com/doc/webpack2/guides/installation/

  6. n是否是2的幂

    实例五:n是否是2的幂 方法一:result=n&(n-1) 如果result=0 则n是2的幂方法二:result=n&((~n)+1) 如果result=n 则n是2的幂 原数   ...

  7. LR和SVM的相同和不同

    之前一篇博客中介绍了Logistics Regression的理论原理:http://www.cnblogs.com/bentuwuying/p/6616680.html. 在大大小小的面试过程中,经 ...

  8. python 爬虫煎蛋网

    import urllib.request import os from urllib import error import re import base64 def url_open(url): ...

  9. tomcat警告WARNING: An attempt was made to authenticate the locked user "user"

    后台出现很多警告WARNING: An attempt was made to authenticate the locked user "user"Jul 19, 2017 2: ...

  10. Linux用root强制踢掉已登录用户

    首先使用w命令查看所有在线用户: [root@VM_152_184_centos /]# w 20:50:14 up 9 days, 5:58, 3 users, load average: 0.21 ...