今日得分:100+100+(15or24)
T1
题目大意:对于1<=i<=n,求出∑max(0, ci −∣x − i∣^2 )。n<=100000,c<=10^12。
正解:1.使用线段数据结构(树状数组、线段树)维护出每个位置的二次函数然后求值。
2.考虑每个点对答案的贡献,差分
T1AC代码
#include<iostream>
#include<cstdio>
#include<cstring>
#include<string>
#include<algorithm>
#include<queue>
#include<vector>
#include<cmath>
#include<bitset>
#include<map>
using namespace std;
inline long long re_ad()
{
long long x=0;int f=1;char ch=getchar();
while(ch>'9'||ch<'0'){if(ch=='-')f=-1;ch=getchar();}
while(ch>='0'&&ch<='9')x=x*10+ch-48,ch=getchar();
return x*f;
}
int n;
long long c[100010],xfc[100010],xic[100010],ifc[100010],cc[100010];
inline long long ma(long long x,long long y){return x>y?x:y;}
inline long long mi(long long x,long long y){return x<y?x:y;}
void pu_t(long long x){if(x>9)pu_t(x/10);putchar(x%10+48);}
int main()
{
register int l,r;
register long long i,x,y;
n=re_ad();
for(i=1;i<=n;i++)c[i]=re_ad();
for(i=1;i<=n;++i)
{
x=sqrt(c[i]);l=ma(1,i-x);r=mi(n,i+x)+1;
++xfc[l];--xfc[r];
xic[l]-=(i<<1);xic[r]+=(i<<1);
ifc[l]+=1ll*i*i;ifc[r]-=1ll*i*i;
cc[l]+=c[i];cc[r]-=c[i];
}
for(i=1;i<=n;++i)
{
xfc[i]+=xfc[i-1];xic[i]+=xic[i-1];ifc[i]+=ifc[i-1];cc[i]+=cc[i-1];
x=1ll*i*i;
pu_t(cc[i]-ifc[i]-1ll*i*xic[i]-x*xfc[i]);
putchar(' ');
}
}
T2
题目大意:求一个无向带权图若干个关键点之间的“最小连通距离”。
正解:详见ppt
T2AC代码
#include<iostream>
#include<cstdio>
#include<cstring>
#include<string>
#include<