emm.题目说得很明白
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码值.活久见.1
2
3
4
5
6
7
8
9
10
11
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)$1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
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.
1 |
|