一共要使用六根木棍,那麼分割的方法就兩種,
那麼關鍵就是要計算2,3的數量。
cnt1[i]表示每種長度的木棍的方案數
cnt2[i]最初表示用不同的木棍拼成長度為i邊的方案數,後來表示選出四根木棍構成的方案數。
cnt22[i]表示用兩個長度相同的不同木棍拼成長度為i的邊的方案數。
cnt3[i]表示用三根不同的木棍拼成長度為i的方案數。
考慮兩個的情況,我們可以o(
n2) 的列舉兩個不同的木棍,然後用cnt2[a[i]+a[j]]的答案。
關鍵是怎麼求cnt3,cnt2.
(1)cnt3
考慮cnt3的組成列舉cnt1超過3的長度sum,然後列舉每一根單獨的木棍,設長度為x。
因為cnt2中保證了兩個木棍是不同的,所以只需要考慮減去列舉到的木棍計入了cnt2的情況,不合法的情況就是cnt1[sum-2*x]。還有一種特殊情況需要注意su
m=3∗
x ,這樣子cnt1[sum-2*x]中包含了x所以還需要-1.
這樣計算相當於(x,y,z)三元組在列舉到x,y,z的時候都會計算一遍。所以最後的和要/3
(2)cnt2
組成情況比較複雜,首先列舉兩根木棍形成的長度
1.先考慮最簡單的,選中的四根木棍的長度相同,貢獻是c(
cnt1
[sum
∗2/4
],4)
2.(x,y,z,z)這種情況也比較好計算,答案是是(c
nt2[
sum]
−cnt
22[su
m])∗
cnt22
[sum
] 會不會出現(x,z,z,z),不會啊如果那樣的話x=z,同第一種情況
3.(x,y,x,y)中情況等價於從c(
cnt1
[x],
2)∗c
(cnt
1[y]
,2)
4.(x,y,z,k)我們列舉sum=x+y,列舉x(這裡列舉的是長度,不再是木棍)。可以確定二元組(x,y)。要求(z,k)與(x,y)不同且z!=k。答案是(c
nt2[
sum]
−cnt
22[su
m]−c
nt1[
x]∗c
nt1[
y])∗
cnt1
[x]∗
cnt1
[y] 。這種情況列舉到(x,y),(z,k)都會計算,所以最後要/2.
#include
#include
#include
#include
#include
#define n 10000003
#define ll long long
#define m 100003
using namespace std;
int n,a[m];
ll cnt1[n],cnt2[n],cnt22[n],cnt3[n],c1[n];
intq[m],m,q1[m],m1;
ll c(int
x,int
y)int main()
for (int i=1;i<=n;i++)
for (int j=i+1;j<=n;j++)
if (a[i]+a[j]<=mx)
for (int i=1;i<=mx;i++) c1[i]=c(cnt1[i],2);
for (int i=1;i<=mx;i++)
if (cnt1[i]>=3) q[++m]=i;
for (int i=1;i<=mx;i++)
if (cnt1[i]) q1[++m1]=i;
for (int i=1;i<=m;i++)
cnt3[sum]+=(ll)cnt/3;
}m=0;
for (int i=1;i<=mx;i++)
if(cnt1[i]>=2) q[++m]=i;
for (int i=1;i<=m;i++)
cnt2[x]+=sum/2;
if (x
*2%4==0) cnt2[x]+=c(cnt1[x
*2/4],4);
cnt2[x]+=(ll)cnt22[x]*t;
} ll ans=0;
for (int i=1;i<=m1;i++)
printf("%i64d\n",ans);
}
北京集訓DAY3
消去合法的序列 剩下的不合法序列一定是 3兩種括號個數各加1除2 手算一下即可4 5 include 6 include 7 include 8 9const int maxn 100010 10 11int len,top,cnt 1213 char s maxn 1415 inthh 25int...
省隊集訓Round2 DAY3
用splay維護權值有序。每次加入乙個人,貪心的選出前i 1個人中要求最小的vi 1,判斷能否滿足,如果能滿足就把這vi 1個人的權值 1,剩下的人不需要他們的支援,那麼都賦值成0,並且把這些點移動到平衡樹中0所在的位置 如果不能滿足就直接在平衡樹中加入乙個 1.要求每乙個時間每條邊只能有乙個人經過...
省隊集訓Round3 DAY4
講序列分成三部分,大根堆,緩衝區s,小根堆。任意時刻保證mid在緩衝區中,並且盡量保證大根堆和小根堆的大小盡量相等。均攤時間複雜度為o 首先打表發現sg函式的規律。1 p為奇數,從0開始sg值01迴圈 要統計區間的答案其實就是統計區間中sg值為1的數的個數。用線段樹維護區間中偶數 奇數的個數其實就是...