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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

Codeforces Round #817 (Div. 4)

發布時間:2023/10/11 编程问答 82 如意码农
生活随笔 收集整理的這篇文章主要介紹了 Codeforces Round #817 (Div. 4) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

CF傳送門

因為洛谷題庫未更新,所以給出的題面都是CF的。

現場打真是太卡了(梯子掛了,codeforc.es也崩了),所以五六分鐘才打開題目 \(qwq\)

A. Spell Check

萌萌題,把字符串放桶里,判名字每個字母是否恰好出現一次即可。

\(9min\) \(AC\) \(qwq\) 都怪CF

Code:

#include<bits/stdc++.h>
#define ll long long
using namespace std;
string s;
int t[150],T,n;
void solve(){
scanf("%d",&n);
cin>>s;
memset(t,0,sizeof(t));
for(int i=0;i<n;i++) t[s[i]]++;
if(t['T']==1&&t['i']==1&&t['m']==1&&t['u']==1&&t['r']==1&&n==5) printf("YES\n");
else printf("NO\n");
}
int main(){
scanf("%d",&T);
while(T--) solve();
return 0;
}

B. Colourblindness

萌萌題\(\times 2\),將 \(G\) 和 \(B\) 視為相同,然后比一下兩個字符串即可。

\(15min\) \(AC\)

Code:

#include<bits/stdc++.h>
#define ll long long
using namespace std;
string s1,s2;
int T,n;
bool a[105],b[105];
void solve(){
scanf("%d",&n);
cin>>s1>>s2;
memset(a,0,sizeof(a));
memset(b,0,sizeof(b));
for(int i=0;i<n;i++){
if(s1[i]=='R') a[i]=1;
if(s2[i]=='R') b[i]=1;
}
for(int i=0;i<n;i++){
if(a[i]!=b[i]){
printf("NO\n");
return ;
}
}
printf("YES\n");
}
int main(){
scanf("%d",&T);
while(T--) solve();
return 0;
}

C. Word Game

用三個 \(map\) 表示三個人每次用到過的字符串,然后分別判斷其他兩人有沒有用過,并計算答案即可。

\(25min\) \(AC\)

Code:

#include<bits/stdc++.h>
#define ll long long
using namespace std;
int T,n;
string s1[1005],s2[1005],s3[1005];
int ans1,ans2,ans3;
void solve(){
scanf("%d",&n);
map<string,bool> a,b,c;
ans1=ans2=ans3=0;
for(int i=1;i<=n;i++) cin>>s1[i],a[s1[i]]=1;
for(int i=1;i<=n;i++) cin>>s2[i],b[s2[i]]=1;
for(int i=1;i<=n;i++) cin>>s3[i],c[s3[i]]=1;
for(int i=1;i<=n;i++){
if(b[s1[i]]+c[s1[i]]==0) ans1+=3;
else if(b[s1[i]]+c[s1[i]]==1) ans1+=1;
}
for(int i=1;i<=n;i++){
if(a[s2[i]]+c[s2[i]]==0) ans2+=3;
else if(a[s2[i]]+c[s2[i]]==1) ans2+=1;
}
for(int i=1;i<=n;i++){
if(b[s3[i]]+a[s3[i]]==0) ans3+=3;
else if(b[s3[i]]+a[s3[i]]==1) ans3+=1;
}
printf("%d %d %d\n",ans1,ans2,ans3);
}
int main(){
scanf("%d",&T);
while(T--) solve();
return 0;
}

D. Line

首先可以知道,左半邊的 \(L\) 改為 \(R\) 可以使答案更優,右半邊的 \(R\) 改為 \(L\) 可以使答案更優。

所以只要先算出初始的答案,然后 \(l,r\) 從兩邊往中間掃,發現可以改的就更新答案并輸出,同時 \(cnt\) 記著更新了幾次。最后 \(cnt\) 還不到 \(n\) 的話說明已經最優不用改了,輸出 \(n-cnt\) 次最終答案即可。

幾個不等號注意一下即可。

\(41min\) \(AC\) \(qwq\)

Code:

#include<bits/stdc++.h>
#define ll long long
using namespace std;
int T,n;
ll ans;
string s;
void solve(){
scanf("%d",&n);
cin>>s;
ans=0;
for(int i=0;i<n;i++){
if(s[i]=='L') ans+=(ll)i;
else ans+=(ll)n-(ll)i-1ll;
}
int cnt=0,now=0;
for(int l=0,r=n-1;l<=n/2,r>=n/2;l++,r--){
if(s[l]=='L'){
now++;
ans-=(ll)l;
ans+=(ll)n-(ll)l-1ll;
}
if(now>cnt){
cnt=now;
printf("%lld ",ans);
}
if(s[r]=='R'){
now++;
ans+=(ll)r;
ans-=(ll)n-(ll)r-1ll;
}
if(now>cnt){
cnt=now;
printf("%lld ",ans);
}
}
for(int i=1;i<=n-cnt;i++) printf("%lld ",ans);
printf("\n");
}
int main(){
scanf("%d",&T);
while(T--) solve();
return 0;
}

E. Counting Rectangles

數據范圍要求 \(O(1)\) 查詢,所以一眼矩陣前綴和。

只需要預處理出 \(1000 \times 1000\) 范圍內的 \(sum[i][j]\),表示 \(i\times j\) 的矩形可以容納的答案即可。

同時注意,可能有重復的邊長(如樣例最后一組),所以 \(sum\) 初始時要 \(+=\)

但是這個菜ji賽時輸出的調掛了喜提 WA

Code:

