伟大的程序员——TT的电脑里有N份数据,分别编号从1到N。同事QAQ嫉妒他的能力,趁TT不在的时候把TT电脑里的数据给格式化了!(卧槽没想到QAQ居然是这样的人,怎么能格式化T^T的电脑呢!应该把它拿走呀,里面肯定有很多珍贵的资源呀~~比如说吊炸天的新OJ源代码呀~)
Input
有多组测试数据,每组输入第一个为一个正整数N(4 <= N <= 50,000)。 接下来一行包含一个正整数Q(4 <= Q <= 50,000)表示QAQ的操作次数。 接下来Q行,每行包含两个数x和y(1 <= x <= y <= N),表示QAQ将编号为x到y的数据给格式化了。
Output
对于QAQ的每次操作,输出QAQ此次操作后,还有多少数据没有被格式化。
(T^T:给我留点啊~)
SampleInput
100
5
3 10
2 7
16 20
1 99
54 78
SampleOutput
92
91
86
1
1
题意明显易懂 看到这题应该就是线段树区间更新+区间查询 但是看到某学长的神仙代码于是写个博客记录下
先上代码
#include <iostream>
#include <cstring>
using namespace std;
int a[50005];
int main()
{
int n;
ios::sync_with_stdio(false);
while(cin >> n)
{
memset(a,0,sizeof(a));
int q;
int l,r;
cin >> q;
while(q--)
{
cin >> l >> r;
for(int i = l ; i <= r ;i++)
{
if(a[i]>=r)
break;
if(!a[i])
n--;
a[i] = r;
}
cout << n << endl;
}
}
return 0;
}
通过样例模拟可以得知 当输入3 7时 3~7这个区间内数组值均为0 所以n减去了7 最为关键的一点是 将区间内的值 赋值成了区间的边界 当再输入 2 10 的时候 a[2]的值还是0 所以n的值少1 但a[3]的值已经在上次查询中更新成了右边界 这部分已经遍历过了 结束循环 以此类推