定義一種特殊的三元組:(x,y,z),其中x,y,z都代表紙帶上格仔的編號,這裡的三元組要求滿足以下兩個條件:
x y z是整數,xcolorx = colorz
通過第乙個條件易得x,y一定是同奇同偶
第二個條件無非是在限制這個三元組中x,z顏色相同
(u1s1,這個玩意跟y貌似沒什麼關係,所以是二元組
滿足上述條件的三元組的分數規定為(x+z)*(number_x+number_z)
題目的最終目標是計算所有三元組分數和
根據分數規定,純模擬,直接tle
細想其實這個三元組跟y沒關係,所以只用考慮x,z
那麼可以考慮把同奇同偶且顏色相同的分為一組
如果此時再直接進行模擬,也還是會tle
那麼想想辦法優化?
(x+z) * (number_x+number_z)=x * number_x+x *number_y+y * number_x+y * number_y
所以同一組內的分數
設m為組內的個數
組內第乙個數所得得部分分數即
x * number_x+x *number_y
=i ∗∑
i=2m
num[
i]+(
n−1)
∗(i∗
num[
i]
)i*\sum_^mnum[i]+(n-1)*(i*num[i])
i∗∑i=2
mnu
m[i]
+(n−
1)∗(
i∗nu
m[i]
)=i∗∑i
=1mn
um[i
]+(n
−2)∗
(i∗n
um[i
])
i*\sum_^mnum[i]+(n-2)*(i*num[i])
i∗∑i=1
mnu
m[i]
+(n−
2)∗(
i∗nu
m[i]
)那麼乙個組的得分數
=∑ i=
1m(i
∗∑j=
1m∗n
um[j
]+(m
−2)∗
num[
i]
)\sum_^m(i*\sum_^m*num[j]+(m-2)*num[i])
∑i=1m
(i∗∑
j=1m
∗nu
m[j]
+(m−
2)∗n
um[i
]) ∑j=
1m∗n
um[j
]\sum_^m*num[j]
∑j=1m
∗num
[j]這一部分可以再分組時用字首和優化
時間複雜度即可達到o(n)
#
include
#include
#include
using
namespace std;
const
int maxn=
1e5+10;
int n,m;
int num[maxn]
;long
long sum[maxn][3
];int t[maxn][3
];const
int mod=
10007
;int c[maxn]
;int
main()
long
long ans=0;
for(
int i=
1;i<=n;
++i)
cout
}
p2671 [noip2015 普及組] 求和 NOIP2015PJ 洛谷 P2671 求和
直接暴力肯定是不行的,我們需要把各種相同的顏色分離出來計算。但是只分離出來沒有用,因為三元組要求中間有乙個y。可以看出,x和z的奇偶性相同時,存在y使三元組成立。所以我們用兩個陣列儲存相同顏色的奇 偶情況,每次計算就變成計算這個序列的值。則原式 num 1 num 2 a num 1 a num 2...
P2669 NOIP2015 普及組 金幣
國王將金幣作為工資,發放給忠誠的騎士。第一天,騎士收到一枚金幣 之後兩天 第二天和第三天 每天收到兩枚金幣 之後三天 第 四 五 六天 每天收到三枚金幣 之後四天 第 七 八 九 十天 每天收到四枚金幣 這種工資發放模式會一直這樣延續下去 當連續n天每天收到n枚金幣後,騎士會在之後的連續n 1n 1...
NOIP 2015 普及組 初賽
noip 2015 普及組 初賽 疑難點 學習 感悟。本份試卷本人得分93,兩處錯誤,一錯在二 1.題,眼花了,多數了個資料3241 二錯在四 2.題 5 空,該空寫成rbound mid 1,這個錯誤在考試中是改正不了的,這是由本人解題方法決定的。也就是說該份試卷本人的極限是98。1.c.1000...