这题很容易想到的一点是对于格子中只有一个是,并且我们填一个字母有可能使得它变成 check patterns的话,我们要先把这种格子填什么确定下来,而且这是唯一的。

接下来就是处理它周围格子了,我们就必须按着遍历顺序相反的方向开始弄上面这类格子,相同方向的接下来会遍历到。

那么如果不存在上述格子,且仍还有的格子,那我们就先随便填一种,然后check重复上面的过程

最后的工作就是检查是否存在check patterns

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
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
#include <bits/stdc++.h>
/*
#include<ext/pb_ds/assoc_container.hpp>
#include<ext/pb_ds/hash_policy.hpp>
*/
using namespace std;

const double eps = 1e-10;
const double pi = 3.1415926535897932384626433832795;
const double eln = 2.718281828459045235360287471352;

#define f(i, a, b) for (int i = a; i <= b; i++)
#define scan(x) scanf("%d", &x)
#define mp make_pair
#define pb push_back
#define lowbit(x) (x&(-x))

#define fi first
#define se second
#define SZ(x) int((x).size())
#define all(x) x.begin(), x.end()
#define rall(x) x.rbegin(), x.rend()
#define summ(a) (accumulate(all(a), 0ll))

typedef unsigned long long ull;
typedef pair<int,int> pii;
typedef vector<int> vi;

using ll=long long;

ll tt,n,m,a[(int)109][(int)109] ;
char c;

void dfs(int x,int y){
if(x<=0 || y<=0 || x>=n || y>=m)return;
ll p=-1,q=-1,cnt=0;
for(int i=0;i<=1;++i)for(int j=0;j<=1;++j)cnt+=a[x+i][y+j]==1;
if(cnt!=1)return;
for(int i=0;i<=1;++i)for(int j=0;j<=1;++j)if(a[x+i][y+j]==1){p=i,q=j;}
if(a[x+!p][y+q]==a[x+p][y+!q]&&(a[x+!p][y+q]^a[x+!p][y+!q])==1){
a[x+p][y+q]=a[x+!p][y+q];
for(int i=0;i<=1;++i)for(int j=0;j<=1;++j)dfs(x+p-i,y+q-j);//back
}
}

bool solve(){
for(int i=1;i<n;++i){
for(int j=1;j<m;++j){
dfs(i,j);
}
}
for(int i=1;i<=n;++i)for(int j=1;j<=m;++j){
if(a[i][j]==1){
a[i][j]=3;
for(int k=0;k<=1;++k)for(int l=0;l<=1;++l)dfs(i-k,j-l);
}
}
for(int i=1;i<n;++i)for(int j=1;j<m;++j){
if(a[i][j]==a[i+1][j+1]&&a[i+1][j]==a[i][j+1]&&a[i][j]!=a[i+1][j])return false;
}
return true;
}

int main()
{
for(scanf("%lld",&tt);tt;tt-=1){
scanf("%lld%lld",&n,&m);
for(int i=1;i<=n;++i){
for(int j=1;j<=m;++j){
scanf(" %c",&c);
if(c=='?')a[i][j]=1;
else if(c=='B')a[i][j]=2;
else a[i][j]=3;
}
a[i][m+1]=0;
}
for(int i=1;i<=m+1;++i)a[n+1][m]=0;
if(solve()){
printf("%s","YES\n");
for(int i=1;i<=n;++i){
for(int j=1;j<=m;++j)printf("%c",a[i][j]==2?'B':'W');
printf("\n");
}
}else printf("%s","NO\n");
}
return 0;
}

考虑到树状数组是一颗树,然后染色的做法

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
#include <bits/stdc++.h>
/*
#include<ext/pb_ds/assoc_container.hpp>
#include<ext/pb_ds/hash_policy.hpp>
*/
using namespace std;

const double eps = 1e-10;
const double pi = 3.1415926535897932384626433832795;
const double eln = 2.718281828459045235360287471352;

#define f(i, a, b) for (int i = a; i <= b; i++)
#define scan(x) scanf("%d", &x)
#define mp make_pair
#define pb push_back
#define lowbit(x) (x&(-x))

#define fi first
#define se second
#define SZ(x) int((x).size())
#define all(x) x.begin(), x.end()
#define rall(x) x.rbegin(), x.rend()
#define summ(a) (accumulate(all(a), 0ll))

