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代码
这里写代码片