日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

[2021.4.7多校省选模拟33]A,B,C

發布時間:2023/12/3 编程问答 26 豆豆
生活随笔 收集整理的這篇文章主要介紹了 [2021.4.7多校省选模拟33]A,B,C 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

文章目錄

  • 考試復盤
  • A
  • B
  • C

考試復盤

今天的題其實蠻溫柔的

考完試預估分160160160,好家伙到手的只有14\frac{1}{4}41?

第一題是原題,做過的,雖然忘記怎么做了。。。⊙︿⊙

但是因為本身較簡單,考場上也想到了正解

但是因為我的SBSBSB二分midmidmid附近點的取舍可能導致了答案位置的偏差111

(╥╯^╰╥)哭暈在廁所了謝謝

第二題感覺就是DPDPDP轉移,聯想到了正睿的一道劃段合并DPDPDP

但是passpasspass了,發現自己需要將i,i+1i,i+1i,i+1i,i?1i,i-1i,i?1是否相鄰的信息拿到

自己的DPDPDP轉移不動

反正就是沒想到再拿一個DPDPDP,兩個相互轉移

打了303030的暴力表,結果又出現了經典菜譜——沒輸入完就直接return0return\ 0return?0

丟了

第三題撲臉而來的NTTNTTNTT味道,但是不會

只能寫最原始的DPDPDP暴力打表,結果忘記調用打表函數,結果全是000

Y(>_<、)Y

總結:

今天考試的題目比較簡單,所以暴露出了很多細節/策略問題,如果在省選場上出現那簡直就是死亡名單

1.對細節偏差非常講究的題目(T1)一定要構造數據想辦法測一測那個臨界附近

2.如果暴力分能打表,那么最好先寫了后放在后面自己跑,繼續往下做。今天是最后十幾分鐘打的表,時間就很緊張。如果一開始看到就直接打表肯定是不會這么慌張的(T3)

3.對于自己不喜歡寫對拍這件事,真的要在后面每一場比賽中強迫自己寫——不一定要拍正解,至少保證自己能拿到的分一定不能丟!(T2如果寫對拍,肯定發現自己直接結束程序的bug)

省選在即,把握細節,優化策略,是最后的王牌!

A

考慮枚舉作為中位數的妹子

然后兩邊一定是選一段等長的區間

設選的中位數在mid處

二分兩邊選多少數,設選了x個

比較這2x+12x+12x+1個數的平均數和第mid?xmid-xmid?xn?x+1n-x+1n?x+1個數的平均數

如果前者大,說明xxx應該變小,否則xxx變大

#include <cmath> #include <cstdio> #include <iostream> #include <algorithm> using namespace std; #define maxn 200005 int n; double a[maxn], sum[maxn];double calc( int pos, int x ) {return ( sum[pos] - sum[pos - x - 1] + sum[n] - sum[n - x] ) / ( x << 1 | 1 ); }int main() {scanf( "%d", &n );for( int i = 1;i <= n;i ++ )scanf( "%lf", &a[i] );sort( a + 1, a + n + 1 );for( int i = 1;i <= n;i ++ )sum[i] = sum[i - 1] + a[i];double ret = 0;for( int i = 1;i <= n;i ++ ) {int l = 0, r = min( i - 1, n - i ), x = 0;while( l < r ) {int mid = ( l + r ) >> 1;if( calc( i, mid ) < calc( i, mid + 1 ) )l = mid + 1;elser = mid;}ret = max( ret, calc( i, l ) - a[i] );}printf( "%.4f\n", ret );return 0; }

B

設計狀態f[i][j]f[i][j]f[i][j]表示前iii個數的排列且包含jjj對非法相鄰數對的方案數,當我們放入i+1i+1i+1這個數的時候發生3種狀況:

  • 打破一對非法相鄰數對

  • 增加一對非法相鄰數對

  • 不變。

增加的情況就發生在iiii+1i+1i+1相鄰的情況

所以我們還需要知道iii是否處于某個非法相鄰數對。

因此重新設計狀態

f[i][j]f[i][j]f[i][j]:前i個數的排列且包含j對非法相鄰數對,iii存在于非法相鄰數對中的方案數

g[i][j]g[i][j]g[i][j]iii不存在于非法相鄰數對中的方案數

轉移就是考慮i+1i+1i+1的放置方法

f[i][j]f[i][j]f[i][j] 的放置方法有4種:

  • 與i相鄰且增加一對非法相鄰數對,只會是[i?1,i,i+1],1[i-1,i,i+1], 1[i?1,i,i+1],1種方法

    f[i+1][j+1]f[i+1][j+1]f[i+1][j+1]

  • iii相鄰且不改變非法相鄰數對數,只會是[i?1,i+1,i],1[i-1,i+1,i], 1[i?1,i+1,i],1種方法

    f[i+1][j]f[i+1][j]f[i+1][j]

  • 不與iii相鄰且減少一對非法相鄰數對,有j?1j-1j?1種方法

    g[i+1][j?1]g[i+1][j-1]g[i+1][j?1]

  • 不與i相鄰且不改變非法相鄰數對數,有i?ji-ji?j種方法

    g[i+1][j]g[i+1][j]g[i+1][j]

g[i][j]g[i][j]g[i][j]333種情況

  • iii相鄰且增加一對非法相鄰數對,可能是[i+1,i][i+1,i][i+1,i][i,i+1],2[i,i+1],2[i,i+1]2種方法

    f[i+1][j+1]f[i+1][j+1]f[i+1][j+1]

  • 不與iii相鄰且減少一對非法相鄰數對,有jjj種擺放方法

    g[i+1][j?1]g[i+1][j-1]g[i+1][j?1]

  • 不與iii相鄰且不改變非法相鄰數對數,有i?j?1i-j-1i?j?1種擺放方法

    g[i+1][j]g[i+1][j]g[i+1][j]

