題目描述:(暫不提供)
這道題考場沒來得及看。
很顯然這是一道dpdp
dp題。首先我們設:
g i,
jg_
gi,j為i
ii個位置,j
jj種裝飾,相鄰兩兩不同裝飾種類的方案數。
只考慮1−j
1-j1−
j種裝飾。
g i,
j=gi
−1,j
∗(j−
1)+g
i−1,
j−1∗
jg_=g_*(j-1) +g_*j
gi,j=
gi−1
,j∗
(j−1
)+gi
−1,j
−1∗
j。對於第一項,前面已經有j
jj種裝飾,那就可以任意填j−1
j-1j−
1種裝飾。
對於第二項,前面有j−1
j-1j−
1種裝飾,你並不知道前面j−1
j-1j−
1種裝飾包含1−j
1-j1−
j中的哪一種,所以乘上jjj。
然後設fi,
jf_
fi,j
表示第i
ii行選j
jj種裝飾的方案
於是列舉k
kk來被轉移。
當k
kk不等於j
jj的時候:fi,
j∗[c
mk∗g
ai,k
]−
>fi
+1,k
f_*[c_^k*g_,k}] -> f_
fi,j∗
[cmk
∗ga
i,k
]−>fi
+1,k
當kk
k等於j
jj的時候:fi,
j∗[(
cmk−
1)∗g
ai,k
]−
>fi
+1,k
f_*[(c_^k-1)*g_,k}]->f_
fi,j∗
[(cm
k−1
)∗ga
i,k
]−>fi
+1,k
然後整合一下:
f i,
j=[c
mk∗g
ai,j
∗σkf
i−1,
k]−f
i−1,
j∗ga
i,
jf_=[c_^k*g_,j}*\sigma_f_]-f_*g_,j}
fi,j=
[cmk
∗ga
i,j
∗σk
fi−
1,k
]−fi
−1,j
∗ga
i,j
然後注意到σkf
i−1,
k\sigma_f_
σkfi−
1,k
是可以上一次算好的。所以fi,
jf_
fi,j
的轉移就是o(1
)o(1)
o(1)
的。然後注意下組合數要用分解質因數來算。
經過z jj
zjjzj
j的輔導,總算是調出來了。
時限給了5s
ss,然後我跑了一秒半。
吸了氧以後就跑進1s
ss了。
%
:pragma gcc optimize(2
)%:pragma gcc optimize
("ofast")%
:pragma gcc optimize
("inline"
)#include
#include
using
namespace std;
const
int n =
5010
;const
int m =
1000010
;inline
void
read
(int
&x)int cnt =
0,p[m]
,vis[m]
,c[m]
,t[m]
;int tot =
0,used[m]
,f[2
][n]
,g[n]
[n];
int n,m,mod,a[m]
,pre,ans;
inline
void
get_p()
}}inline
intf_pow
(int a,
int x)
inline
void
inc(
int x)
if(x >1)
}inline
void
dec(
int x)
inline
intcalc
(int x,
int y)
intmain()
for(
int i =
1;i <= m && i <= a[n]
;++ i) ans =
(ans + f[n &1]
[i])
% mod;
printf
("%d"
,(ans + mod)
% mod)
;fclose
(stdin);
fclose
(stdout);
return0;
}
當然空間也要注意,f
ff陣列是可以滾動的。
CSP賽前集訓 路徑
題目描述 暫不提供 這道題很明顯是一道原題。原題 gerald and giant chess 然後直接那麼做就好了 逃 這題其實之前也沒做過。但賽後聽說是原題結果發現果真是原題。首先n nn和m mm都很大,而k kk比較小,那麼我們的狀態肯定與k kk有關。首先將那k kk個點按照橫縱座標從小到...
CSP賽前集訓 表示式
題目描述 暫不提供 這道題放在第一題說明它很水。但是呢正是因為它很水但是細節較多所以我最後乙個寫這道題。結果呢後兩題做太久了,最好做的t1t1 t1反而沒拿分。這道題說實話就是要考慮多種情況。考慮把它分成三層 原串,去空格後的串,壓縮數字後的串。對於原串你就判斷一下有沒有別的字元或者全是空格或者這就...
賽前集訓前的總結(警醒)
從搬機房到現在總共考了九場試,並且靠這九場試分了一下機房,然後就在新機房裡倒數了 這幾次考試分數如下 70 228 165 60 85 140 100 20 160 總分1046 排名如下 11 1 9 27 7 12 15 28 9 總排名第10 然後分數統計圖是這樣的 名次統計圖是這個樣子的 統...