原题链接:
https://www.luogu.com.cn/problem/P9426
题目:
输入样例的最后一行是错误的,按题目要求应该是2 4,才能输出这个结果
思路:
1.题目要求有一个非常重要的关键点:至少有一半长度包含在这个框内,才算被框住
(ps:最近在准备国赛,我看了好多这个题的解答,发现有的作者大大好像没有考虑到,我这个题解也没见有人写,所以写了这个文章)
我的思路就是将这个一半的长度,转换为该线段端点的个数有一半以上在这个框的范围里面。我画了张图:
手写,可能写的有点丑,没找到尺子,将就看吧
2.然后再用一个vector(也可以直接用二维数组),储存每一个数轴点上存在的线段
3.最后,输入区间范围,看区间内每个线段端点的个数有没有满足至少包含一半以上,满足sum加1,最后输出
代码:
#include<bits/stdc++.h>
using namespace std;
const int MAX1=10e6+7;
const int MAX2=10e5+7;
vector<int> SZ[MAX1];
int n,m,JL[MAX2],Saccout[MAX2];
int main()
{
int n,m,sum;
cin>>n>>m;
for(int i=1;i<=n;i++){
int a,b;
cin>>a>>b;
for(int j=a;j<=n;j++){
SZ[j].push_back(i);
}
Saccout[i]=(b-a+1)/2.0+0.5;//最少包含的端点个数
}
while(m--){
sum=0;
memset(JL,0,sizeof(JL+MAX2));
int l,r;
cin>>l>>r;
for(int i=l;i<=r;i++){
for(int j=0;j<SZ[i].size();j++){
int now=SZ[i][j];
JL[now]++;
if(JL[now]==Saccout[now])
sum++;
}
}
cout<<sum<<endl;
}
return 0;
}
总结:
一共用到了vector容器和memset进行初始化两部分知识点
第一次写文章,可能写的不太好,不知道我有没有说明白,如果你看到这里,本人表示非常感谢,谢谢阅读(比心)