久违的写篇博客吧

A. Maximum Square

题目链接:https://codeforces.com/contest/1243/problem/A

题意:

给定n个栅栏,对这n个栅栏进行任意排序,问可形成的最大正方形面积是多少

分析:

水题。

先排个序 , 然后暴力枚举正方形边长就可以了

#include<bits/stdc++.h>
#define ios std::ios::sync_with_stdio(false)
#define sd(n) scanf("%d",&n)
#define sdd(n,m) scanf("%d%d",&n,&m)
#define sddd(n,m,k) scanf("%d%d%d",&n,&m,&k)
#define pd(n) printf("%d\n", (n))
#define pdd(n,m) printf("%d %d\n", n, m)
#define pld(n) printf("%lld\n", n)
#define pldd(n,m) printf("%lld %lld\n", n, m)
#define sld(n) scanf("%lld",&n)
#define sldd(n,m) scanf("%lld%lld",&n,&m)
#define slddd(n,m,k) scanf("%lld%lld%lld",&n,&m,&k)
#define sf(n) scanf("%lf",&n)
#define sff(n,m) scanf("%lf%lf",&n,&m)
#define sfff(n,m,k) scanf("%lf%lf%lf",&n,&m,&k)
#define rep(i,a,n) for (int i=a;i<=n;i++)
#define per(i,n,a) for (int i=n;i>=a;i--)
#define mm(a,n) memset(a, n, sizeof(a))
#define pb push_back
#define all(x) (x).begin(),(x).end()
#define fi first
#define se second
#define ll long long
#define MOD 1000000007
#define pi 3.14159265358979323
#define lrt rt<<1
#define rrt rt<<1|1
#define lson l, m, lrt
#define rson m+1, r, rrt
#define debug(x) cout << #x << ": " << x << endl
#define debug2(x, y) cout <<#x<<": "<<x<<" | "<<#y<<": "<<y<< endl;
#define debug3(x, y, z) cout <<#x<<": "<<x<<" | "<<#y<<": "<<y<<" | "<<#z<<": "<<z<<endl;
#define debug4(a, b, c, d) cout <<#a<<": "<<a<<" | "<<#b<<": "<<b<<" | "<<#c<<": "<<c<<" | "<<#d<<": "<<d<<endl;
using namespace std;
const ll INF (0x3f3f3f3f3f3f3f3fll);
const int inf (0x3f3f3f3f);
template<typename T>void read(T &res){bool flag=false;char ch;while(!isdigit(ch=getchar()))(ch=='-')&&(flag=true);
for(res=ch-;isdigit(ch=getchar());res=(res<<)+(res<<)+ch - );flag&&(res=-res);}
template<typename T>void Out(T x){if(x<)putchar('-'),x=-x;if(x>)Out(x/);putchar(x%+'');}
ll gcd(ll a,ll b){return b?gcd(b,a%b):a;}
ll lcm(ll a,ll b){return a*b/gcd(a,b);}
ll pow_mod(ll x,ll n,ll mod){ll res=;while(n){if(n&)res=res*x%mod;x=x*x%mod;n>>=;}return res;}
ll fact_pow(ll n,ll p){ll res=;while(n){n/=p;res+=n;}return res;}
ll mult(ll a,ll b,ll p){a%=p;b%=p;ll r=,v=a;while(b){if(b&){r+=v;if(r>p)r-=p;}v<<=;if(v>p)v-=p;b>>=;}return r;}
ll quick_pow(ll a,ll b,ll p){ll r=,v=a%p;while(b){if(b&)r=mult(r,v,p);v=mult(v,v,p);b>>=;}return r;}
bool CH(ll a,ll n,ll x,ll t)
{ll r=quick_pow(a,x,n);ll z=r;for(ll i=;i<=t;i++){r=mult(r,r,n);if(r==&&z!=&&z!=n-)return true;z=r;}return r!=;}
bool Miller_Rabin(ll n)
{if(n<)return false;if(n==)return true;if(!(n&))return false;ll x=n-,t=;while(!(x&)){x>>=;t++;}srand(time(NULL));
ll o=;for(ll i=;i<o;i++){ll a=rand()%(n-)+;if(CH(a,n,x,t))return false;}return true;}
int prime[],minprime[];
void euler(int n)
{int c=,i,j;for(i=;i<=n;i++){if(!minprime[i])prime[++c]=i,minprime[i]=i;for(j=;j<=c&&i*prime[j]<=n;j++)
{minprime[i*prime[j]]=prime[j];if(i%prime[j]==)break;}}} const int N = 1e3 + ;
int a[N];
int main(){
ios;
int t;
cin >> t;
while(t -- )
{
int n;
cin >> n;
int a[N];
rep(i , , n - )
{
cin >> a[i];
}
sort(a,a+n);
int len = ;
per(i , n - , )
{
if(a[i] > len){
len ++;
}
else
{
break;
}
}
cout << len << '\n';
}
return ;
}

