CCF 202203-2 出行计划
又是差分?!
自己写的时候不知道怎么差分,这个地方需要加强训练。
看了大佬的文章,他是这么说的:
70分代码的思路我们是站在人的角度处理问题,即按照他的思路(即题目要求)一步一步处理问题,优先解决人的需求;
100分代码思路中,我们优先处理场所需求,即判断出进入该场所需要的最早时间核酸报告(left)和最晚时间核酸报告(right)后考虑人的需求,即人在left~right这个时间范围内进入场所都是符合要求的,可将问题转化为对区间的处理:核酸检测的时间t+等待核酸检测的时间k所在的点有多少个满足条件的场所
这叫什么?这叫思维的开拓,多角度解决问题。【面向对象(误😓)】
AC代码:
#include<iostream> #include<algorithm> using namespace std; const int N = 4e5+10; int n,m,k; int b[N];//差分数组 //令l~r之间的数都+c void insert(int l,int r,int c) { b[l]+=c; b[r+1]-=c; } int main() { cin>>n>>m>>k; for(int i=1; i<=n; i++) { int x,y; cin>>x>>y; int left = x-y+1;//定义左边界 left = left>0?left:1; int right = x;//定义右边界 insert(left,right,1); } //前缀和操作,得到各个点的数值 for(int i=1; i<=N; i++) { b[i] = b[i-1]+b[i]; } while(m--) { int x; cin>>x; cout<<b[x+k]<<endl;//直接得到x+k处的数值 } return 0; }
参考资料:(14条消息) CCF-CSP 202203-2 出行计划 差分算法满分题解+解题思路_只须一笑不须愁X的博客-CSDN博客

浙公网安备 33010602011771号