您的位置:首页 > 其它

牛客练习赛8 A B D E

2017-12-17 04:31 323 查看

A.约数个数的和

题目链接 https://www.nowcoder.com/acm/contest/39/A

题解

纸上找下规律 发现是 n/i的关系 复杂度可以搞到O(sqrtn)

AC代码

O(n)

#include <bits/stdc++.h>
using namespace std;
#define LL long long

int main()
{
LL n, sum = 0;
scanf("%lld",&n);
for (LL i = 1; i <= n/2; i++) {
sum += (n/i);
}
printf("%lld\n",(LL)(sum+(n+1)/2));

return 0;
}


B.储物点的距离

题目链接 https://www.nowcoder.com/acm/contest/39/B

题解

维护前缀和随便搞搞 上去写了个线段树 调了下 群里有人说过不去 就换了写法 ( 其实线段树也可写

AC代码

这里写代码片


D.加边的无向图

题目链接 https://www.nowcoder.com/acm/contest/39/D

题解

并查集或者DFS找下联通快个数

AC代码

并查集写法

#include <bits/stdc++.h>
using namespace std;

const int MAXN = 1e5+10;
int par[MAXN];
int n, m;
void init()
{
for(int i = 0; i <= MAXN; i++) par[i] = i;
}
int find(int x)
{
if(x==par[x]) return x;
return par[x] = find(par[x]);
}
void unite(int x,int y)
{
x = find(x);
y = find(y);
if(x != y) par[x] = y;
}

int main()
{
init();
cin >> n >> m;
for(int i = 0; i < m; i++) {
int x, y;
cin >> x >> y;
unite(x,y);
}
int cnt = 0;
for(int i = 1; i <= n; i++) {
if(par[i] == i) cnt ++;
}
cout << cnt-1 << endl;
return 0;
}


DFS写法

#include <bits/stdc++.h>
using namespace std;
#define LL long long
#define CLR(a,b) memset(a,(b),sizeof(a))
const int MAXN = 1e5+10;
int par[MAXN];
vector<int> v[MAXN];
bool vis[MAXN];
int n, m;
void init()
{
for(int i = 0; i <= n; i++) v[i].clear();
CLR(vis,false);
}
void dfs(int x,int y)
{
vis[x] = true;
for(int i = 0; i < v[x].size(); i++) {
int u = v[x][i];
if(vis[u] || u==y) continue;
dfs(u,x);
}
}
int main()
{

cin >> n >> m;
init();
for(int i = 0; i < m; i++) {
int x, y;
cin >> x >> y;
v[x].push_back(y); v[y].push_back(x);
}
int cnt = 0;
for(int i = 1; i <= n; i++) {
if(!vis[i]) {
cnt++; dfs(i,-1);
}
}
cout << cnt-1 << endl;
return 0;
}


E.集合中的质数

题目链接 https://www.nowcoder.com/acm/contest/39/E

题解

直接容斥搞搞

AC代码

这里写代码片
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: