ZZULIOJ 2171: 举世伐唐(差分 or 树状数组)

24 篇文章 0 订阅
5 篇文章 0 订阅

题目描述

   夫子将人间之气注入桑桑体内后,便再也无法隐瞒踪迹,昊天终于发现了他。

   “恭请夫子显圣!”

    西陵神国桃山最高处,庄严肃穆的神殿外,石坪上跪着黑压压的人群,往常骄横的红衣神官和神殿执事们。就像最虔诚的信徒,以额触地。

   “恭请夫子显圣!”

    极西荒原深处,天坑中央的巨峰之巅。悬空寺讲经首座的手中没有握着锡杖,而是诚心诚意地双手合什,无比恭敬地祝祷着。

       遥远的南海某处。

    青衣道人沉默看着陆地的方向,脸上的神情显得异常凝重。

    他没有说那句话,因为他很紧张。

    他看到一道大幕正在缓缓落下。

    为了这一刻,他已经等待了太长时间,不到最后,他无法放心。

  

    泗水畔。

    黑色的罩衣在空中飘舞,夫子乘风而上。

    桑桑随之而去,无数光明金花,从她的身体里溢出,洒向人间。

    陈皮皮跪在知守观里的湖畔,对着天空不停流泪,双肩塌着,身体不停颤抖,眼睛哭到红肿,就像被雪迷了眼睛的兔子。

    中年道人站在他身后,叹息安慰说道:“夫子既然已经显圣登天,那么你父亲便可以回来,至少这算是一件好事……陈皮皮的父亲是知守观观主。

    他叫陈某,无数年来身上都是一袭青色道衣,故号青衣道人。

     。。。

    夫子升天后 , 陈某回来了。开始了举世伐唐。

    现在唐国情况危急,北方的金帐王国 , 南方的晋国 , 西方的月轮国兵员调动密集 , 一时间唐国边境线上烽火重重。

    

    已知唐国边境上共有 n 个关卡 , 编号为别为 1 ... n。你现在是唐国军机处的一员情报人员 , 在你面前共有 m 份情报 ,每份情报有两个数 L , R表示有一股兵力将要袭击 L 到 R 区间里的所有关卡 ,对于每个关卡 ,每被袭击一次他的危险度就加一。

 

输入

      t( t<= 5)代表有 t 组数据.

   每组数据 先输入 n , m(n<=100000 m<=100000) , 然后输入 m 行 , 每行 两个数 L , R(1<= L <= R <= n).

 

输出

    输出所有关卡里危险度最高的关卡的危险度。

 

样例输入 Copy

2
2 3
1 2
1 1
2 2
5 5
1 2
1 2
1 2
1 5
1 5

样例输出 Copy

2
5

来源/分类

 

[提交] [状态]

对区间内数字进行修改,但是因为数据规模较大,所以可以用差分来做;

先求出差分数组,再求前缀和即是原数组,取最大值即答案。复杂度为O(n)。

#include<iostream>
#include<stdio.h>
#include<string.h>
using namespace std;
const int N = 1e5 + 10;
int a[N], b[N]; 
int main(){
	int t;
	cin >> t;
	while (t--)
	{
		memset(a, 0, sizeof a);
		int n, m, ans = 0;
		cin >> n >> m;
		int x, y;
		for(int i = 1; i <= m; i++)   //求差分数组
		{
			scanf("%d%d", &x, &y);
			a[x]++;
			a[y + 1]--;
		}
		for(int i = 1; i <= m; i++)
			b[i] = b[i - 1] + a[i];   //原数组
		for(int i = 1; i <= m; i++)
			ans = max(ans, b[i]);
		cout << ans << endl;
	}
	return 0;
}

树状数组维护差分数组, 再单点查询求最大值, 复杂度O(n * log n)。

#include <iostream>
#include <string>
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
int c[500010];
struct bit
{
	int lowbit(int x)
	{
		return x & -x;
	}
	void update(int x, int n, int val)
	{
		while (x <= n)
		{
			c[x] += val;
			x += lowbit(x);
		}
	}
	int qury(int x)
	{
		int res = 0;
		while (x)
		{
			res += c[x];
			x -= lowbit(x);
		}
		return res;
	}

};
int main()
{
#ifdef LOCAL
	freopen("D:/input.txt", "r", stdin);
	freopen("D:/output1.txt", "w", stdout);
#endif
	bit t;
	int T;
	cin >> T;
	while (T--)
	{
		memset(c, 0, sizeof c);
		int n, m;
		cin >> n >> m;
		for (int i = 1; i <= m; i++)
		{
				int L, R, val;
				cin >> L >> R;
				t.update(L, n, 1);
				t.update(R + 1, n, -1);
		}
		int ans = 0;
		for (int i = 1; i <= n; i++)
			ans = max(ans, t.qury(i));
		cout << ans << endl;
	}
	return 0;
}

 

  • 3
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值