CF B题
  • 板块学术版
  • 楼主cabac
  • 当前回复3
  • 已保存回复3
  • 发布时间2024/9/28 00:22
  • 上次更新2024/9/28 10:40:08
查看原帖
CF B题
101911
cabac楼主2024/9/28 00:22

感觉我的思路没啥问题,但是只对一个点,帮帮孩子

主要思路就是根据每个坐标的前面坐标个数和后面坐标个数来算覆盖该坐标的区间个数,再把两个坐标之间的所有坐标也统计一下。暂时没找到反例。

#include<bits/stdc++.h>
#define max(a,b) a>=b?a:b
using namespace std;
int N;
int n,t,js,maxn;
int a[100039],l[100039],r[100039];
int main()
{
//	freopen("2.in","r",stdin);
	scanf("%d",&N);
	while(N--){
		scanf("%d %d",&n,&t);
		int check[500039]={0};
		memset(check, 0, 500039);
		for(int i=0;i<n;++i){
			scanf("%d",&a[i]);
			l[i]=i-0;
			r[i]=n-1-i;
			check[r[i]+l[i]*(r[i]+1)]++;//统计每个坐标被覆盖几次
			maxn=max(maxn,check[r[i]+l[i]*(r[i]+1)]);//同于特判,防止出现查找的数过于大超过范围
		}
		for(int i=0;i<n-1;++i){
			check[l[i+1]*r[i]]+=a[i+1]-a[i]-1;//统计相邻坐标间的被覆盖几次
			maxn=max(maxn,check[l[i+1]*r[i]]);
		}
			
		for(int i=0;i<t;++i){
			scanf("%d",&js);
			if(js>maxn)printf("0 ");
			else
			printf("%d ",check[js]);
		}
		printf("\n");
			
	}
	return 0;
}
2024/9/28 00:22
加载中...