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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

Codeforces Round #724 (Div. 2) 题解

發布時間:2023/12/3 编程问答 23 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Codeforces Round #724 (Div. 2) 题解 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

文章目錄

  • A. Omkar and Bad Story
  • B. Prinzessin der Verurteilung
  • C. Diluc and Kaeya
  • D. Omkar and Medians
  • E. Omkar and Forest
  • F. Omkar and Akmar

#724-Div.2

A. Omkar and Bad Story

直接set暴力加值,加滿300300300個為止

#include <cstdio> #include <set> #include <map> using namespace std; #define maxn 105 set < int > ans; map < int, int > mp; int T, n;int main() {scanf( "%d", &T );while( T -- ) {scanf( "%d", &n );mp.clear(), ans.clear();for( int i = 1, x;i <= n;i ++ )scanf( "%d", &x ), ans.insert( x ), mp[x] = 1;while( 1 ) {bool flag = 1;for( set < int > :: iterator it = ans.begin();it != ans.end();it ++ ) {set < int > :: iterator nxt = it; nxt ++;for( ;nxt != ans.end();nxt ++ )if( ! mp[( *nxt ) - ( *it )] ) {mp[( *nxt ) - ( *it )] = 1;ans.insert( ( *nxt ) - ( *it ) );if( ans.size() > 300 ) goto print;flag = 0;}}if( flag ) break;}print :if( ans.size() > 300 ) printf( "NO\n" );else {printf( "YES\n%d\n", ans.size() );for( set < int > :: iterator it = ans.begin();it != ans.end();it ++ )printf( "%d ", ( *it ) );printf( "\n" );}}return 0; }

B. Prinzessin der Verurteilung

直接對字符串進行二十六進制位編碼,長度一共就100010001000,所以其實MEXMEXMEX的長度是非常小的

可以直接暴力做

#include <iostream> #include <cstdio> #include <cmath> #include <set> using namespace std; #define maxn 1005 #define int long long set < int > st; int T, n; char s[maxn], ans[maxn];signed main() {scanf( "%lld", &T );while( T -- ) {scanf( "%lld %s", &n, s + 1 );int t;for( int len = 1;len <= n;len ++ ) {st.clear();for( int i = 1;i <= n - len + 1;i ++ ) {int j = i + len - 1;int v = 0, p = 1;for( int k = j;k >= i;k --, p *= 26 )v += p * ( s[k] - 'a' + 1 );st.insert( v );}int k = 1, p = 1; t = 0;while( k <= len ) {t += p;p *= 26;k ++;}int End = t + p;for( set < int > :: iterator it = st.begin();it != st.end();it ++ )if( ( *it ) != t ) goto print;else t ++;if( t != End ) goto print;}print :int cnt = 0, p = 1;while( t > 0 ) {ans[++ cnt] = ( ( t % 26 ) + 25 ) % 26 + 'a';t -= ( ans[cnt] - 'a' + 1 );t /= 26;}for( int i = cnt;i;i -- ) printf( "%c", ans[i] );printf( "\n" );}return 0; }

C. Diluc and Kaeya

還是挺考思維的

會發現,頻率(a,b)(a,b)(a,b)如果可以,后面接一段同樣的頻率(a,b)(a,b)(a,b),總體可以根據這個頻率進行分塊

而總體的頻率仍然是(a+a,b+b)→(a,b)(a+a,b+b)\rightarrow(a,b)(a+a,b+b)(a,b)

所以有從左到右遍歷所有前綴,則前綴的答案等于迄今為止這對前綴的出現次數

#include <map> #include <cstdio> #include <iostream> using namespace std; #define maxn 500005 map < pair < int, int >, int > mp; int T, n; char s[maxn];int gcd( int x, int y ) {if( x < y ) swap( x, y );if( ! y ) return x;else return gcd( y, x % y ); }int main() {scanf( "%d", &T );while( T -- ) {mp.clear();scanf( "%d %s", &n, s + 1 );int D = 0, K = 0;for( int i = 1;i <= n;i ++ ) {if( s[i] == 'D' ) D ++;else K ++;int d = gcd( D, K );int NewD = D / d, NewK = K / d;mp[make_pair( NewD, NewK )] ++;printf( "%d ", mp[make_pair( NewD, NewK )] );}printf( "\n" );}return 0; }

D. Omkar and Medians

考慮對于當前aia_{i}ai?而言