typedef unsigned long long ull;
typedef pair<int,int> pii;
typedef vector<int> vi;

using ll=long long;

int tt,n,a[(int)1e5+9],ans,cn[(int)1e5+9];
char c;
vi g[(int)1e5+9];

void dfs(int x){
a[x]=0;
bool ok=1;
for(auto it:g[x]){
if(a[it]){
dfs(it);
ok=0;
}
}
ans+=ok;
}

int main()
{
for(int i=1;i<=1e5;++i){
int tmp=i+lowbit(i);
if(tmp<=1e5)g[tmp].push_back(i);
}
scanf("%d",&tt);
f(sb,1,tt){
ans=0;
scanf("%d",&n);
for(int i=1;i<=n;++i)scanf(" %c",&c),a[i]=c=='1',cn[i]=0;
for(int i=n;i;--i){
if(a[i]){
dfs(i);
int tmp=i+lowbit(i);
if(tmp<=n)cn[tmp]+=1;
}
}
for(int i=1;i<=n;++i)ans+=cn[i]==1;
printf("%d\n",ans);
}
return 0;
}

分情况讨论:如果的话,就直接跑Dijkstra。否则就先用优先堆模拟出可以到达哪些点,然后对这些点跑Dijkstra,不过dp方程要改变

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
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
#include <bits/stdc++.h>
/*
#include<ext/pb_ds/assoc_container.hpp>
#include<ext/pb_ds/hash_policy.hpp>
*/
using namespace std;

const double eps = 1e-10;
const double pi = 3.1415926535897932384626433832795;
const double eln = 2.718281828459045235360287471352;

#define f(i, a, b) for (int i = a; i <= b; i++)
#define scan(x) scanf("%d", &x)
#define mp make_pair
#define pb push_back
#define lowbit(x) (x & (-x))

#define fi first
#define se second
#define SZ(x) int((x).size())
#define all(x) x.begin(), x.end()
#define rall(x) x.rbegin(), x.rend()
#define summ(a) (accumulate(all(a), 0ll))

typedef unsigned long long ull;
typedef pair<int, int> pii;
typedef vector<int> vi;

using ll = long long;

ll tt, n, m, A, B, l[(int)2e5 + 9], dis[(int)2e5 + 9];
vi g[(int)2e5 + 9];
bitset<(int)2e5 + 9> vis;
int main()
{
ios::sync_with_stdio(false);
cin.tie(0);
cin >> tt;
f(sb, 1, tt)
{
cin >> n >> m >> A >> B;
for (int i = 1; i <= n; ++i)
g[i].clear(), dis[i] = 0x3f3f3f3f;
for (int i = 1, x, y; i <= m; ++i)
{
cin >> x >> y;
g[x].push_back(y), g[y].push_back(x);
}
for (int i = 1; i <= n; ++i)
cin >> l[i], l[i] += i == 1 ? 0ll : B;
if (A <= B)
{
queue<int> qu;
qu.push(1);
dis[1] = 0;
while (!qu.empty())
{
auto p = qu.front();
qu.pop();
// cerr<<p<<"::"<<dis[p]<<"\n";
for (auto it : g[p])
{
// cerr<<it<<":::"<<((dis[p]+1)*(A-B)+l[1])<<"\n";
if (dis[it] > dis[p] + 1 && dis[p] * (A - B) + l[1] > l[it])
{
dis[it] = dis[p] + 1;
qu.push(it);
}
}
}
dis[n] = dis[n] == 0x3f3f3f3f ? -1ll : dis[n];
cout << dis[n] << "\n";
}
else
{
priority_queue<pair<int, int>, vector<pair<int, int>>, greater<pair<int, int>>> q;
vis.reset();
ll day = -1;
q.push({0,1});
while (!q.empty())
{
auto [aa, bb] = q.top();
q.pop();
if (vis[bb])
continue;
if(day!=-1&&aa>=l[1]+day*(A-B))break;
vis[bb]=1,day+=1;
for (auto it : g[bb])
{
if (!vis[it])
q.push({l[it], it});
}
}
q.push({0, 1});
dis[1] = 0;
while (!q.empty())
{
auto [aa, bb] = q.top();
q.pop();
if (aa>dis[bb])
continue;
for (auto it : g[bb])
{
if(vis[it]&&dis[it]>aa+1&&l[it]<l[1]){
dis[it]=aa+1;
q.push({dis[it],it});
}else if(vis[it]&&dis[it]>max(aa+1ll,(l[it]-l[1])/(A-B)+2)){
dis[it]=max(aa+1ll,(l[it]-l[1])/(A-B)+2);
q.push({dis[it],it});
}
}
}
dis[n]=dis[n]==0x3f3f3f3f?-1ll:dis[n];
cout << dis[n] << "\n";
}
}
}

