牛客练习赛8 A B D E

A.约数个数的和

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

题解

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

AC代码

O(n)

#include 
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 
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 
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代码

这里写代码片

你可能感兴趣的:(网赛套题)