CF每日一练(2.10)
Posted chd-acm
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了CF每日一练(2.10)相关的知识,希望对你有一定的参考价值。
CF-1093
1093A - Dice Rolling
- 输出x/2即可
#include<bits/stdc++.h>
using namespace std;
int main()
{
int t; cin >> t;
while (t--)
{
int x; cin >> x;
cout << x / 2 << endl;
}
return 0;
}
1093B - Letters Rearranging
- 当且仅当字符串中所有字符都相同时,答案为-1
ans!=-1
时,我们可以对字符排个序,然后输出即可。
#include <bits/stdc++.h>
using namespace std;
int t;
char s[1010];
int main(){
cin>>t;
while(t--){
cin>>s;
int flag = 0,len = strlen(s);
for(int i=1;i<len;i++){
if(s[i]!=s[0]){
flag = 1;break;
}
}
if(flag == 0)
printf("-1
");
else{
sort(s,s+len);
cout<<s<<endl;
}
}
return 0;
}
1093C - Mishka and the Last Exam
- 贪心,每次都让右边尽量大(或者让左边尽量小)
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
ll n,x;
ll a[200100];
int main(){
cin>>n>>x;
a[1] = 0,a[n]=x;
for(int i=2;i<=n/2;i++){
cin>>x;
if(x>=a[i-1]+a[n-i+2]){
a[i] = x - a[n-i+2];
a[n-i+1] = a[n-i+2];
}
else{
a[i] = a[i-1];
a[n-i+1] = x-a[i];
}
}
for(int i=1;i<=n;i++)
printf("%lld ",a[i]);
puts("");
return 0;
}
1093D - Beautiful Graph
- 给定一个图,相邻两点权值奇偶性不同,权值只能为{1,2,3}。问有多少中赋权值的方法
- 对于每一个联通块,先假设出发结点为奇数,那么与之相连的点都为偶数,bfs一遍即可算出有多少点为奇数,假设奇数为a个,偶数为b个,则该联通块方法数为:(a^2+b^2)
- 不同的联通块答案相乘即可
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int mod = 998244353;
int T,n,m;
vector<int> v[300010];
int vis[300010];
inline ll fast_pow(ll a,ll b){
ll ans = 1%mod;
for(;b;b>>=1){
if(b&1) ans = (ans*a)%mod;
a = (a*a)%mod;
}
return ans;
}
ll bfs(int x){
vis[x] = 1;
queue<int> q;
q.push(x);
int sum = 0,num = 0;//sum为该联通块总数,num为奇数个数
while(!q.empty()){
int u = q.front();q.pop();
sum++;
if(vis[u]==1)num++;
for(int i=0;i<v[u].size();i++){
int y = v[u][i];
if(vis[y]!=0){
//如果已经被访问过的v与u奇偶性相同,则返回0.最终答案也为0
if(vis[y]+vis[u]!=3){
return 0;
}
continue;
}
vis[y] = 3-vis[u];
q.push(y);
}
}
ll ans = (fast_pow(2,num)+fast_pow(2,sum-num))%mod;
return ans;
}
int main(){
cin>>T;
while(T--){
cin>>n>>m;
for(int i=1;i<=n;i++){
v[i].clear();
vis[i] = 0;
}
for(int i=1,x,y;i<=m;i++){
scanf("%d%d",&x,&y);
v[x].push_back(y);
v[y].push_back(x);
}
ll ans = bfs(1);
for(int i=1;i<=n;i++){
if(!vis[i]){
ans = (ans*bfs(i))%mod;
}
}
cout<<ans<<endl;
}
return 0;
}
以上是关于CF每日一练(2.10)的主要内容,如果未能解决你的问题,请参考以下文章