Submission #36294660


Source Code Expand

#include <bits/stdc++.h>
using namespace std;
#define rep(i,a,n) for (int i=a;i<(int)n;i++)
#define per(i,a,n) for (int i=n;i-->(int)a;)
int read(){int r;scanf("%d",&r);return r;}
const int N=2000;

void printans(const vector<vector<int>>&ans){
  if(ans.size()) {
    assert(ans.size()==ans[0].size());
    rep(i,1,ans.size())rep(j,1,ans.size()) printf("%d%c",ans[i][j]," \n"[j+1==(int)ans.size()]);
  }
}

vector<vector<int>> solve(int n,const vector<array<int,5>>&Q,bool debug=false){
  vector<pair<int,int> > idx;
  for(auto [a,b,c,d,e]:Q)if(e) for(auto i:{a-1,b})for(auto j:{c-1,d}) if(i>0&&j>0) idx.push_back({i,j});
  sort(begin(idx),end(idx));
  idx.resize(unique(begin(idx),end(idx))-begin(idx));
  auto lb=[&](int i,int j){return lower_bound(begin(idx),end(idx),make_pair(i,j))-begin(idx);};
  if(debug)for(auto [i,j]:idx){printf("idx: %d %d\n",i,j);}
  vector<bitset<4*N+1>> matrix = {};
  for(auto [a,b,c,d,e]:Q)if(e){
    bitset<4*N+1>row;
    for(auto i:{a-1,b})for(auto j:{c-1,d})if(i>0&&j>0) row[lb(i,j)]=1;
    row[4*N]=(e==2);
    if(debug)cout<<"row:"<<row<<endl;
    matrix.push_back(row);
  }
  // 高斯消元
  vector<bool>v12(idx.size());
  {
    int i=0; // row
    rep(j,0,4*N+1){ // col
      if(i>=(int)matrix.size())break;
      rep(ii,i,matrix.size()) if(matrix[ii][j]){
        swap(matrix[i],matrix[ii]);
        break;
      }
      if(!matrix[i][j])continue;
      // matrix[i][j] == 1 // 主元
      if(debug)printf("主元 %d %d\n",i,j);
      assert(matrix[i][j]);
      if(j==4*N){
        printf("No\n");
        return {};
      }
      rep(k,0,matrix.size())if(k!=i && matrix[k][j]) matrix[k]^=matrix[i];
      i++;
    }
  }
  // printf("v12.size = %d\n",(int)v12.size());
  auto ans=vector(n+1,vector(n+1,0));
  rep(i,0,matrix.size()){
    rep(j,0,4*N+1)if(matrix[i][j]){ // 主元
      if(debug)printf("v12 主元 %d %d\n",i,j);
      auto [pi,pj]=idx[j];
      ans[pi][pj]=matrix[i][4*N];
      break;
    }
  }
  per(i,1,n+1)rep(j,1,n+1) ans[i][j]^=ans[i-1][j];
  rep(i,1,n+1)per(j,1,n+1) ans[i][j]^=ans[i][j-1];

  if(debug)printans(ans);
  // 扫描线?
  auto inc = vector(n+2,vector<array<int,3>>());
  auto pre = vector(n+2,0);
  for(auto [a,b,c,d,e]:Q)if(e){
    inc[a].push_back({c,d,1});
    inc[b+1].push_back({c,d,-1});
  }
  rep(i,1,n+1){
    for(auto [c,d,diff]:inc[i]){
      pre[c]+=diff;
      pre[d+1]-=diff;
    }
    int v=0;
    rep(j,1,n+1){
      v+=pre[j];
      if(v) ans[i][j]++; // 未填写 被覆盖
      else ans[i][j]=0;
    }
  }
  if(debug)printans(ans);
  // check 0
  auto ans0=ans;
  rep(i,1,n+1)rep(j,1,n+1)ans0[i][j]=(ans[i][j]==0)+ans0[i-1][j]+ans0[i][j-1]-ans0[i-1][j-1];
  for(auto [a,b,c,d,e]:Q)if(!e)if(ans0[b][d]-ans0[a-1][d]-ans0[b][c-1]+ans0[a-1][c-1] == 0){ // 没有0
    printf("No\n");
    return {};
  }
  printf("Yes\n");
  // if(debug)printans(ans);
  return ans;
}