B1. Character Swap (Easy Version)

题目链接:https://codeforces.com/contest/1243/problem/B1

题意:

给你两个长度为 n 的字符串 S 和 T ,每次操作你可以交换 S 、T上任意两个位置的字符。问是否能只进行一次操作使 S 串 等于 T串。能输出 "Yes" , 不能输出 "No"

分析:

遍历字符串,当 S[i] != T[i] 时,判断从i + 1 到 n是否有s[j] == s[i] && t[j] != s[j],若不存在则说明无法进行一次操作使得两个字符串相等;

若存在则标记cot为0,继续遍历,倘若又一次出现s[i] != t[i],则输出"No".

#include<bits/stdc++.h>
#define ios std::ios::sync_with_stdio(false)
#define sd(n) scanf("%d",&n)
#define sdd(n,m) scanf("%d%d",&n,&m)
#define sddd(n,m,k) scanf("%d%d%d",&n,&m,&k)
#define pd(n) printf("%d\n", (n))
#define pdd(n,m) printf("%d %d\n", n, m)
#define pld(n) printf("%lld\n", n)
#define pldd(n,m) printf("%lld %lld\n", n, m)
#define sld(n) scanf("%lld",&n)
#define sldd(n,m) scanf("%lld%lld",&n,&m)
#define slddd(n,m,k) scanf("%lld%lld%lld",&n,&m,&k)
#define sf(n) scanf("%lf",&n)
#define sff(n,m) scanf("%lf%lf",&n,&m)
#define sfff(n,m,k) scanf("%lf%lf%lf",&n,&m,&k)
#define rep(i,a,n) for (int i=a;i<=n;i++)
#define per(i,n,a) for (int i=n;i>=a;i--)
#define mm(a,n) memset(a, n, sizeof(a))
#define pb push_back
#define all(x) (x).begin(),(x).end()
#define fi first
#define se second
#define ll long long
#define MOD 1000000007
#define pi 3.14159265358979323
#define lrt rt<<1
#define rrt rt<<1|1
#define lson l, m, lrt
#define rson m+1, r, rrt
#define debug(x) cout << #x << ": " << x << endl
#define debug2(x, y) cout <<#x<<": "<<x<<" | "<<#y<<": "<<y<< endl;
#define debug3(x, y, z) cout <<#x<<": "<<x<<" | "<<#y<<": "<<y<<" | "<<#z<<": "<<z<<endl;
#define debug4(a, b, c, d) cout <<#a<<": "<<a<<" | "<<#b<<": "<<b<<" | "<<#c<<": "<<c<<" | "<<#d<<": "<<d<<endl;
using namespace std;
const ll INF (0x3f3f3f3f3f3f3f3fll);
const int inf (0x3f3f3f3f);
template<typename T>void read(T &res){bool flag=false;char ch;while(!isdigit(ch=getchar()))(ch=='-')&&(flag=true);
for(res=ch-;isdigit(ch=getchar());res=(res<<)+(res<<)+ch - );flag&&(res=-res);}
template<typename T>void Out(T x){if(x<)putchar('-'),x=-x;if(x>)Out(x/);putchar(x%+'');}
ll gcd(ll a,ll b){return b?gcd(b,a%b):a;}
ll lcm(ll a,ll b){return a*b/gcd(a,b);}
ll pow_mod(ll x,ll n,ll mod){ll res=;while(n){if(n&)res=res*x%mod;x=x*x%mod;n>>=;}return res;}
ll fact_pow(ll n,ll p){ll res=;while(n){n/=p;res+=n;}return res;}
ll mult(ll a,ll b,ll p){a%=p;b%=p;ll r=,v=a;while(b){if(b&){r+=v;if(r>p)r-=p;}v<<=;if(v>p)v-=p;b>>=;}return r;}
ll quick_pow(ll a,ll b,ll p){ll r=,v=a%p;while(b){if(b&)r=mult(r,v,p);v=mult(v,v,p);b>>=;}return r;}
bool CH(ll a,ll n,ll x,ll t)
{ll r=quick_pow(a,x,n);ll z=r;for(ll i=;i<=t;i++){r=mult(r,r,n);if(r==&&z!=&&z!=n-)return true;z=r;}return r!=;}
bool Miller_Rabin(ll n)
{if(n<)return false;if(n==)return true;if(!(n&))return false;ll x=n-,t=;while(!(x&)){x>>=;t++;}srand(time(NULL));
ll o=;for(ll i=;i<o;i++){ll a=rand()%(n-)+;if(CH(a,n,x,t))return false;}return true;}
int prime[],minprime[];
void euler(int n)
{int c=,i,j;for(i=;i<=n;i++){if(!minprime[i])prime[++c]=i,minprime[i]=i;for(j=;j<=c&&i*prime[j]<=n;j++)
{minprime[i*prime[j]]=prime[j];if(i%prime[j]==)break;}}} const int N = 2e5 + ;
char s[N] , t[N];
int main()
{
ios;
int q;
cin >> q;
while(q --)
{
int n ;
cin >> n;
cin >> s + >> t + ;
int flag = , cot = ;
rep(i , , n)
{
if(!flag) break;
if(s[i] == t[i])
continue;
else
{
if(cot == )
{
cout << "No\n";
flag = ;
break;
}
int have = ;
rep(j , i + , n)
{
if(s[j] == s[i] && t[j] != s[j])
{
swap(t[i] , s[j]);
cot = ;
have = ;
}
}
if(!have)
{
cout << "No\n";
flag = ;
}
}
}
if(flag)
cout <<"Yes\n";
}
return ;
}