最終的答案就是g[N][0]g[N][0]g[N][0]

#include <cstdio> #include <cstring> #define int long long #define maxn 1005 int n, mod; int f[maxn][maxn], g[maxn][maxn];signed main() {while( ~ scanf( "%lld %lld", &n, &mod ) ) {memset( f, 0, sizeof( f ) );memset( g, 0, sizeof( g ) );g[1][0] = 1;for( int i = 1;i < n;i ++ )for( int j = 0;j < i;j ++ ) {f[i + 1][j + 1] = ( f[i + 1][j + 1] + f[i][j] ) % mod;f[i + 1][j] = ( f[i + 1][j] + f[i][j] ) % mod;if( j ) g[i + 1][j - 1] = ( g[i + 1][j - 1] + f[i][j] * ( j - 1 ) ) % mod;g[i + 1][j] = ( g[i + 1][j] + f[i][j] * ( i - j ) ) % mod;f[i + 1][j + 1] = ( f[i + 1][j + 1] + g[i][j] * 2 ) % mod;if( j ) g[i + 1][j - 1] = ( g[i + 1][j - 1] + g[i][j] * j ) % mod;g[i + 1][j] = ( g[i + 1][j] + g[i][j] * ( i - j - 1 ) ) % mod; }printf( "%lld\n", ( g[n][0] + mod ) % mod );}return 0; }

C

N=3×7×11×47=10857N=3\times 7\times 11\times 47 =10857N=3×7×11×47=10857

fi,jf_{i,j}fi,j?表示前iii位模NNNjjj的方案數

利用倍增思想,優化暴力轉移

f2i,(j?10i+k)%N=∑fi,j?fi,kf_{2i,(j·10^i+k)\%N}=\sum f_{i,j}·f_{i,k}f2i,(j?10i+k)%N?=fi,j??fi,k?

固定2i2i2i,令k=10i,gt=∑j?k%N=tfi,j,ht=fi,tk=10^i,g_t=\sum_{j·k\%N=t}f_{i,j},h_t=f_{i,t}k=10i,gt?=j?k%N=t?fi,j?,ht?=fi,t?

則轉移變為f2i,j+k=gj?hkf_{2i,j+k}=g_j*h_kf2i,j+k?=gj??hk?

標準可愛的卷積形式,FFTFFTFFT加速矩陣

#include <cmath> #include <cstdio> #include <iostream> using namespace std; #define ll long long #define maxn 200100 #define mod 9973 #define N 10857struct complex {double x, i;complex(){}complex( double X, double I ) {x = X, i = I;} }A[maxn], B[maxn];double pi = acos( -1.0 );complex operator + ( complex a, complex b ) {return complex( a.x + b.x, a.i + b.i ); }complex operator - ( complex a, complex b ) {return complex( a.x - b.x, a.i - b.i ); }complex operator * ( complex a, complex b ) {return complex( a.x * b.x - a.i * b.i, a.x * b.i + a.i * b.x ); }int len = 32768; int r[maxn];void FFT( complex *v, int opt ) {for( int i = 0;i < len;i ++ )if( i < r[i] ) swap( v[i], v[r[i]] );for( int i = 1;i < len;i <<= 1 ) {complex omega( cos( pi / i ), opt * sin( pi / i ) );for( int j = 0;j < len;j += ( i << 1 ) ) {complex w( 1, 0 );for( int k = 0;k < i;k ++, w = w * omega ) {complex x = v[j + k], y = v[j + k + i] * w;v[j + k] = x + y;v[j + k + i] = x - y;}}} }int qkpow( int x, int y ) {int ans = 1;while( y ) {if( y & 1 ) ans = ans * x % N;x = x * x % N;y >>= 1;}return ans; }bool check( int x ) {return x % 2 && x % 3 && x % 5 && x % 7 && x % 11 && x % 47; }void mul( int *f, int *g, int L ) {int k = qkpow( 10, L );for( int i = 0;i < N;i ++ ) {A[i * k % N] = complex( int( f[i] + A[i * k % N].x ) % mod , 0 );B[i] = complex( g[i], 0 );f[i] = 0;}FFT( A, 1 ), FFT( B, 1 );for( int i = 0;i < len;i ++ ) A[i] = A[i] * B[i];FFT( A, -1 );for( int i = 0;i < len;i ++ ) {f[i % N] = ( f[i % N] + (ll)( A[i].x / len + 0.5 ) ) % mod;A[i] = B[i] = complex( 0, 0 );} }int n; int c[5] = { 1, 2, 3, 5, 7 }; int f[maxn], g[maxn];int main() {scanf( "%d", &n );if( n == 1 ) return ! printf( "1\n" );else n --;int L = f[0] = g[1] = g[2] = g[3] = g[5] = g[7] = 1;int l = log2( len );for( int i = 0;i < len;i ++ )r[i] = ( r[i >> 1] >> 1 ) | ( ( i & 1 ) << ( l - 1 ) );while( n ) {if( n & 1 ) mul( f, g, L );mul( g, g, L );n >>= 1;L <<= 1;}int ans = 0;for( int i = 0;i < N;i ++ )for( int j = 0;j < 5;j ++ )if( check( i * 10 + c[j] ) )ans = ( ans + f[i] ) % mod;else;printf( "%d\n", ans );return 0; }

總結

以上是生活随笔為你收集整理的[2021.4.7多校省选模拟33]A,B,C的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。