Round#632(Div.2)
A. Little Artem
題意:給你一塊n*m的木板,每個單元可被塗成黑白兩種顏色。令B爲黑色電池的數量,該黑色電池中至少有一個相鄰的白色鄰居。 令W爲至少有一個相鄰的黑色鄰域的白單元的數量。 如果B = W + 1,則着色爲好。請找到任何好的顏色(確保在給定約束下解決方案始終存在)。如果有多個解決方案,請輸出其中任何一個。
思路:若木板爲2 * 2的,直接輸出一個W三個B就可以。
其他情況在大於2的一個方向上連續輸出兩個W,其他n * m - 2個單元全輸出B便可。
代碼實現:
#include <cstdio>
#include <cstring>
#include <cmath>
#include <cstdlib>
#include <ctime>
#include <cctype>
#include <cstring>
#include <cmath>
#include <iostream>
#include <sstream>
#include <string>
#include <list>
#include <vector>
#include <set>
#include <map>
#include <queue>
#include <stack>
#include <algorithm>
#include <functional>
#define lowbit(x) (x &(-x))
#define me(ar) memset(ar, 0, sizeof ar)
#define mem(ar,num) memset(ar, num, sizeof ar)
#define rep(i, a, n) for(int i = a; i <= n; i ++)
#define pre(i, n, a) for(int i = n; i >= a; i --)
#define rp(i, n) for(int i = 0, i < n; i ++)
#define int long long
using namespace std;
typedef long long ll;
const int INF = 0x3f3f3f3f;
const ll mod = 1e9 + 7;
const int N = 2e5 + 5;
int t, n, m;
signed main()
{
cin >> t;
while(t --){
cin >> n >> m;
if(n == 2 && m == 2)
cout << "WB" << endl << "BB" << endl;
else{
if(n == 2){
cout << "WW";
for(int i = 3; i <= m; i ++) cout << "B";
cout << endl;
for(int i = 1; i <= m; i ++) cout << "B";
cout << endl;
}
else if(m == 2){
cout << "WB" << endl;
cout << "WB" << endl;
for(int i = 3; i <= n; i ++) cout << "BB" << endl;
}
else{
cout << "WW";
for(int i = 3; i <= m; i ++) cout << "B";
cout << endl;
for(int i = 2; i <= n; i ++){
for(int j = 1; j <= m; j ++)
cout << "B";
cout << endl;
}
}
}
}
return 0;
}
B. Kind Anton
題意:給你一個只由0,-1,1組成的長度爲n的數組a[],對於任意1 <= i < j <= n,你可以多次或者零次將ai加在aj上,試問是否可以通過這種操作是a數組等於給定的另一個數組b。
思路:
- 當j=1時,即a[1] != b[1],就直接輸出NO;
- 當j>2時: 若b[j] > a[j],如果存在1<= i < j的a[i] = 1,就是YES;否則就是NO.若b[j]<a[j],如果存在1<= i < j的a[i]= -1,就是YES,否則就是NO.
代碼實現:
#include <cstdio>
#include <cstring>
#include <cmath>
#include <cstdlib>
#include <ctime>
#include <cctype>
#include <cstring>
#include <cmath>
#include <iostream>
#include <sstream>
#include <string>
#include <list>
#include <vector>
#include <set>
#include <map>
#include <queue>
#include <stack>
#include <algorithm>
#include <functional>
#define lowbit(x) (x &(-x))
#define me(ar) memset(ar, 0, sizeof ar)
#define mem(ar,num) memset(ar, num, sizeof ar)
#define rep(i, a, n) for(int i = a; i <= n; i ++)
#define pre(i, n, a) for(int i = n; i >= a; i --)
#define rp(i, n) for(int i = 0, i < n; i ++)
#define int long long
using namespace std;
typedef long long ll;
const int INF = 0x3f3f3f3f;
const ll mod = 1e9 + 7;
const int N = 2e5 + 5;
int t, n;
int a[N], b[N];
signed main()
{
cin >> t;
while(t --){
cin >> n;
for(int i = 1; i <= n; i ++)
cin >> a[i];
for(int i = 1; i <= n; i ++)
cin >> b[i];
if(a[1] != b[1]){
cout << "NO" << endl;
continue;
}
int fu = 0, zheng = 0, vis = 0;
if(a[1] == 1) zheng = 1;
if(a[1] == -1) fu = 1;
for(int i = 2; i <= n; i ++){
if(b[i] > a[i] && !zheng){
vis = 1;
break;
}
if(b[i] < a[i] && !fu){
vis = 1;
break;
}
if(a[i] == 1) zheng ++;
if(a[i] == -1) fu ++;
}
if(vis) cout << "NO" << endl;
else cout << "YES" << endl;
}
return 0;
}
C. Eugene and an array
題意:對於給定的數組a,試求出它含有幾個sum非零的子數組(包括本身)。
思路:當找到一個sum爲0的子數組時,那麼包含它的數組就都不符合條件。所以在處理a數組的某個a[i]時,只看以a[i]爲有邊界的子數組,即r = i;找到它左邊最近的一個sum爲0的子數組的左邊界l;那麼以a[i]爲又邊界的符合條件的子數組有r -l 個,所以只要記錄1到i的sum爲0的子數組的最大左邊界lmax,ans每次加上i - maxl即可。注意剛開始一個元素都沒有的時候得記錄下前綴sum爲0,不然以第一個數開始得sum爲0的數組將無法判斷。(注意maxl的去最大值)
代碼實現:
#include <cstdio>
#include <cstring>
#include <cmath>
#include <cstdlib>
#include <ctime>
#include <cctype>
#include <cstring>
#include <cmath>
#include <iostream>
#include <sstream>
#include <string>
#include <list>
#include <vector>
#include <set>
#include <map>
#include <queue>
#include <stack>
#include <algorithm>
#include <functional>
#define lowbit(x) (x &(-x))
#define me(ar) memset(ar, 0, sizeof ar)
#define mem(ar,num) memset(ar, num, sizeof ar)
#define rep(i, a, n) for(int i = a; i <= n; i ++)
#define pre(i, n, a) for(int i = n; i >= a; i --)
#define rp(i, n) for(int i = 0, i < n; i ++)
#define int long long
using namespace std;
typedef long long ll;
const int INF = 0x3f3f3f3f;
const ll mod = 1e9 + 7;
const int N = 2e5 + 5;
int n, x, sum, ans, maxl;
map<int, int> mp;
signed main()
{
cin >> n;
mp[0] = 1;
maxl = 1;
for(int i = 2; i <= n + 1; i ++){
cin >> x;
sum += x;
if(mp[sum])
maxl = max(maxl, (ll)(mp[sum] + 1));
ans += i - maxl;
mp[sum] = i;
}
cout << ans << endl;
return 0;
}
D. Challenges in school №41
題意:
明天再來補吧。