void test(){
  printf("==================================\n");
  int n=3;
  auto arr=vector(n+1,vector(n+1,0));
  rep(i,1,n+1)rep(j,1,n+1) arr[i][j]=rand()%3;
  int q=3;
  vector<array<int,5>>Q;
  while(q--){
    int i0=rand()%n+1;
    int i1=rand()%n+1;
    if(i0>i1)swap(i0,i1);
    int j0=rand()%n+1;
    int j1=rand()%n+1;
    if(j0>j1)swap(j0,j1);
    int v=1;
    rep(ii,i0,i1+1)rep(jj,j0,j1+1)v*=arr[ii][jj];
    Q.push_back({i0,i1,j0,j1,v%3});
  }
  auto ans=solve(n,Q);
  if(ans.size() == 0){
    printf("============== replay ====================\n");
    printf("invalid n=%d\n",n);
    for(auto [l0,r0,l1,r1,mul]:Q) printf("%d %d %d %d %d\n",l0,r0,l1,r1,mul);
    printf("============== replay ====================\n");
    ans = solve(n,Q,true);
    assert(false);
  }
  // check
  for(auto [a,b,c,d,e]:Q){
    int v=1;
    rep(i,a,b+1)rep(j,c,d+1) v*=ans[i][j];
    if(e!=v%3){
      printf("============== replay ====================\n");
      printf("invalid n=%d\n",n);
      for(auto [l0,r0,l1,r1,mul]:Q) printf("%d %d %d %d %d\n",l0,r0,l1,r1,mul);
      printf("============== replay ====================\n");
      ans = solve(n,Q,true);
      printans(ans);
      exit(1);
      return ;
    }
  }
}


int main(){
  // rep(i,0,1000)test();
  int n=read();
  int q=read();
  vector<array<int,5>>Q;
  rep(i,0,q) Q.push_back({read(),read(),read(),read(),read()}); // 1-index 减少边界判断
  auto ans = solve(n,Q);
  printans(ans);
  return 0;
}

Submission Info

Submission Time
Task Ex - Construct a Matrix
User cromarmot
Language C++ (GCC 9.2.1)
Score 600
Code Size 4337 Byte
Status AC
Exec Time 620 ms
Memory 40200 KiB

Compile Error

./Main.cpp: In function ‘int read()’:
./Main.cpp:5:23: warning: ignoring return value of ‘int scanf(const char*, ...)’, declared with attribute warn_unused_result [-Wunused-result]
    5 | int read(){int r;scanf("%d",&r);return r;}
      |                  ~~~~~^~~~~~~~~

Judge Result