B2. Character Swap (Hard Version)

题目链接:https://codeforces.com/contest/1243/problem/B2

题意:

给你两个长度为 n 的字符串 S 和 T ,每次操作你可以交换 S 、T上任意两个位置的字符。

问在 2n 操作次数内能否是 S 等于 T,若可以则输出"Yes"并打印交换方法,若不可以则输出"No"

分析:

其实仔细观察我们会发现只要能够使S串变为T串,那么它的操作次数一定是在2n以内。

然而我们还是要优先选择优质的交换方法。

当 S[i] != T[i] 从后遍历判断是否存在S[j] == S[i] , 若存在则交换 T[i] 和 S[j] , 否则判断是否存在T[j] == S[i] ,若存在则可以先交换S[i] 和 T[i] ,再交换S[i] = T[j],若不存在则输出"No"

#include<bits/stdc++.h>
#define ios std::ios::sync_with_stdio(false)
#define sd(n) scanf("%d",&n)
#define sdd(n,m) scanf("%d%d",&n,&m)
#define sddd(n,m,k) scanf("%d%d%d",&n,&m,&k)
#define pd(n) printf("%d\n", (n))
#define pdd(n,m) printf("%d %d\n", n, m)
#define pld(n) printf("%lld\n", n)
#define pldd(n,m) printf("%lld %lld\n", n, m)
#define sld(n) scanf("%lld",&n)
#define sldd(n,m) scanf("%lld%lld",&n,&m)
#define slddd(n,m,k) scanf("%lld%lld%lld",&n,&m,&k)
#define sf(n) scanf("%lf",&n)
#define sff(n,m) scanf("%lf%lf",&n,&m)
#define sfff(n,m,k) scanf("%lf%lf%lf",&n,&m,&k)
#define rep(i,a,n) for (int i=a;i<=n;i++)
#define per(i,n,a) for (int i=n;i>=a;i--)
#define mm(a,n) memset(a, n, sizeof(a))
#define pb push_back
#define all(x) (x).begin(),(x).end()
#define fi first
#define se second
#define ll long long
#define MOD 1000000007
#define pi 3.14159265358979323
#define lrt rt<<1
#define rrt rt<<1|1
#define lson l, m, lrt
#define rson m+1, r, rrt
#define debug(x) cout << #x << ": " << x << endl
#define debug2(x, y) cout <<#x<<": "<<x<<" | "<<#y<<": "<<y<< endl;
#define debug3(x, y, z) cout <<#x<<": "<<x<<" | "<<#y<<": "<<y<<" | "<<#z<<": "<<z<<endl;
#define debug4(a, b, c, d) cout <<#a<<": "<<a<<" | "<<#b<<": "<<b<<" | "<<#c<<": "<<c<<" | "<<#d<<": "<<d<<endl;
using namespace std;
const ll INF (0x3f3f3f3f3f3f3f3fll);
const int inf (0x3f3f3f3f);
template<typename T>void read(T &res){bool flag=false;char ch;while(!isdigit(ch=getchar()))(ch=='-')&&(flag=true);
for(res=ch-;isdigit(ch=getchar());res=(res<<)+(res<<)+ch - );flag&&(res=-res);}
template<typename T>void Out(T x){if(x<)putchar('-'),x=-x;if(x>)Out(x/);putchar(x%+'');}
ll gcd(ll a,ll b){return b?gcd(b,a%b):a;}
ll lcm(ll a,ll b){return a*b/gcd(a,b);}
ll pow_mod(ll x,ll n,ll mod){ll res=;while(n){if(n&)res=res*x%mod;x=x*x%mod;n>>=;}return res;}
ll fact_pow(ll n,ll p){ll res=;while(n){n/=p;res+=n;}return res;}
ll mult(ll a,ll b,ll p){a%=p;b%=p;ll r=,v=a;while(b){if(b&){r+=v;if(r>p)r-=p;}v<<=;if(v>p)v-=p;b>>=;}return r;}
ll quick_pow(ll a,ll b,ll p){ll r=,v=a%p;while(b){if(b&)r=mult(r,v,p);v=mult(v,v,p);b>>=;}return r;}
bool CH(ll a,ll n,ll x,ll t)
{ll r=quick_pow(a,x,n);ll z=r;for(ll i=;i<=t;i++){r=mult(r,r,n);if(r==&&z!=&&z!=n-)return true;z=r;}return r!=;}
bool Miller_Rabin(ll n)
{if(n<)return false;if(n==)return true;if(!(n&))return false;ll x=n-,t=;while(!(x&)){x>>=;t++;}srand(time(NULL));
ll o=;for(ll i=;i<o;i++){ll a=rand()%(n-)+;if(CH(a,n,x,t))return false;}return true;}
int prime[],minprime[];
void euler(int n)
{int c=,i,j;for(i=;i<=n;i++){if(!minprime[i])prime[++c]=i,minprime[i]=i;for(j=;j<=c&&i*prime[j]<=n;j++)
{minprime[i*prime[j]]=prime[j];if(i%prime[j]==)break;}}} const int N = 2e5 + ;
char s[N] , t[N];
pair<int , int>hehe;
vector<pair<int , int>>vec;
map<char ,int >haha;
int main()
{
ios;
int T;
cin >> T;
while(T -- )
{
haha.clear();
vec.clear();
int n;
cin >> n;
cin >> s + >> t + ; rep(i , , n)
haha[s[i]] ++ , haha[t[i]] ++ ;
int flag = ;
rep(i , , )
{
if(haha[i + 'a'] & )
{
flag = ;
break;
}
}
if(flag)
{
cout << "No" << '\n';
continue;
}
rep(i , , n)
{
if(s[i] == t[i])
continue;
else
{
int falg = ;
rep(j , i + , n)
{
if(s[i] == s[j])
{
hehe.first = j , hehe.second = i;
vec.pb(hehe);
swap(s[j] , t[i]);
falg = ;
break;
}
}
if(!falg)
{
rep(j , i + , n)
{
if(s[i] == t[j])
{
swap(s[i] , t[i]);
hehe.fi = i , hehe.se = i;
vec.pb(hehe);
swap(s[i] , t[j]);
hehe.fi = i , hehe.se = j;
vec.pb(hehe);
break;
}
}
}
}
}
int len = vec.size();
if(len >= * n)
{
cout << "No" << '\n';
continue;
}
cout << "Yes" << '\n';
cout << vec.size() << '\n';
rep(i , , vec.size() - )
cout << vec[i].fi << " " << vec[i].se << '\n';
}
return ;
}