amazing

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
#include <bits/stdc++.h>
/*
#include<ext/pb_ds/assoc_container.hpp>
#include<ext/pb_ds/hash_policy.hpp>
*/
using namespace std;

const double eps = 1e-10;
const double pi = 3.1415926535897932384626433832795;
const double eln = 2.718281828459045235360287471352;

#define f(i, a, b) for (int i = a; i <= b; i++)
#define scan(x) scanf("%d", &x)
#define mp make_pair
#define pb push_back
#define lowbit(x) (x&(-x))

#define fi first
#define se second
#define SZ(x) int((x).size())
#define all(x) x.begin(), x.end()
#define rall(x) x.rbegin(), x.rend()
#define summ(a) (accumulate(all(a), 0ll))

typedef unsigned long long ull;
typedef pair<int,int> pii;
typedef vector<int> vi;

using ll=long long;

ll tt,n,a[(int)1e5+9],b[(int)1e5+9];
int main()
{
ios::sync_with_stdio(false);
cin.tie(0);
cin>>tt;
f(sb,1,tt){
cin>>n;
f(i,1,n)cin>>a[i];
f(i,1,n)cin>>b[i];
auto check=[&](ll val){
vector<ll> x,y;
f(i,1,n)x.push_back(a[i]&val),y.push_back(~b[i]&val);
sort(all(x)),sort(all(y));
return x==y;
};
ll ans=0;
for(int i=29;~i;--i){
if(check(ans|(1ll<<i))){
ans|=(1ll<<i);
}
}
cout<<ans<<"\n";
}
return 0;
}

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
73
74
75
76
77
#include <bits/stdc++.h>
/*
#include<ext/pb_ds/assoc_container.hpp>
#include<ext/pb_ds/hash_policy.hpp>
*/
using namespace std;

const double eps = 1e-10;
const double pi = 3.1415926535897932384626433832795;
const double eln = 2.718281828459045235360287471352;

#define f(i, a, b) for (int i = a; i <= b; i++)
#define scan(x) scanf("%d", &x)
#define mp make_pair
#define pb push_back
#define lowbit(x) (x&(-x))

#define fi first
#define se second
#define SZ(x) int((x).size())
#define all(x) x.begin(), x.end()
#define rall(x) x.rbegin(), x.rend()
#define summ(a) (accumulate(all(a), 0ll))

typedef unsigned long long ull;
typedef pair<int,int> pii;
typedef vector<int> vi;

using ll=long long;

int n,q;
bitset<40> a[(int)1e5+9],b[(int)1e5+9];
vector<pii> v[(int)1e5+9];

void zero(int x,int y,int val){
for(int i=0;i<30;++i){
if(!((1ll<<i)&val)){
a[x][i]=a[y][i]=1;
}
}
}

int main()
{
ios::sync_with_stdio(false);
cin.tie(0);
cin>>n>>q;
for(int i=1,x,y,z;i<=q;++i){
cin>>x>>y>>z;
if(x==y){
b[x]=z;
zero(x,x,z);
continue;
}
v[x].push_back({y,z});
v[y].push_back({x,z});
zero(x,y,z);
}
for(int i=1;i<=n;++i){
for(auto [aa,bb]:v[i]){
bitset<40> tt(bb);
b[i]|=(a[aa]&tt);
}
}
for(int i=1;i<=n;++i){
for(auto [aa,bb]:v[i]){
if(i>aa){
bitset<40> tt(bb);
b[i]|=(tt^b[aa]);
}
}
}
for(int i=1;i<=n;++i){
cout<<b[i].to_ullong()<<" \n"[i==n];
}
return 0;
}
0%