Set Name Sample All
Score / Max Score 0 / 0 600 / 600
Status
AC × 2
AC × 59
Set Name Test Cases
Sample 00_sample_00.txt, 00_sample_01.txt
All 00_sample_00.txt, 00_sample_01.txt, 01_one_00.txt, 01_one_01.txt, 01_one_02.txt, 01_one_03.txt, 01_one_04.txt, 01_one_05.txt, 01_one_06.txt, 01_one_07.txt, 01_one_08.txt, 02_small_00.txt, 02_small_01.txt, 02_small_02.txt, 02_small_03.txt, 02_small_04.txt, 03_smallzero_00.txt, 03_smallzero_01.txt, 03_smallzero_02.txt, 03_smallzero_03.txt, 03_smallzero_04.txt, 04_rnd_00.txt, 04_rnd_01.txt, 04_rnd_02.txt, 04_rnd_03.txt, 04_rnd_04.txt, 05_rndzero_00.txt, 05_rndzero_01.txt, 05_rndzero_02.txt, 05_rndzero_03.txt, 05_rndzero_04.txt, 06_superrnd_00.txt, 06_superrnd_01.txt, 06_superrnd_02.txt, 06_superrnd_03.txt, 06_superrnd_04.txt, 07_lastchange_00.txt, 07_lastchange_01.txt, 07_lastchange_02.txt, 07_lastchange_03.txt, 07_lastchange_04.txt, 08_wide_00.txt, 08_wide_01.txt, 08_wide_02.txt, 08_wide_03.txt, 08_wide_04.txt, 09_hand_00.txt, 09_hand_01.txt, 09_hand_02.txt, 09_hand_03.txt, 09_hand_04.txt, 09_hand_05.txt, 09_hand_06.txt, 10_worst_00.txt, 10_worst_01.txt, 10_worst_02.txt, 10_worst_03.txt, 10_worst_04.txt, 10_worst_05.txt
Case Name Status Exec Time Memory
00_sample_00.txt AC 1 ms 3724 KiB
00_sample_01.txt AC 2 ms 3524 KiB
01_one_00.txt AC 2 ms 3672 KiB
01_one_01.txt AC 2 ms 3772 KiB
01_one_02.txt AC 2 ms 3648 KiB
01_one_03.txt AC 2 ms 3676 KiB
01_one_04.txt AC 2 ms 3648 KiB
01_one_05.txt AC 2 ms 3472 KiB
01_one_06.txt AC 2 ms 3664 KiB
01_one_07.txt AC 2 ms 3576 KiB
01_one_08.txt AC 2 ms 3664 KiB
02_small_00.txt AC 37 ms 5360 KiB
02_small_01.txt AC 36 ms 5344 KiB
02_small_02.txt AC 36 ms 5336 KiB
02_small_03.txt AC 37 ms 5256 KiB
02_small_04.txt AC 37 ms 5316 KiB
03_smallzero_00.txt AC 3 ms 3840 KiB
03_smallzero_01.txt AC 7 ms 3792 KiB
03_smallzero_02.txt AC 8 ms 3936 KiB
03_smallzero_03.txt AC 22 ms 3796 KiB
03_smallzero_04.txt AC 12 ms 3796 KiB
04_rnd_00.txt AC 313 ms 40192 KiB
04_rnd_01.txt AC 313 ms 40192 KiB
04_rnd_02.txt AC 312 ms 40104 KiB
04_rnd_03.txt AC 315 ms 40048 KiB
04_rnd_04.txt AC 314 ms 39972 KiB
05_rndzero_00.txt AC 309 ms 40200 KiB
05_rndzero_01.txt AC 303 ms 40076 KiB
05_rndzero_02.txt AC 302 ms 39920 KiB
05_rndzero_03.txt AC 295 ms 39920 KiB
05_rndzero_04.txt AC 303 ms 39860 KiB
06_superrnd_00.txt AC 53 ms 35944 KiB
06_superrnd_01.txt AC 50 ms 35996 KiB
06_superrnd_02.txt AC 48 ms 35996 KiB
06_superrnd_03.txt AC 46 ms 36016 KiB
06_superrnd_04.txt AC 48 ms 35860 KiB
07_lastchange_00.txt AC 55 ms 36752 KiB
07_lastchange_01.txt AC 314 ms 40108 KiB
07_lastchange_02.txt AC 311 ms 40108 KiB
07_lastchange_03.txt AC 56 ms 36808 KiB
07_lastchange_04.txt AC 56 ms 36488 KiB
08_wide_00.txt AC 350 ms 40160 KiB
08_wide_01.txt AC 354 ms 40136 KiB
08_wide_02.txt AC 348 ms 40180 KiB
08_wide_03.txt AC 344 ms 40044 KiB
08_wide_04.txt AC 351 ms 40048 KiB
09_hand_00.txt AC 307 ms 40084 KiB
09_hand_01.txt AC 307 ms 36768 KiB
09_hand_02.txt AC 13 ms 5320 KiB
09_hand_03.txt AC 347 ms 36748 KiB
09_hand_04.txt AC 337 ms 36604 KiB
09_hand_05.txt AC 318 ms 36688 KiB
09_hand_06.txt AC 318 ms 36852 KiB
10_worst_00.txt AC 304 ms 40068 KiB
10_worst_01.txt AC 620 ms 40168 KiB
10_worst_02.txt AC 311 ms 36724 KiB
10_worst_03.txt AC 309 ms 36668 KiB
10_worst_04.txt AC 311 ms 36808 KiB
10_worst_05.txt AC 310 ms 36828 KiB