Wannafly挑战赛27
- 2020 年 2 月 18 日
- 筆記
A 灰魔法师
AC
题目大意:
给出长度为n的序列a, 求有多少对数对 (i, j) (1 <= i < j <= n) 满足 ai + aj 为完全平方数。
题解
先找出1到21e5之间所有的完全平方数.有400多个.然后二分计算答案.注意long long.注意$a_i$可能重复.注意计算答案的时候需要分开计算的地方. 一个神奇的事情.以为int转成long long.只要一个int数1LL就行了.后面发现是1LL*int.还有一个就是昨天发现的一个神奇的地方.默认返回了ASCII码值.活久见.
#include <bits/stdc++.h> using namespace std; int fun(char c){} int main(){ // freopen("in.txt", "r", stdin); cout << fun('a') << endl; cout << fun('b') << endl; return 0; }
输出: 97 98
回到正题.正经代码.复杂度$O((400+)*nlogn)$
#include <bits/stdc++.h> using namespace std; typedef long long LL; const int MAX_N = 1e5; int n; vector<int> a; vector<int> num; LL len[MAX_N]; void init(){ for(int i = 1;i <= 2*MAX_N; ++i){ int x = sqrt(i); if(x*x == i) num.push_back(i); } } int main(){ // freopen("in.txt", "r", stdin); init(); int x; while(cin >> n){ memset(len, 0, sizeof len); a.clear(); for(int i = 0; i < n; ++i){ cin >> x; ++len[x]; if(len[x] == 1) a.push_back(x); } sort(a.begin(), a.end()); int sz = a.size(); LL res = 0; LL ans = 0; for(int i = 0; i < num.size(); ++i){ int v = num[i]; for(int j = 0; j < sz; ++j){ if(a[j] > v) continue; vector<int>::iterator idx = lower_bound(a.begin(), a.end(), v - a[j]); if(idx != a.end()) { if(*idx == v - a[j]) { int x = a[j], y = v-a[j]; if(x == y) ans += len[x] * (len[x]-1) / 2LL; else res += len[x] * len[y]; } } } } cout << res/2LL + ans << endl; } return 0; }
B 紫魔法师
AC
题目大意
给一个图(每条边最多被包含于一个环,无自环,无重边,保证连通),要求用最少的颜色对其顶点染色,满足每条边两个端点的颜色不同,输出最小颜色数即可
题解
如果$n==1$.一种颜色.如果是二分图.$2$种颜色.否则.就是有奇数环.就需要$3$种颜色.所以.二分染色即可.emmm.第一次二分染色写错.orz.
#include <bits/stdc++.h> using namespace std; const int MAX_N = 1e5+100; int color[MAX_N]; vector<int> G[MAX_N]; int n,m; bool dfs(int u, int c){ color[u] = c; int sz = G[u].size(); for(int i = 0; i < sz; ++i){ int v = G[u][i]; if(!color[v]) { if(!dfs(v, 3-c)) return false; } if(color[v] == color[u]) return false; } return true; } int main(){ //freopen("in.txt", "r", stdin); int u,v; while(cin >> n >> m){ for(int i = 1; i <= n; ++i) G[i].clear(); memset(color, 0 ,sizeof color); for(int i = 1; i <= m; ++i){ cin >> u >> v; G[u].push_back(v); G[v].push_back(u); } if(n == 1) {puts("1"); continue;} if(dfs(1, 1)) puts("2"); else puts("3"); } return 0; }