0%

ABC-390-D - Stone XOR

思路讲解

想这样枚举是会超时的,我们发现其实元素加入顺序其实不重要,重要的是这个元素加入到了哪个组中

1
2
3
4
5
6
7
8
9
10
for (int i=1; i<=N; ++i) {
if(vis[i]) continue;
for(int j=1;j<=groups+1;++j){
sumG[j]+=A[i];
vis[i]=true;
dfs(cur+1,max(groups,j));
sumG[j]-=A[i];
vis[i]=false;
}
}

所以说只需要减少枚举维度就行了(不再枚举元素)

1
2
3
4
5
6
7
    for(int j=1;j<=groups+1;++j){
sumG[j]+=A[dep];
// vis[dep]=true;
dfs(dep+1,max(groups,j));
sumG[j]-=A[dep];
// vis[dep]=false;
}

AC代码

AC

https://atcoder.jp/contests/abc390/submissions/62115363

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
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <deque>
#include <queue>
#include <vector>
#include <set>
#include <map>
#include <unordered_map>
#include <unordered_set>
#include <cmath>
#include <bitset>
#include <iterator>
#include <random>
#include <iomanip>
#include <cctype>
#include <array>
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
typedef pair<ll,ll> pll;
typedef pair<int,int> pii;
typedef array<ll,3> arr;
const ll MAXN=17;
ull N,T;
ull A[MAXN];
string s;
unordered_set<ull> st;
//bool vis[MAXN];
ull sumG[MAXN];
// dep就是指当前要计算的用掉的总数量,groups是指现在的组数
void dfs(int dep,int groups) {
if(dep>N){
ull res=0;
for (int i=1; i<=groups; ++i) {
res^=sumG[i];
}
st.insert(res);
return;
}
for(int j=1;j<=groups+1;++j){
sumG[j]+=A[dep];
// vis[dep]=true;
dfs(dep+1,max(groups,j));
sumG[j]-=A[dep];
// vis[dep]=false;
}
}
int main()
{
ios::sync_with_stdio(false);
cin.tie(0);cout.tie(0);
cin>>N;
for(int i=1;i<=N;++i) {
cin>>A[i];
}
dfs(1,0);
cout<<st.size()<<endl;

// cout<<endl;
// for(auto it:st) {
// cout<<it<<endl;
// }
return 0;
}
/*
AC https://atcoder.jp/contests/abc390/submissions/62115363

*/

心路历程(WA,TLE,MLE……)

TLE

https://atcoder.jp/contests/abc390/submissions/62115165

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
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <deque>
#include <queue>
#include <vector>
#include <set>
#include <map>
#include <unordered_map>
#include <unordered_set>
#include <cmath>
#include <bitset>
#include <iterator>
#include <random>
#include <iomanip>
#include <cctype>
#include <array>
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
typedef pair<ll,ll> pll;
typedef pair<int,int> pii;
typedef array<ll,3> arr;
const ll MAXN=17;
ull N,T;
ull A[MAXN];
string s;
unordered_set<ull> st;
bool vis[MAXN];
ull sumG[MAXN];
// cur就是指当前要计算的用掉的总数量,groups是指现在的组数
void dfs(int cur,int groups) {
if(cur>N){
ull res=0;
for (int i=1; i<=groups; ++i) {
res^=sumG[i];
}
st.insert(res);
return;
}
for (int i=1; i<=N; ++i) {
if(vis[i]) continue;
for(int j=1;j<=groups+1;++j){
sumG[j]+=A[i];
vis[i]=true;
dfs(cur+1,max(groups,j));
sumG[j]-=A[i];
vis[i]=false;
}
}
}
int main()
{
ios::sync_with_stdio(false);
cin.tie(0);cout.tie(0);
cin>>N;
for(int i=1;i<=N;++i) {
cin>>A[i];
}
dfs(1,0);
cout<<st.size()<<endl;

// cout<<endl;
// for(auto it:st) {
// cout<<it<<endl;
// }
return 0;
}
/*

*/