暴力AC还行
T1 statistics 数列统计
看到这个题莫名想到昨天晚上死命想优化的车厢重组就知道应该是个数据结构,但是由于车厢重组线段树写挂了觉得比较难搞,所以写了个暴力=_=
O
(
n
2
)
O(n^2)
O(n2)蜜汁80还行
for (int i = 2 ; i <= n ; i ++)
{
long long duang = 0;
for (int j = 1 ; j < i ; j ++)
duang += 1LL * (a[j] < a[i]) * (a[i] - a[j]) * (a[i] - a[j]) ;
printf("%lld\n", duang );
}
正解:从小到大插入
a
i
a_i
ai
维护三个信息:
1.前i个插入数的个数b(i)
2.前i个插入数的和c(i)
3.前i个插入数的平方和d(i)
可
推
得
f
(
i
)
=
a
i
2
∗
b
(
i
)
−
2
∗
c
(
i
)
∗
a
i
+
d
(
i
)
可推得f(i)=a_i^2*b(i)-2*c(i)*a_i+d(i)
可推得f(i)=ai2∗b(i)−2∗c(i)∗ai+d(i)
很多数据结构都可以写
(std似乎写的CDQ分治)
T2 point 圆上整点
HAOI原题还行
这道题直接推过程:
由
x
2
+
y
2
=
r
2
得
y
2
=
r
2
−
x
2
=
(
r
+
x
)
(
r
−
x
)
由x^2+y^2=r^2得y^2=r^2-x^2=(r+x)(r-x)
由x2+y2=r2得y2=r2−x2=(r+x)(r−x)
设
d
=
g
c
d
(
r
+
x
,
r
−
x
)
设d=gcd(r+x,r-x)
设d=gcd(r+x,r−x)
那
么
g
c
d
(
(
r
+
x
)
/
d
,
(
r
−
x
)
/
d
)
=
1
那么gcd((r+x)/d,(r-x)/d)=1
那么gcd((r+x)/d,(r−x)/d)=1
又
∵
y
2
=
(
(
r
+
x
)
/
d
)
∗
(
(
r
−
x
)
/
d
)
∗
d
2
又\because y^2=((r+x)/d)*((r-x)/d)*d^2
又∵y2=((r+x)/d)∗((r−x)/d)∗d2
∴
(
r
+
x
)
/
d
和
(
r
−
x
)
/
d
都
为
完
全
平
方
数
\therefore (r+x)/d和(r-x)/d都为完全平方数
∴(r+x)/d和(r−x)/d都为完全平方数
设
a
2
=
(
r
−
x
)
/
d
∗
b
2
=
(
r
+
x
)
/
d
设a^2=(r-x)/d*b^2=(r+x)/d
设a2=(r−x)/d∗b2=(r+x)/d
那
么
a
2
+
b
2
=
2
r
/
d
那么a^2+b^2=2r/d
那么a2+b2=2r/d
(
a
2
+
b
2
)
和
d
是
2
r
的
因
数
(a^2+b^2)和d是2r的因数
(a2+b2)和d是2r的因数
所以就可以这样求解了:(代码只过了样例)
void work()
{
long long l = r << 1 ;
long long n = sqrt(l) ;
int ans = 0;
for (long long i = 1 ; i <= n ; i ++ )//枚举d
if ( ! (l % i) )
{
long long m = sqrt(l / (i << 1) ) ;
for (long long j = 1 ; j <= m ; j ++ )//枚举a
{
long long k = sqrt(l / i - sqr(j) ) ;//推出b
if ( ! ( sqr(k) ^ l / i - sqr(j) ) && ! ( gcd( sqr(j), sqr(k) ) ^ 1 ) && sqr(j) ^ sqr(k) ) //判定是否满足条件
ans ++ ;
}
if (i ^ ( l / i ) )
{
long long m = sqrt(i >> 1) ;
for (long long j = 1 ; j <= m ; j ++ )//枚举a
{
long long k = sqrt( i - sqr(j) ) ;//推出b
if ( ! ( sqr(k) ^ i - sqr(j) ) && ! ( gcd( sqr(j), sqr(k) ) ^ 1 ) && sqr(j) ^ sqr(k) )//判定是否满足条件
ans ++ ;
}
}
}
printf("%d\n", ( ans << 2 ) + 4 );
}
T3 debug debug
这道题先写暴力,由于题目上说是最大值,可以直接从大到小枚举长度,再枚举左上角坐标,再暴力判定是否满足题目要求(评测机跑得飞快数据水,这个暴力最初卡过去了,后来换了编译器只T了一个点,换回来又卡过去了,过一会又只T了一个点)
正解蜜汁也是暴力
首先有如下事实——
对于中心相同的矩阵,若边长为a的正方形可行,则边长为[2,a-1]的正方形也可行,否则,边长大于a的正方形不可行
枚举矩阵的中心,假设边长为a的正方形可行,若要判断边长为a+1的正方形是否可行,可判断某一行是否和另一行反向相同。
可以通过压缩二进制来实现判断某一行是否和另一行反向相同,时间复杂度O( 玄学 n^4/32)
也可以使用hash来判断,时间复杂度O( 玄学 n^3),看起来比上面的优秀蒂花之秀
(暴力要打好啊)