BestCoder Round #36(Trees-离线处理询问)

Trees

Accepts: 156

Submissions: 533

Time Limit: 2000/1000 MS (Java/Others)

Memory Limit: 65536/65536 K (Java/Others)

问题描述

今天CodeFamer去坎树。有N 棵树排成一排。他们被从1 到N 标号。第i 号树的高度为h i  。两棵未被坎掉的树编号分别为x,y 
当且仅当他们满足如下条件中一条时,他们是属于同一个块的:
1) x+1=y 或 y+1=x;
2) 存在一个棵未被坎掉的树,编号为z ,x 和z 在同一个块并且y 和z 也在同一个块。
现在CodeFamer想要坎掉一些高度不大于某个值的树,坎掉之后会形成多少个块呢?

输入描述

多组测试数据(大概15 组)
对于每一组数据,第一行包含两个整数N 和Q ,以一个空格分开,N 表示有N 棵树,Q 表示有Q 个查询。
在接下来的N 行中,会出现h[1],h[2],h[3],…,h[N] 
,表示N 棵树的高度。
在接下来的Q 行中,会出现q[1],q[2],q[3],…,q[Q] 
表示CodeFamerr查询。

请处理到文件末尾。

[参数约定]
1≤N,Q≤50000 

0≤h[i]≤1000000000(10 9 ) 

0≤q[i]≤1000000000(10 9 ) 

输出描述

对于每一个q[i],输出CodeFamer坎掉高度不大于q[i]的树之后有多少个块。

输入样例

3 2
5
2
3
6
2

输出样例

0
2

Hint

在这个样例中,有3棵树,他们的高度依次是5 2 3。

对于6这个查询,如果CodeFamer坎掉高度不大于6的树,那么剩下的树高度形状是-1 -1 -1(-1表示那个树被坎掉了)。这样就有0个块。

对于2这个查询,如果CodeFamer坎掉高度不大于2的树,那么剩下的树高度形状是5 -1 3(-1表示那个树被坎掉了)。这样就有2个块。

Statistic |Submit
| Clarifications | Back

离线处理询问

#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<algorithm>
#include<functional>
#include<iostream>
#include<cmath>
#include<cctype>
#include<ctime>
#include<vector>
using namespace std;
#define For(i,n) for(int i=1;i<=n;i++)
#define Fork(i,k,n) for(int i=k;i<=n;i++)
#define Rep(i,n) for(int i=0;i<n;i++)
#define ForD(i,n) for(int i=n;i;i--)
#define RepD(i,n) for(int i=n;i>=0;i--)
#define Forp(x) for(int p=pre[x];p;p=next[p])
#define Forpiter(x) for(int &p=iter[x];p;p=next[p])
#define Lson (x<<1)
#define Rson ((x<<1)+1)
#define MEM(a) memset(a,0,sizeof(a));
#define MEMI(a) memset(a,127,sizeof(a));
#define MEMi(a) memset(a,128,sizeof(a));
#define INF (2139062143)
#define F (100000007)
#define MAXN (50000+10)
#define fi first
#define se second
typedef long long ll;
ll mul(ll a,ll b){return (a*b)%F;}
ll add(ll a,ll b){return (a+b)%F;}
ll sub(ll a,ll b){return (a-b+(a-b)/F*F+F)%F;}
void upd(ll &a,ll b){a=(a%F+b%F)%F;}
int n,Q;
ll h[MAXN],q[MAXN];
bool b[MAXN];
pair<ll,int> ask[MAXN],work[MAXN];
int sum[MAXN];
int main()
{
//	freopen("c.in","r",stdin);

	while(scanf("%d%d",&n,&Q)==2)
	{
		MEM(h) MEM(q) MEM(b)
		For(i,n)
		{
			scanf("%d",&h[i]);
			work[i]=make_pair(h[i],i);
			b[i]=1;
		}
		sort(work+1,work+1+n);
		For(i,Q)
		{
			scanf("%d",&q[i]);
			ask[i]=make_pair(q[i],i);
		}
		sort(ask+1,ask+1+Q);

		int i=1,j=1,ans=1;
		while (j<=Q)
		{
			if (i<=n&&work[i].fi<=ask[j].fi) //cut tree
			{
				int now=work[i].se;
				b[now]=0;
				ans+=b[now-1]+b[now+1]-1;
				i++;
			}
			else // calc ans
			{
				int now=ask[j].se;
				sum[now]=ans;
				j++;
			}
		}
		For(i,Q) printf("%d\n",sum[i]);
	}

	return 0;
}
时间: 2024-10-25 13:23:40

