AIM Tech Round 4 (Div. 2) A B C

Posted 早知如此绊人心,何如当初莫相识。

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了AIM Tech Round 4 (Div. 2) A B C相关的知识,希望对你有一定的参考价值。

A. Diversity

题意:给出一个字符串,和n,问最多改变多少个字符,使其不同字符最少为n

 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 typedef long long ll;
 4 const int N=1e5+10;
 5 
 6 map<char ,int >ma;
 7 int main(){
 8     string s;
 9     cin>>s;
10     int n;
11     cin>>n;
12     int sum=0;
13     for(int i=0;i<s.size();i++){
14         if(!ma[s[i]]) sum++;
15         ma[s[i]]++;
16     }
17 
18     if(sum>=n) {
19         printf("0\n");
20     }
21     else {
22         int k=s.size();
23         int x=min(26-sum,k-sum);
24         if(x>=n-sum){
25             cout<<n-sum<<endl;
26         }
27         else cout<<"impossible"<<endl;
28     }
29 }

B - Rectangles

题意:给出一个0,1矩阵,问可以有多少个集合,使得里面的数字是同一行或者同一列,并且颜色相同

思路:计算每一行,每一列相同的数目,C(x,1)+C(x,2)+....C(x,x)=2^x-1;

 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 typedef long long ll;
 4 const int N=1e5+10;
 5 int n,m;
 6 int a[55][55];
 7  long long hh(long long a,long long b)
 8 {
 9     long long ans = 1;
10     while(b)//用一个循环从右到左便利b的所有二进制位
11     {
12         if(b&1)//判断此时b[i]的二进制位是否为1
13         {
14             ans = (ans*a);//乘到结果上,这里a是a^(2^i)%m
15             b--;//把该为变0
16         }
17         b/=2;
18         a = a*a;
19     }
20     return ans;
21 }
22 
23 int main(){
24     cin>>n>>m;
25     for(int i=1;i<=n;i++){
26         for(int j=1;j<=m;j++) scanf("%d",&a[i][j]);
27     }
28     ll sum=0;
29     int s1=0;
30     if(n==1&&m==1) {
31         cout<<1<<endl;return 0;
32     }
33     for(int i=1;i<=n;i++){
34         s1=0;
35         for(int j=1;j<=m;j++){
36         if(a[i][j]==1){
37             s1++;
38          }
39         }
40         sum+=hh(2,s1)+hh(2,m-s1)-2;
41     }
42     for(int i=1;i<=m;i++){
43         s1=0;
44         for(int j=1;j<=n;j++){
45             if(a[j][i]==1)
46                 s1++;
47         }
48         sum+=hh(2,s1)+hh(2,n-s1)-2;
49     }
50     cout<<sum-(n*m)<<endl;
51 }

C - Sorting by Subsequences

题意:把一个数列分成若干子序列,然后给这个子序列排序,使其最后整个递增,每个标号出现一次

思路:和并查集思想类似,

 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 const int N=1e5+10;
 4 
 5 int a[N],b[N];
 6 map<int ,int > ma;
 7 int vis[N];
 8 int l=0;
 9 set<int > s[N];
10 
11 void hh(int x){
12     while(!vis[x]){
13         vis[x]=1;
14         s[l].insert(x);
15         x=ma[b[x]];
16     }
17 }
18 
19 int main(){
20     int n;
21     cin>>n;
22     for(int i=1;i<=n;i++) {
23         scanf("%d",&a[i]);
24         ma[a[i]]=i;
25         b[i]=a[i];
26     }
27     sort(b+1,b+1+n);
28     for(int i=1;i<=n;i++){
29         if(!vis[i]){
30             l++;hh(i);
31         }
32     }
33     cout<<l<<endl;
34     for(int i=1;i<=l;i++){
35         printf("%d",s[i].size());
36         for(set<int >::iterator it=s[i].begin();it!=s[i].end();it++){
37             printf(" %d",*it);
38         }
39         printf("\n");
40     }
41 }

 

以上是关于AIM Tech Round 4 (Div. 2) A B C的主要内容,如果未能解决你的问题,请参考以下文章

AIM Tech Round 4 (Div. 2)(A,暴力,B,组合数,C,STL+排序)

AIM Tech Round 4 (Div. 2) D Prob

AIM Tech Round 4 (Div. 2) A B C

AIM Tech Round 3 (Div. 2) B

AIM Tech Round 5 (rated, Div. 1 + Div. 2)

AIM Tech Round 4 (Div. 1) C - Upgrading Tree 构造 + 树的重心