C. Tile Painting

题目链接:https://codeforces.com/contest/1243/problem/C

题意:

给你 n 个方格 , 第 i 个位置的倍数的颜色需要和 第 i 个位置的颜色相同,问你最多可以用多少种颜色来填充

分析:

找找规律我们会发现它是有循环节的,而循环节就是n / lcm = 所有因子的gcd

 #include<bits/stdc++.h>
#define ios std::ios::sync_with_stdio(false)
#define sd(n) scanf("%d",&n)
#define sdd(n,m) scanf("%d%d",&n,&m)
#define sddd(n,m,k) scanf("%d%d%d",&n,&m,&k)
#define pd(n) printf("%d\n", (n))
#define pdd(n,m) printf("%d %d\n", n, m)
#define pld(n) printf("%lld\n", n)
#define pldd(n,m) printf("%lld %lld\n", n, m)
#define sld(n) scanf("%lld",&n)
#define sldd(n,m) scanf("%lld%lld",&n,&m)
#define slddd(n,m,k) scanf("%lld%lld%lld",&n,&m,&k)
#define sf(n) scanf("%lf",&n)
#define sff(n,m) scanf("%lf%lf",&n,&m)
#define sfff(n,m,k) scanf("%lf%lf%lf",&n,&m,&k)
#define rep(i,a,n) for (int i=a;i<=n;i++)
#define per(i,n,a) for (int i=n;i>=a;i--)
#define mm(a,n) memset(a, n, sizeof(a))
#define pb push_back
#define all(x) (x).begin(),(x).end()
#define fi first
#define se second
#define ll long long
#define MOD 1000000007
#define pi 3.14159265358979323
#define lrt rt<<1
#define rrt rt<<1|1
#define lson l, m, lrt
#define rson m+1, r, rrt
#define debug(x) cout << #x << ": " << x << endl
#define debug2(x, y) cout <<#x<<": "<<x<<" | "<<#y<<": "<<y<< endl;
#define debug3(x, y, z) cout <<#x<<": "<<x<<" | "<<#y<<": "<<y<<" | "<<#z<<": "<<z<<endl;
#define debug4(a, b, c, d) cout <<#a<<": "<<a<<" | "<<#b<<": "<<b<<" | "<<#c<<": "<<c<<" | "<<#d<<": "<<d<<endl;
using namespace std;
const ll INF (0x3f3f3f3f3f3f3f3fll);
const int inf (0x3f3f3f3f);
template<typename T>void read(T &res){bool flag=false;char ch;while(!isdigit(ch=getchar()))(ch=='-')&&(flag=true);
for(res=ch-;isdigit(ch=getchar());res=(res<<)+(res<<)+ch - );flag&&(res=-res);}
template<typename T>void Out(T x){if(x<)putchar('-'),x=-x;if(x>)Out(x/);putchar(x%+'');}
ll gcd(ll a,ll b){return b?gcd(b,a%b):a;}
ll lcm(ll a,ll b){return a*b/gcd(a,b);}
ll pow_mod(ll x,ll n,ll mod){ll res=;while(n){if(n&)res=res*x%mod;x=x*x%mod;n>>=;}return res;}
ll fact_pow(ll n,ll p){ll res=;while(n){n/=p;res+=n;}return res;}
ll mult(ll a,ll b,ll p){a%=p;b%=p;ll r=,v=a;while(b){if(b&){r+=v;if(r>p)r-=p;}v<<=;if(v>p)v-=p;b>>=;}return r;}
ll quick_pow(ll a,ll b,ll p){ll r=,v=a%p;while(b){if(b&)r=mult(r,v,p);v=mult(v,v,p);b>>=;}return r;}
bool CH(ll a,ll n,ll x,ll t)
{ll r=quick_pow(a,x,n);ll z=r;for(ll i=;i<=t;i++){r=mult(r,r,n);if(r==&&z!=&&z!=n-)return true;z=r;}return r!=;}
bool Miller_Rabin(ll n)
{if(n<)return false;if(n==)return true;if(!(n&))return false;ll x=n-,t=;while(!(x&)){x>>=;t++;}srand(time(NULL));
ll o=;for(ll i=;i<o;i++){ll a=rand()%(n-)+;if(CH(a,n,x,t))return false;}return true;}
int prime[],minprime[];
void euler(int n)
{int c=,i,j;for(i=;i<=n;i++){if(!minprime[i])prime[++c]=i,minprime[i]=i;for(j=;j<=c&&i*prime[j]<=n;j++)
{minprime[i*prime[j]]=prime[j];if(i%prime[j]==)break;}}} const int N = 2e5 + ;
vector<ll>haha;
void init(ll n)
{
ll i ;
for(i = ; i * i < n ; i ++)
{
if(n % i == )
haha.pb(i) , haha.pb(n / i);
}
if(i * i == n)
haha.pb(i);
}
int main()
{
ios;
haha.clear();
ll n;
cin >> n;
init(n);
haha.pb(n);
ll ans = haha[];
rep(i , , haha.size() - )
ans = gcd(ans , haha[i]);
cout << ans << '\n';
return ;
}

