题目描述
夫子将人间之气注入桑桑体内后,便再也无法隐瞒踪迹,昊天终于发现了他。
“恭请夫子显圣!”
西陵神国桃山最高处,庄严肃穆的神殿外,石坪上跪着黑压压的人群,往常骄横的红衣神官和神殿执事们。就像最虔诚的信徒,以额触地。
“恭请夫子显圣!”
极西荒原深处,天坑中央的巨峰之巅。悬空寺讲经首座的手中没有握着锡杖,而是诚心诚意地双手合什,无比恭敬地祝祷着。
遥远的南海某处。
青衣道人沉默看着陆地的方向,脸上的神情显得异常凝重。
他没有说那句话,因为他很紧张。
他看到一道大幕正在缓缓落下。
为了这一刻,他已经等待了太长时间,不到最后,他无法放心。
泗水畔。
黑色的罩衣在空中飘舞,夫子乘风而上。
桑桑随之而去,无数光明金花,从她的身体里溢出,洒向人间。
陈皮皮跪在知守观里的湖畔,对着天空不停流泪,双肩塌着,身体不停颤抖,眼睛哭到红肿,就像被雪迷了眼睛的兔子。
中年道人站在他身后,叹息安慰说道:“夫子既然已经显圣登天,那么你父亲便可以回来,至少这算是一件好事……陈皮皮的父亲是知守观观主。
他叫陈某,无数年来身上都是一袭青色道衣,故号青衣道人。
。。。
夫子升天后 , 陈某回来了。开始了举世伐唐。
现在唐国情况危急,北方的金帐王国 , 南方的晋国 , 西方的月轮国兵员调动密集 , 一时间唐国边境线上烽火重重。
已知唐国边境上共有 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;
}