2022.2.28 练习 CSP 202112-2 序列查询新解
参考博客:CCF CSP 202112-2 序列查询新解
不容易啊…
一点教训: 既然数据量很大,干脆都设成long long,省得漏了哪里又扣分。第二题就是要找到数据的规律!!!
不明白的点: 最开始我把n,N和r
都设成了全局遍历变量,fun函数就有问题,不能返回结果,不知道为什么
#include <bits/stdc++.h>
using namespace std;
const int MAX=1e5+10;
//全都long long !
long long a[MAX]={0};
long long fun(long long i,long long r)
{
//找规律计算g的前缀和
if(i<0)
return 0;
else
{
return r*((i+1)/r-1)*((i+1)/r)/2+(i+1)%r*(i/r);
}
}
int main()
{
std::ios::sync_with_stdio(false);
long long n,N;
cin>>n>>N;
long long r=N/(n+1);
int tmp;
for(int i=1;i<=n;i++)
{
cin>>tmp;
a[i]=tmp;
}
a[0]=0;
a[n+1]=N;
long long sum=0;
for(int i=0;i<=n;i++)
{
long long left=a[i];
long long right=a[i+1]-1;//这里很巧妙
if(right/r <= i || left/r >= i)
{
sum+=abs(fun(right,r)-fun(left-1,r)-i*(right-left+1));
}
else
{
long long mid=r*i;
sum+=abs(fun(mid-1,r)-fun(left-1,r)-i*(mid-left));
sum+=abs(fun(right,r)-fun(mid-1,r)-i*(right-mid+1));
}
}
cout<<sum<<endl;
return 0;
}