[2022-2-26] OICLASS-USACO提高组模拟赛 C·Convoluted Intervals S
这道题非常简单啊,我看很多人都做出来了,张林昨天也讲的很明白了,那我来简单写一下:
暴力思路(10pts)
我们发现,我们只需要模拟画出一个图然后进行暴力枚举就行了。
差分+桶+加乘原理思路(100pts)
我们明显发现,这道题是可以运用差分的思想去做的,即 \(a_i+a_j\) 的地方加上 \(x_i \times x_j\) , \(b_i+b_j+1\) 的地方减去 \(y_i \times y_j\) 。
但是我们发现这样子做时间复杂度是 \(O(n^2)\) ,我们发现 \(a,b,m\) 的值域很小,可以考虑用桶存起来,时间复杂度 \(O(m^2)\)
AC CODE
#include<iostream>
#include<cstdio>
long long a[100005],b[100005],cnt[100005],ans;
using namespace std;
int main(){
int n,m,x,y;
cin>>n>>m;
for(int i=1;i<=n;i++){
scanf("%d %d",&x,&y);
a[x]++;
b[y]++;
}
for(int i=0;i<=m;i++){
for(int j=0;j<=m;j++){
cnt[i+j]+=a[i]*a[j],cnt[i+j+1]-=b[i]*b[j];
}
}
m*=2;
for(int i=0;i<=m;i++){
ans+=cnt[i];
printf("%lld\n",ans);
}
return 0;
}

浙公网安备 33010602011771号