文章目录
A - Maximum Square
#include<bits/stdc++.h>
using namespace std;
const int maxn=1e3+10;
int a[maxn];
int main(){
int k;
scanf("%d",&k);
while(k--){
int n;scanf("%d",&n);
for(int i=1;i<=n;i++){
scanf("%d",&a[i]);
}
sort(a+1,a+1+n);
int Max=0;
for(int i=1;i<=n;i++){
Max=max(Max,min(i,a[n-i+1]));
}
cout<<Max<<endl;
}
}
B1 - Character Swap (Easy Version)
#include<bits/stdc++.h>
using namespace std;
int main(){
int t;
scanf("%d",&t);
while(t--){
int n;
scanf("%d",&n);
string s1,s2;
cin>>s1>>s2;
vector<int>vec;
for(int i=0;i<n;i++){
if(s1[i]!=s2[i])
vec.push_back(i);
}
if(vec.size()!=2)puts("NO");
else if(s1[vec[0]]==s1[vec[1]]&&s2[vec[0]]==s2[vec[1]])puts("YES");
else puts("NO");
}
return 0;
}
B2 - Character Swap (Hard Version)
#include<bits/stdc++.h>
using namespace std;
int main(){
int t;
scanf("%d",&t);
while(t--){
int n;
scanf("%d",&n);
string s1,s2;
cin>>s1>>s2;
bool flag=true;
vector<pair<int,int> >ans;
for(int i=0;i<n;i++){
if(s1[i]==s2[i])continue;
bool flag1=false;
for(int j=i+1;j<n;j++){
if(s1[i]==s1[j]){
flag1=true;
swap(s1[j],s2[i]);
ans.push_back(make_pair(j,i));
break;
}
}
if(!flag1){
for(int j=i+1;j<n;j++){
if(s1[i]==s2[j]){
flag1=true;
swap(s1[j],s2[j]);
ans.push_back(make_pair(j,j));
swap(s1[j],s2[i]);
ans.push_back(make_pair(j,i));
break;
}
}
}
if(!flag1){
flag=false;
break;
}
}
if(flag){
puts("YES");
printf("%d\n",ans.size());
for(int i=0;i<ans.size();i++){
printf("%d %d\n",ans[i].first+1,ans[i].second+1);
}
}
else puts("NO");
}
}
C - Tile Painting
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
int main(){
ll n;
scanf("%lld",&n);
ll ans=n;
for(ll i=2;i*i<=n;i++){
if(n%i==0){
ans=i;
break;
}
}
while(n!=1){
if(n%ans){
ans=1;
break;
}
n/=ans;
}
cout<<ans<<endl;
}
D - 0-1 MST
求补图连通块的的数量
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const ll maxn=1e5+10;
set<ll>e[maxn];
set<ll>s;
bool vis[maxn];
void bfs(ll x){
queue<ll>q;
q.push(x);
vis[x]=true;
s.erase(x);
while(!q.empty()){
ll u=q.front();
q.pop();
//cout<<u<<endl;
vector<ll>v;
for(set<ll>::iterator it=s.begin();it!=s.end();it++){
if(e[u].find(*it)==e[u].end()){
if(!vis[*it]){
vis[*it]=true;
q.push(*it);
v.push_back(*it);
}
}
}
for(ll i=0;i<v.size();i++)s.erase(v[i]);
}
}
int main(){
//memset(head,-1,sizeof(head));
ll n,m;
scanf("%lld%lld",&n,&m);
for(ll i=1;i<=m;i++){
ll u,v;
scanf("%lld%lld",&u,&v);
e[u].insert(v);
e[v].insert(u);
}
ll ans=0;
for(ll i=1;i<=n;i++){
s.insert(i);
}
for(ll i=1;i<=n;i++){
if(!vis[i]){
bfs(i);
ans++;
}
}
cout<<ans-1<<endl;
}
E - Sum Balance
for(ll j=i;j;j=i&(j-1))中j遍历一个集合状态i的所有非零子集
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const ll maxn=5e3+10;
const ll INF=0x7f7f7f7f7f;
ll n;
ll cnt[16];
ll tot[16];
ll a[16][maxn];
unordered_map<ll,ll>mp,mp2;
pair<ll,ll>ans[16];
vector<pair<ll,ll> >dp[1<<16];
int main(){
ll n;
ll sum=0;
scanf("%lld",&n);
for(ll i=1;i<=n;i++){
scanf("%lld",&cnt[i]);
for(ll j=1;j<=cnt[i];j++){
scanf("%lld",&a[i][j]);
tot[i]+=a[i][j];
mp[a[i][j]]=i;
}
sum+=tot[i];
}
if(sum%n){
puts("NO");
return 0;
}
sum/=n;
for(ll i=1;i<=n;i++){
for(ll j=1;j<=cnt[i];j++){
mp2[a[i][j]]=sum-tot[i]+a[i][j];
}
}
for(ll i=1;i<=n;i++){
for(ll j=1;j<=cnt[i];j++){
vector<pair<ll,ll> >vec;
ll s=1<<(i-1);
ll x=mp2[a[i][j]];
vec.push_back(make_pair(i,x));
while(mp.count(x)&&!(s&(1<<(mp[x]-1)))){
s|=(1<<(mp[x]-1));
vec.push_back(make_pair(mp[x],mp2[x]));
x=mp2[x];
}
if(x==a[i][j]&&!dp[s].size())dp[s]=vec;
}
}
for(ll i=0;i<(1<<n);i++){
if(dp[i].size())continue;
for(ll j=i;j;j=i&(j-1)){
if(dp[j^i].size()&&dp[j].size()){
for(ll k=0;k<dp[j].size();k++){
dp[i].push_back(dp[j][k]);
}
for(ll k=0;k<dp[i^j].size();k++){
dp[i].push_back(dp[i^j][k]);
}
break;
}
}
}
if(!dp[(1<<n)-1].size()){
puts("NO");
return 0;
}
puts("YES");
for(ll i=0;i<dp[(1<<n)-1].size();i++){
ans[mp[dp[(1<<n)-1][i].second]]=make_pair(dp[(1<<n)-1][i].second,dp[(1<<n)-1][i].first);
}
for(ll i=1;i<=n;i++){
printf("%lld %lld\n", ans[i].first,ans[i].second);
}
}