D. 0-1 MST

题目链接:https://codeforces.com/contest/1243/problem/D

题意:

给你一张包含 n 个点的完全图,其中有m条边的权值为1,其它的为0。现要求你求出最小生成树的权值

分析:

先将 n 个点存入 set<int> S(表示该点还未在任何连通块里),并用vis进行标记

再对每个点开个set<int>G用来存图

遍历每个点 , 若 vis[i] = 1 则将 i 从集合S中删除并以 i 为起点进行 bfs 寻找连通块 , 同时连通块个数 cnt ++。

bfs 过程中遍历S , 若 G[i].count(*it) == 1 , 则说明两点没有连通 , 若为 0 则说明两点有连通。若连通则将其从S中erase、vis标记为1,并加入队列进行下一轮bfs

最后输出 cnt - 1即可

#include<bits/stdc++.h>
#define ios std::ios::sync_with_stdio(false)
#define sd(n) scanf("%d",&n)
#define sdd(n,m) scanf("%d%d",&n,&m)
#define sddd(n,m,k) scanf("%d%d%d",&n,&m,&k)
#define pd(n) printf("%d\n", (n))
#define pdd(n,m) printf("%d %d\n", n, m)
#define pld(n) printf("%lld\n", n)
#define pldd(n,m) printf("%lld %lld\n", n, m)
#define sld(n) scanf("%lld",&n)
#define sldd(n,m) scanf("%lld%lld",&n,&m)
#define slddd(n,m,k) scanf("%lld%lld%lld",&n,&m,&k)
#define sf(n) scanf("%lf",&n)
#define sff(n,m) scanf("%lf%lf",&n,&m)
#define sfff(n,m,k) scanf("%lf%lf%lf",&n,&m,&k)
#define rep(i,a,n) for (int i=a;i<=n;i++)
#define per(i,n,a) for (int i=n;i>=a;i--)
#define mm(a,n) memset(a, n, sizeof(a))
#define pb push_back
#define all(x) (x).begin(),(x).end()
#define fi first
#define se second
#define ll long long
#define MOD 1000000007
#define pi 3.14159265358979323
#define lrt rt<<1
#define rrt rt<<1|1
#define lson l, m, lrt
#define rson m+1, r, rrt
#define debug(x) cout << #x << ": " << x << endl
#define debug2(x, y) cout <<#x<<": "<<x<<" | "<<#y<<": "<<y<< endl;
#define debug3(x, y, z) cout <<#x<<": "<<x<<" | "<<#y<<": "<<y<<" | "<<#z<<": "<<z<<endl;
#define debug4(a, b, c, d) cout <<#a<<": "<<a<<" | "<<#b<<": "<<b<<" | "<<#c<<": "<<c<<" | "<<#d<<": "<<d<<endl;
using namespace std;
const ll INF (0x3f3f3f3f3f3f3f3fll);
const int inf (0x3f3f3f3f);
template<typename T>void read(T &res){bool flag=false;char ch;while(!isdigit(ch=getchar()))(ch=='-')&&(flag=true);
for(res=ch-;isdigit(ch=getchar());res=(res<<)+(res<<)+ch - );flag&&(res=-res);}
template<typename T>void Out(T x){if(x<)putchar('-'),x=-x;if(x>)Out(x/);putchar(x%+'');}
ll gcd(ll a,ll b){return b?gcd(b,a%b):a;}
ll lcm(ll a,ll b){return a*b/gcd(a,b);}
ll pow_mod(ll x,ll n,ll mod){ll res=;while(n){if(n&)res=res*x%mod;x=x*x%mod;n>>=;}return res;}
ll fact_pow(ll n,ll p){ll res=;while(n){n/=p;res+=n;}return res;}
ll mult(ll a,ll b,ll p){a%=p;b%=p;ll r=,v=a;while(b){if(b&){r+=v;if(r>p)r-=p;}v<<=;if(v>p)v-=p;b>>=;}return r;}
ll quick_pow(ll a,ll b,ll p){ll r=,v=a%p;while(b){if(b&)r=mult(r,v,p);v=mult(v,v,p);b>>=;}return r;}
bool CH(ll a,ll n,ll x,ll t)
{ll r=quick_pow(a,x,n);ll z=r;for(ll i=;i<=t;i++){r=mult(r,r,n);if(r==&&z!=&&z!=n-)return true;z=r;}return r!=;}
bool Miller_Rabin(ll n)
{if(n<)return false;if(n==)return true;if(!(n&))return false;ll x=n-,t=;while(!(x&)){x>>=;t++;}srand(time(NULL));
ll o=;for(ll i=;i<o;i++){ll a=rand()%(n-)+;if(CH(a,n,x,t))return false;}return true;}
int prime[],minprime[];
void euler(int n)
{int c=,i,j;for(i=;i<=n;i++){if(!minprime[i])prime[++c]=i,minprime[i]=i;for(j=;j<=c&&i*prime[j]<=n;j++)
{minprime[i*prime[j]]=prime[j];if(i%prime[j]==)break;}}} const int N = 2e5 + ;
set<int>G[N];
set<int>s;
set<int>::iterator it;
int n , m;
int vis[N];
void bfs(int x)
{
queue<int>q;
q.push(x);
s.erase(x);
vis[x] = ;
while(!q.empty())
{
int k = q.front();
q.pop();
for(it = s.begin() ; it != s.end() ;)
{
int ha = *it ++;
if(G[k].count(ha) == )
{
vis[ha] = ;
q.push(ha);
s.erase(ha);
}
}
}
}
int main()
{
ios;
cin >> n >> m;
rep(i , , n)
s.insert(i);
rep(i , , m)
{
int x , y;
cin >> x >> y;
G[x].insert(y);
G[y].insert(x);
}
int ans = ;
rep(i , , n)
{
if(!vis[i])
{
ans ++;
bfs(i);
}
}
cout << ans - << '\n';
return ;
}

