Codeforces Round #369 (Div. 2) ABCD
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Codeforces Round #369 (Div. 2) ABCD相关的知识,希望对你有一定的参考价值。
A. Bus to Udayland
题解:
水,看样例就知道题意了
代码:
#include<bits/stdc++.h> using namespace std; #define pb push_back #define mp make_pair #define se second #define fs first #define ll long long #define CLR(x) memset(x,0,sizeof x) #define MC(x,y) memcpy(x,y,sizeof(x)) #define SZ(x) ((int)(x).size()) #define FOR(it,c) for(__typeof((c).begin()) it=(c).begin();it!=(c).end();it++) #define lson l,m,rt<<1 #define rson m+1,r,rt<<1|1 #define INF 1e9 typedef pair<int,int> P; const double eps=1e-9; const int maxnnode=11000; const int maxn=100100; const int mod=20071027; string line[1010]; int main(){ int n; cin>>n; for(int i=1;i<=n;i++) cin>>line[i]; int flag=0; for(int i=1;i<=n;i++) { if(line[i][0]==‘O‘&&line[i][1]==‘O‘){ flag=1; line[i][0]=‘+‘; line[i][1]=‘+‘; break; } if(line[i][3]==‘O‘&&line[i][4]==‘O‘){ flag=1; line[i][3]=‘+‘; line[i][4]=‘+‘; break; } } if(!flag) cout<<"NO"<<endl; else{ cout<<"YES"<<endl; for(int i=1;i<=n;i++) cout<<line[i]<<endl; } }
B.Chris and Magic Square
题解:
水,模拟题,注意n=1的情况,还有不能为负
代码:
#include<bits/stdc++.h> using namespace std; #define pb push_back #define mp make_pair #define se second #define fs first #define ll long long #define CLR(x) memset(x,0,sizeof x) #define MC(x,y) memcpy(x,y,sizeof(x)) #define SZ(x) ((int)(x).size()) #define FOR(it,c) for(__typeof((c).begin()) it=(c).begin();it!=(c).end();it++) #define lson l,m,rt<<1 #define rson m+1,r,rt<<1|1 #define INF 1e9 typedef pair<int,int> P; const double eps=1e-9; const int maxnnode=11000; const int maxn=100100; const int mod=20071027; ll m[505][505]; ll sum1[505],sum2[505],sum3[3]; int main() { int n,x0,y0; cin>>n; for(int i=1;i<=n;i++) { for(int j=1;j<=n;j++) { cin>>m[i][j]; if(m[i][j]==0) { x0=i;y0=j; } } } if(n==1){ cout<<1<<endl; return 0; } for(int i=1;i<=n;i++) for(int j=1;j<=n;j++) sum1[i]+=m[i][j]; for(int i=1;i<=n;i++) for(int j=1;j<=n;j++) sum2[i]+=m[j][i]; for(int i=1;i<=n;i++) { sum3[1]+=m[i][i]; sum3[2]+=m[n+1-i][i]; } int flag=0; ll tmp; for(int i=1;i<=n;i++) { if(x0!=i) { tmp=sum1[i]; break; } } for(int i=1;i<=n;i++){ if(i==x0) continue; if(sum1[i]!=tmp) { flag=1; break; } } for(int i=1;i<=n;i++){ if(i==y0) continue; if(sum2[i]!=tmp) { flag=1; break; } } for(int i=1;i<=2;i++){ if(x0==y0&&i==1) continue; if(x0+y0==n+1&&i==2) continue; if(sum3[i]!=tmp) { flag=1; break; } } if(flag) cout<<-1<<endl; else{ ll x; x=tmp-sum1[x0]; if(x<=0) flag=1; else{ if(sum2[y0]+x!=tmp) flag=1; else{ if(x0==y0) if(sum3[1]+x!=tmp) flag=1; if(x0+y0==n+1) if(sum3[2]+x!=tmp) flag=1; } } if(flag) cout<<-1<<endl; else cout<<x<<endl; } return 0; }
C. Coloring Trees
题解:
给你n个位置,每个位置可以涂m种颜色.a[i]=0表示未涂,可以涂1-m种颜色,否则表示已图
每个位置涂不同颜色的花费不同,要求将为0的位置全部涂色,连续相同的算一组,正好分成k组的最少费用
dp[i][j][k]表示前i个位置,第i个位置为颜色j,分为k组的最少费用
代码:
#include<bits/stdc++.h> using namespace std; #define ll long long const int N=108; const ll M=1000000000008ll; ll n,m,tar,w[N][N],a[N]; ll f[N][N][N]; int main(void) { ll i,j,k,p; scanf("%I64d%I64d%I64d",&n,&m,&tar); for(i=1;i<=n;i++)scanf("%I64d",a+i); for(i=1;i<=n;i++)for(j=1;j<=m;j++)scanf("%I64d",&w[i][j]); for(i=1;i<=n;i++) for(j=1;j<=m;j++) for(k=0;k<=tar;k++)f[i][j][k]=M; if(a[1])f[1][a[1]][1]=0; else{for(j=1;j<=m;j++)f[1][j][1]=w[1][j];} for(i=2;i<=n;i++) if(a[i]) { for(j=1;j<=tar;j++) for(k=1;k<=m;k++)f[i][a[i]][j]=min(f[i][a[i]][j],f[i-1][k][j-((k==a[i])?0:1)]); } else { for(p=1;p<=m;p++) for(j=1;j<=tar;j++) for(k=1;k<=m;k++)f[i][p][j]=min(f[i][p][j],f[i-1][k][j-((k==p)?0:1)]+w[i][p]); } k=f[n][1][tar]; for(i=2;i<=m;i++)k=min(k,f[n][i][tar]); if(k==M)cout<<-1; else cout<<k; return 0; }
D. Directed Roads
题解:
在训练指南上面抄了份有向图强连通分量的模板。。
然后水过了
代码:
#include<bits/stdc++.h> using namespace std; #define pb push_back #define mp make_pair #define se second #define fs first #define ll long long #define CLR(x) memset(x,0,sizeof x) #define MC(x,y) memcpy(x,y,sizeof(x)) #define SZ(x) ((int)(x).size()) #define FOR(it,c) for(__typeof((c).begin()) it=(c).begin();it!=(c).end();it++) #define lson l,m,rt<<1 #define rson m+1,r,rt<<1|1 #define INF 1e9 typedef pair<int,int> P; const double eps=1e-9; const int maxnnode=11000; const int maxn=2*100000+10; const ll mod=1000000007; int p[maxn]; int pre[maxn],lowlink[maxn],sccno[maxn],dfs_clock,scc_cnt; stack<int> S; int cnt[maxn]; void dfs(int u){ pre[u]=lowlink[u]=++dfs_clock; S.push(u); int v=p[u]; if(!pre[v]){ dfs(v); lowlink[u]=min(lowlink[u],lowlink[v]); }else if(!sccno[v]){ lowlink[u]=min(lowlink[u],pre[v]); } if(lowlink[u]==pre[u]){ scc_cnt++; for(;;){ int x=S.top();S.pop(); sccno[x]=scc_cnt; if(x==u) break; } } } void Find_scc(int n) { dfs_clock=scc_cnt=0; for(int i=1;i<=n;i++) if(!pre[i]) dfs(i); } ll quickmod(ll a,ll b){ ll ans=1; while(b){ if(b&1){ ans=(ans*a)%mod; b--; } b/=2; a=a*a%mod; } return ans; } int main() { int n; scanf("%d",&n); for(int i=1;i<=n;i++) scanf("%d",&p[i]); Find_scc(n); for(int i=1;i<=n;i++) cnt[sccno[i]]++; ll ans=1; for(int i=1;i<=n;i++){ if(cnt[i]==0) continue; ll sum=0; sum+=quickmod(2,cnt[i]); sum%=mod; if(cnt[i]>1) { sum+=mod; sum-=2; sum%=mod; } ans*=sum; ans%=mod; } cout<<ans<<endl; }
以上是关于Codeforces Round #369 (Div. 2) ABCD的主要内容,如果未能解决你的问题,请参考以下文章
Codeforces Round #369 (Div. 2)
Codeforces Round #369 (Div. 2) ABCD
Codeforces Round #369 (Div. 2)