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
2022-11-07 05:44:57+0900
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
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