Codeforces Round #599 (Div. 2)的更多相关文章

  1. Codeforces Round #599 (Div. 2) D. 0-1 MST(bfs+set)

    Codeforces Round #599 (Div. 2) D. 0-1 MST Description Ujan has a lot of useless stuff in his drawers ...

  2. Codeforces Round #599 (Div. 2)D 边很多的只有0和1的MST

    题:https://codeforces.com/contest/1243/problem/D 分析:找全部可以用边权为0的点连起来的全部块 然后这些块之间相连肯定得通过边权为1的边进行连接 所以答案 ...

  3. Codeforces Round #599 (Div. 2) E. Sum Balance

    这题写起来真的有点麻烦,按照官方题解的写法 先建图,然后求强连通分量,然后判断掉不符合条件的换 最后做dp转移即可 虽然看起来复杂度很高,但是n只有15,所以问题不大 #include <ios ...

  4. Codeforces Round #599 (Div. 1) C. Sum Balance 图论 dp

    C. Sum Balance Ujan has a lot of numbers in his boxes. He likes order and balance, so he decided to ...

  5. Codeforces Round #599 (Div. 1) B. 0-1 MST 图论

    D. 0-1 MST Ujan has a lot of useless stuff in his drawers, a considerable part of which are his math ...

  6. Codeforces Round #599 (Div. 1) A. Tile Painting 数论

    C. Tile Painting Ujan has been lazy lately, but now has decided to bring his yard to good shape. Fir ...

  7. Codeforces Round #599 (Div. 2) B2. Character Swap (Hard Version) 构造

    B2. Character Swap (Hard Version) This problem is different from the easy version. In this version U ...

  8. Codeforces Round #599 (Div. 2) B1. Character Swap (Easy Version) 水题

    B1. Character Swap (Easy Version) This problem is different from the hard version. In this version U ...

  9. Codeforces Round #599 (Div. 2) A. Maximum Square 水题

    A. Maximum Square Ujan decided to make a new wooden roof for the house. He has