#include<bits/stdc++.h>
#define ll long long
int T,n,q;
ll sum[1005][1005],x,y;
void solve(){
memset(sum,0,sizeof sum);
scanf("%d%d",&n,&q);
for(int i=1;i<=n;i++){
scanf("%lld%lld",&x,&y);
sum[x][y]+=x*y;
}
for(int i=1;i<=1000;i++){
for(int j=1;j<=1000;j++) sum[i][j]+=sum[i-1][j]+sum[i][j-1]-sum[i-1][j-1];
}
for(int i=1;i<=q;i++){
int u,v,w,z;
scanf("%d%d%d%d",&u,&v,&w,&z);
printf("%lld\n",sum[w-1][z-1]+sum[u][v]-sum[u][z-1]-sum[w-1][v]);
}
}
int main(){
scanf("%d",&T);
while(T--) solve();
return 0;
}

F. L-shapes

其實這題根本不用搜索,有耐心即可。

可以發現,在 \(n\times m\) 范圍內掃,可能合法的只有以下四種情況,其中藍色代表示是 *,紅色表示不能是 *,其中黃色五角星表示當前 \(i,j\) 的位置。

所以只要把 * 標記為 \(1\),全圖掃一遍,發現合法就給它變 \(0\),看最后有沒有 \(1\) 剩余即可。

因為 \(E\) 卡太久,\(1h\) \(45min\) 才 \(AC\) \(qwq\)

Code:

#include<bits/stdc++.h>
#define ll long long
using namespace std;
int T,n,m,a[55][55];
char c;
void search(int i,int j){
if(a[i+1][j]&&a[i+1][j+1]&&!a[i-1][j-1]&&!a[i-1][j]&&!a[i-1][j+1]&&
!a[i][j-1]&&!a[i][j+1]&&!a[i][j+2]&&!a[i+1][j-1]&&!a[i+1][j+2]&&
!a[i+2][j-1]&&!a[i+2][j]&&!a[i+2][j+1]&&!a[i+2][j+2]){
a[i][j]=a[i+1][j]=a[i+1][j+1]=0;
return ;
}
if(a[i+1][j-1]&&a[i+1][j]&&!a[i-1][j-1]&&!a[i-1][j]&&!a[i-1][j+1]&&
!a[i][j-2]&&!a[i][j-1]&&!a[i][j+1]&&!a[i+1][j-2]&&!a[i+1][j+1]&&
!a[i+2][j-2]&&!a[i+2][j-1]&&!a[i+2][j]&&!a[i+2][j+1]){
a[i][j]=a[i+1][j-1]=a[i+1][j]=0;
return ;
}
if(a[i][j+1]&&a[i+1][j+1]&&!a[i-1][j-1]&&!a[i-1][j]&&!a[i-1][j+1]&&
!a[i-1][j+2]&&!a[i][j-1]&&!a[i][j+2]&&!a[i+1][j-1]&&!a[i+1][j]&&
!a[i+1][j+2]&&!a[i+2][j]&&!a[i+2][j+1]&&!a[i+2][j+2]){
a[i][j]=a[i][j+1]=a[i+1][j+1]=0;
return ;
}
if(a[i][j+1]&&a[i+1][j]&&!a[i-1][j-1]&&!a[i-1][j]&&!a[i-1][j+1]&&
!a[i-1][j+2]&&!a[i][j-1]&&!a[i][j+2]&&!a[i+1][j-1]&&!a[i+1][j+1]&&
!a[i+1][j+2]&&!a[i+2][j-1]&&!a[i+2][j]&&!a[i+2][j+1]){
a[i][j]=a[i][j+1]=a[i+1][j]=0;
return ;
}
}
void solve(){
scanf("%d%d",&n,&m);
memset(a,0,sizeof(a));
for(int i=1;i<=n;i++){
for(int j=1;j<=m;j++){
cin>>c;
if(c=='*') a[i][j]=1;
}
}
for(int i=1;i<=n;i++){
for(int j=1;j<=m;j++){
if(a[i][j]==1) search(i,j);
}
}
for(int i=1;i<=n;i++){
for(int j=1;j<=m;j++){
if(a[i][j]==1){
printf("NO\n");
return ;
}
}
}
printf("YES\n");
}
int main(){
scanf("%d",&T);
while(T--) solve();
return 0;
}

G. Even-Odd XOR

巧妙的構造。賽時來不及了

應該有很多種方法,說一下我的想法。

首先發現從 \(0\) 開始排的有序數列,它的奇數位、偶數位的異或和很有特點(可以手算)。只要有辦法讓他們都等于 \(0\) 就是合法的答案了。

同時可以得知,要使 \(x_1\) 到 \(x_n\) 的異或和為 \(0\),只需要 \(x_1\) 到 \(x_{n-1}\) 的異或和等于 \(x_n\) 即可。

所以計一個 \(k\) 表示 \(0\) 到 \(n-1\) 的異或和放在最后,但發現這樣能會出現重復數字,比如 \(0\) 到 \(7\) 異或和為 \(0\),數列出現兩個 \(0\) 就不合法了。

所以想到搞兩個大數,比如 \(x=2^{24}\) 和 \(y=2^{25}\),各放在奇、偶位,同時將得到的 \(k\oplus x\oplus y\) ,答案就還是合法的且不會重復。多出兩個數怎么辦?\(0\) 到 \(n-1\) 改為到 \(n-3\) 即可。

Code:

#include <bits/stdc++.h>
using namespace std;
int T,n,k;
void solve(){
scanf("%d",&n);
k=0;
for(int i=0;i<n-3;i++){
printf("%d ",i);
k^=i;
}
int x=1<<24,y=1<<25;
printf("%d %d %d\n",k^x^y,x,y);
}
int main(){
scanf("%d",&T);
while(T--) solve();
return 0;
}

G L & H F !

總結

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

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