BestCoder Round #36(Trees-离线处理询问)的相关文章

BestCoder Round #36 (hdu5200)Strange Class(离线)

转载请注明出处: http://www.cnblogs.com/fraud/          ——by fraud Trees Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others) Problem Description Today CodeFamer is going to cut trees.There are N trees standing in a line. They

BestCoder Round #36 (hdu5199)Gunner(水题)

转载请注明出处: http://www.cnblogs.com/fraud/          ——by fraud Gunner Time Limit: 8000/4000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others) Problem Description Long long ago, there is a gunner whose name is Jack. He likes to go hunting very

BestCoder Round #36 (hdu5198)Strange Class(水题)

转载请注明出处: http://www.cnblogs.com/fraud/          ——by fraud Strange Class Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others) Problem Description In Vivid’s school, there is a strange class(SC). In SC, the students’ nam

BestCoder Round #36

A:签到题,注意情况都考虑全了判断即可 B:hash树高,统计即可,要加读入挂(略坑) C:离线操作,把询问和树高都从大到小排序,然后砍树变成加树,每次把超过当前询问的树都加进去,每次加树就和左右边判断下,记录下块变换的情况,然后把答案存到相应询问中 代码: #include <cstdio> #include <cstring> #include <algorithm> using namespace std; char str[105]; bool judge()

BestCoder Round #36 [B] Gunner

题目地址:http://acm.hdu.edu.cn/showproblem.php?pid=5199 先对树的高度排序,然后对每次射击高度二分查找即可,打过之后数目变为0. 1 #include<cstdio> 2 #include<iostream> 3 #include<string.h> 4 #include<algorithm> 5 #include<math.h> 6 #include<stdbool.h> 7 #incl

BestCoder Round #36(Strange Class-模拟)

Strange Class Accepts: 519 Submissions: 1749 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others) 问题描述 在Vivid的学校里,有一个奇怪的班级(SC).在SC里,这些学生的名字非常奇怪.他们的名字形式是这样的a n b n c n   (a,b,c两两不相同.).例如,叫"abc","ddppqq"的学生是在S

BestCoder Round #36(Gunner-hash)

Gunner Accepts: 391 Submissions: 1397 Time Limit: 8000/4000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others) 问题描述 很久很久以前,有一个叫Jack的枪手.他非常喜欢打猎.一天,他去了一个小树林.那儿有只鸟,还有n 棵树.第i 只鸟站在第i 棵树的顶端.这些树从左到右排成一条直线.每一棵树都有它的高度.Jack站在最左边那棵树的左边.当Jack在高度为H 的地方向右发

BestCoder Round #14

Harry And Physical Teacher Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 38    Accepted Submission(s): 34 Problem Description As we all know, Harry Porter learns magic at Hogwarts School. How

从lca到树链剖分 bestcoder round#45 1003

bestcoder round#45 1003 题,给定两个点,要我们求这两个点的树上路径所经过的点的权值是否出现过奇数次.如果是一般人,那么就是用lca求树上路径,然后判断是否出现过奇数次(用异或),高手就不这么做了,直接树链剖分.为什么不能用lca,因为如果有树退化成链,那么每次询问的复杂度是O(n), 那么q次询问的时间复杂度是O(qn) 什么是树链剖分呢? 就是把树的边分成轻链和重链 http://blogsina.com.cn/s/blog_6974c8b20100zc61.htmlh