题目
题目链接:https://atcoder.jp/contests/ARC068/tasks/arc068_c
有一趟列车有 \(M+1\) 个车站,从 \(0\) 到 \(M\) 编号。有 \(N\) 种商品,第 \(i\) 种只在编号 \([li,ri]\) 的车站出售。一辆列车有一个预设好的系数 \(d\),从 \(0\) 出发,只会在 \(d\) 的倍数车站停车。对于 \(d\) 从 \(1\) 到 \(M\) 的列车,求最多能买到多少种商品。
思路
考虑每一个商品能对哪些车造成贡献。一个车 \(d\) 可以被区间 \([l_i,r_i]\) 贡献到当且仅当 \(\frac{l_i}{d}<\frac{r_1}{d}\)。
对 \(l_i\) 整除分块,对于每一个商计算对 \(d\) 的贡献即可。
时间复杂度 \(O(n\sqrt{m})\)。
代码
#include <bits/stdc++.h>
using namespace std;
const int N=300010;
int n,m,i,ql,qr,ans[N];
int read()
{
int d=0; char ch=getchar();
while (!isdigit(ch)) ch=getchar();
while (isdigit(ch)) d=(d<<3)+(d<<1)+ch-48,ch=getchar();
return d;
}
int main()
{
m=read(); n=read();
while (m--)
{
ql=read()-1; qr=read();
for (i=1;i<=ql;)
{
int d=qr/i,j=qr/d,k=ql/d;
ans[max(k+1,i)]++; ans[j+1]--;
i=j+1;
}
ans[i]++; ans[qr+1]--;
}
for (int i=1;i<=n;i++)
{
ans[i]+=ans[i-1];
printf("%d\n",ans[i]);
}
return 0;
}