随机推荐

  1. synchronized:内部锁

    synchronized:内部锁 起源: 并行程序开发涉及多线程.多任务间的协作和数据共享 一).内部锁:synchronized 1).定义在方法上 public synchronized void ...

  2. vant-ui的van-uploader上传图片

    移动端上传图片是很常用的功能,这里使用vant-ui实现. 效果如图 上传图片的vue页面:Customer.vue html <div :class="postData.length ...

  3. go语言学习笔记(二)

    整数 有符号整数 int8 int16 int32 int64 无符号整数 uin8 uin16 uin32 uin64 无符号整数 uintptr可以进行运算这点很重要请了解unsafe包,大小不明 ...

  4. Redis 数据结构

    一.Redis简介 Redis是一款基于key-value的高性能NoSQL数据库,开源免费,遵守BSD协议.支持string(字符串) . hash(哈希) .list(列表) . set(集合) ...

  5. vue防抖节流之v-debounce--throttle使用指南

    最新封装了一个vue防抖节流自定义指令,发布到npm上,有用欢迎star,谢谢! npm地址:https://www.npmjs.com/package/v-debounce-throttle git ...

  6. Lab4\5:进程和线程

    进程的定义 进程是指一个具有一定独立功能的程序在一个数据集合上的一次动态执行过程 源代码在经过编译链接之后生成了可执行文件,再由操作系统进行加载并且进行一些堆栈的分配才是进程 进程控制块 操作系统管理 ...

  7. 【数据结构】之链表(C语言描述)

    链表是线性表的一种,是一种物理存储单元上非连续的存储结构,链表中的数据元素之间是通过指针链接实现的. 链表由一系列节点组成,节点可以在运行时动态的生成. 链表中国的每个节点分为两部分:一部分是存储数据 ...

  8. 【SSL1194】最优乘车

    题面: 正文: 把每个边用链式前向星存起来,边权为\(1\),就可以愉♂快♂地最短路了

  9. appium自动化的一个实例

    实现appium的自动化,三步走,具体如下: 第一步:启动appium的服务端: 可以通过命令行的方式启动:cmd,然后输入appium,如下图 也可以打开桌面程序appium,点击右上角的运行按钮, ...

  10. RubyGem 下载时连接失败的解决方法

    RubyGem 下载 gem 包失败,有一定原因是 https 导致的. 搜索了很久,找到一个解决的方法. 1.下载 cacert.pem,也就是 curl 的证书. http://curl.haxx ...