1. 程式人生 > >AIM Tech Round 4 (Div. 2) A B C

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

can out cnblogs 並查集 logs using scan 色相 所有

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