如果ai<ai?1a_i<a_{i-1}ai?<ai?1?也就相當于整個序列新增了極大值在最后面;反之新增了極小值在最前面

發現每次只能新增一個,那么aia_iai?就不能跨過與ai?1a_{i-1}ai?1?有關的某個范圍

(aia_iai?不能比現有的最小的大于ai?1a_{i-1}ai?1?的值還大;aia_iai?不能比現有的最大的小于ai?1a_{i-1}ai?1?的值還小)

這可以使用set來模擬

#include <set> #include <cstdio> using namespace std; #define maxn 200005 set < int > s; int T, n; int a[maxn];int main() {scanf( "%d", &T );again :while( T -- ) {scanf( "%d", &n );for( int i = 1;i <= n;i ++ )scanf( "%d", &a[i] );s.clear();s.insert( a[1] );for( int i = 2;i <= n;i ++ ) {int last = a[i - 1];if( a[i] == last ) continue;else if( last < a[i] ) {set < int > :: iterator it = s.upper_bound( last );if( it != s.end() && ( *it ) < a[i] ) {printf( "NO\n" );goto again;} else;} else {set < int > :: iterator it = s.lower_bound( last );if( it != s.begin() && ( *(-- it) ) > a[i] ) {printf( "NO\n" );goto again;} else;}s.insert( a[i] );} printf( "YES\n" );}return 0; }

E. Omkar and Forest

相鄰格子相差不能超過111;如果某個單元格中的數字嚴格大于0,則至少應嚴格大于與其相鄰的一個單元格中的數字 —— 這其實是bfs的過程

000確定后,便可以一層一層往外推

所以這是道結論題,答案就是2#的個數2^{\#的個數}2#

當然要特判整張圖一個零都沒有的情況需要減一(全都沒填零)

#include <cstdio> #define mod 1000000007 #define int long long #define maxn 2005 int T, n, m; char s[maxn];int qkpow( int x, int y ) {int ans = 1;while( y ) {if( y & 1 ) ans = ans * x % mod;x = x * x % mod;y >>= 1;}return ans; }signed main() {scanf( "%lld", &T );while( T -- ) {scanf( "%lld %lld", &n, &m );int cnt = 0;for( int i = 1;i <= n;i ++ ) {scanf( "%s", s + 1 );for( int j = 1;j <= m;j ++ )cnt += ( s[j] =='#' );}if( cnt == n * m ) printf( "%lld\n", ( qkpow( 2, cnt ) - 1 + mod ) % mod );else printf( "%lld\n", qkpow( 2, cnt ) );}return 0; }

F. Omkar and Akmar

最后的終止局面一定是AB(相鄰不同顏色)或者A|B(相鄰不同顏色中插個空)

對抗性博弈論,后手必勝(秉持對著填原則)

染色數一定是偶數,且染色球之間最多有一個空

枚舉染色數iii,染色情況數為i!i!i!

環特殊分情況看第一個位置是否染色

如果第一個位置不是空,iii染色導致有iii個位置放置n?xn-xn?x被限制死的空,Cin?iC_i^{n-i}Cin?i?

如果第一個位置是空,Ci?1n?i?1C_{i-1}^{n-i-1}Ci?1n?i?1?

最后要乘個222,因為ABAB...跟BABA...算不同局面

#include <cstdio> #define maxn 1000005 #define int long long #define mod 1000000007 int n; int fac[maxn], inv[maxn];int qkpow( int x, int y ) {int ans = 1;while( y ) {if( y & 1 ) ans = ans * x % mod;x = x * x % mod;y >>= 1;}return ans; }int C( int n, int m ) {if( n < m ) return 0;else return fac[n] * inv[m] % mod * inv[n - m] % mod; }signed main() {scanf( "%lld", &n );fac[0] = inv[0] = 1;for( int i = 1;i <= n;i ++ ) fac[i] = fac[i - 1] * i % mod;inv[n] = qkpow( fac[n], mod - 2 );for( int i = n - 1;i;i -- ) inv[i] = inv[i + 1] * ( i + 1 ) % mod;int ans = 0;for( int i = 2;i <= n;i += 2 )ans = ( ans + ( C( i, n - i ) % mod + C( i - 1, n - i - 1 ) ) % mod * fac[i] % mod ) % mod;printf( "%lld\n", ans * 2 % mod );return 0; }

總結

以上是生活随笔為你收集整理的Codeforces Round #724 (Div. 2) 题解的全部內容,希望文章能夠幫你解決所遇到的問題。

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