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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

Codeforces Round #662 (Div. 2)

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

就寫了兩個題,以為要掉分,結果早上起來發現還上分了(說明wtcl

A - Rainbow Dash, Fluttershy and Chess Coloring

無論邊長是奇數還是偶數,考慮每次操作最外層的一圈,一個人操作一圈的一般,然后另一個人就能夠把這一圈涂滿,而且還能繼續操作最外圈。每次2人操作后問題變成邊長-2的情況。稍微思考一下就可。

#define IO ios::sync_with_stdio(false);cin.tie();cout.tie(0) #include<iostream> #include<algorithm> using namespace std; int n; int main() {IO;int T;cin>>T;while(T--){cin>>n;if(n&1)cout<<(n-3)/2+2<<endl;elsecout<<(n-2)/2+2<<endl;}return 0; }

B - Applejack and Storages

統計4的倍數和2的倍數。其中既是4的倍速也是2的倍數只看做4的倍數。

#define IO ios::sync_with_stdio(false);cin.tie();cout.tie(0) #include<iostream> #include<algorithm> using namespace std; const int N=100010; int mp[N]; int n,q; int main() {IO;cin>>n;int x=0,y=0;for(int i=1;i<=n;i++){int a;cin>>a;mp[a]++;if(mp[a]%2==0) y++;//加完后是2的倍數if(mp[a]%4==0) x++,y-=2; //加完后是4的倍數(要把二的倍數減去)}cin>>q;while(q--){char op;int a;cin>>op>>a;if(op=='+'){mp[a]++;if(mp[a]%2==0) y++;if(mp[a]%4==0) x++,y-=2;}else{if(mp[a]%2==0) y--;//減之前是2的倍數 2的倍數減小一個if(mp[a]%4==0) x--,y+=2;//減之前是4的倍數 4的倍數減小一個,2的倍數最終應該增加一個(由于上面減了一個要加二個這點wa了2發)mp[a]--;}if(x>=1&&y>=2||x>=2) cout<<"YES"<<endl;else cout<<"NO"<<endl;}return 0; }

C - Pinkie Pie Eats Patty-cakes

最小距離最大?二分?,做題的時候我就發現二分的check函數好像不容易寫。如果能夠寫出check函數其實好像不用二分直接答案就出來了。
果不其然,群友說這就是個貪心題,后來想了想果然是。1111222233334445566789
比如上述序列,構造方式如下:
1234569
123457
123468
123
如果是11111222233334445566789
123469
12346
12357
12458
13
因此有以下貪心

#define IO ios::sync_with_stdio(false);cin.tie();cout.tie(0) #include<iostream> #include<algorithm> #include<cstring> using namespace std; const int N=100010; int mp[N],n; int main() {IO;int T;cin>>T;while(T--){cin>>n;int mx=0;memset(mp,0,sizeof mp);for(int i=1;i<=n;i++){int a;cin>>a;mp[a]++;mx=max(mx,mp[a]);}int cnt=0;for(int i=0;i<N;i++)if(mp[i]==mx) cnt++;cout<<cnt+(n-cnt*mx)/(mx-1)-1<<endl;}return 0; }

D-Rarity and New Dress

懸線dp?第一次聽說,一定要把這題補了
解法一:二分抄代碼題解
維護菱形中間點,先求上下最長,維護左右最長(不能超過上下最長)

#define IO ios::sync_with_stdio(false);cin.tie();cout.tie(0) #define debug(x) cout<<#x<<": "<<x<<" " #include<iostream> #include<algorithm> using namespace std; typedef long long ll; const int N=2010; int n,m; ll ans; int u[N][N],d[N][N],l[N][N],r[N][N]; int h[N][N]; char s[N][N]; int main() {IO;cin>>n>>m;for(int i=1;i<=n;i++) cin>>s[i]+1;// 預處理for(int j=1;j<=m;j++){for(int i=1;i<=n;i++){if(s[i][j]==s[i-1][j]) u[i][j]=u[i-1][j]+1;else u[i][j]=1;}for(int i=n;i;i--){if(s[i][j]==s[i+1][j]) d[i][j]=d[i+1][j]+1;else d[i][j]=1;}for(int i=1;i<=n;i++) h[i][j]=min(d[i][j],u[i][j]);}for(int i=1;i<=n;i++){for(int j=1;j<=m;j++){if(s[i][j]==s[i][j-1]) l[i][j]=min(l[i][j-1]+1,h[i][j]);else l[i][j]=1;}for(int j=m;j;j--){if(s[i][j]==s[i][j+1]) r[i][j]=min(r[i][j+1]+1,h[i][j]);else r[i][j]=1;}}// 求答案for(int i=1;i<=n;i++)for(int j=1;j<=m;j++)ans+=min(l[i][j],r[i][j]);cout<<ans<<endl;return 0; }

解法二:
這個菱形可以看成4個等腰直角三角形,維護等腰直角三角形(即菱形中心點)
f[i][j]表示s[i][j]為直角頂點最大等腰直角三角形。4次dp

#define IO ios::sync_with_stdio(false);cin.tie();cout.tie(0) #define debug(x) cout<<#x<<": "<<x<<" " #include<iostream> #include<algorithm> using namespace std; typedef long long ll; const int N=2010; int n,m; ll ans; int f1[N][N],f2[N][N],f3[N][N],f4[N][N]; char s[N][N]; int main() {IO;cin>>n>>m;for(int i=1;i<=n;i++) cin>>s[i]+1;for(int i=1;i<=n;i++)for(int j=1;j<=m;j++){f1[i][j]=1;if(s[i][j]==s[i-1][j]&&s[i][j]==s[i][j-1]) f1[i][j]=min(f1[i-1][j],f1[i][j-1])+1;}for(int i=1;i<=n;i++)for(int j=m;j;j--){f2[i][j]=1;if(s[i][j]==s[i-1][j]&&s[i][j]==s[i][j+1]) f2[i][j]=min(f2[i-1][j],f2[i][j+1])+1;}for(int i=n;i;i--)for(int j=1;j<=m;j++){f3[i][j]=1;if(s[i][j]==s[i+1][j]&&s[i][j]==s[i][j-1]) f3[i][j]=min(f3[i+1][j],f3[i][j-1])+1;}for(int i=n;i;i--)for(int j=m;j;j--){f4[i][j]=1;if(s[i][j]==s[i+1][j]&&s[i][j]==s[i][j+1]) f4[i][j]=min(f4[i+1][j],f4[i][j+1])+1;}for(int i=1;i<=n;i++)for(int j=1;j<=m;j++) ans+=min(min(f1[i][j],f2[i][j]),min(f3[i][j],f4[i][j]));cout<<ans<<endl;return 0; }

總結

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

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