Codeforces 1333(A,B,C)Round#632(Div.2)

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
題意
明天再來補吧。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章