結果
| 問題 | No.2505 matriX cOnstRuction |
| コンテスト | |
| ユーザー |
|
| 提出日時 | 2023-10-13 23:29:23 |
| 言語 | C++14 (gcc 13.3.0 + boost 1.87.0) |
| 結果 |
AC
|
| 実行時間 | 257 ms / 2,500 ms |
| コード長 | 2,146 bytes |
| コンパイル時間 | 932 ms |
| コンパイル使用メモリ | 80,288 KB |
| 実行使用メモリ | 71,904 KB |
| 最終ジャッジ日時 | 2024-09-15 19:21:41 |
| 合計ジャッジ時間 | 6,567 ms |
|
ジャッジサーバーID (参考情報) |
judge5 / judge3 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| other | AC * 64 |
ソースコード
#include<iostream>
#include<vector>
#include<algorithm>
#include<cassert>
using namespace std;
#include<array>
#include<vector>
#include<cassert>
template<unsigned int sz>
struct binarytrie{
using Bit=typename conditional<sz<=32,unsigned int,unsigned long long>::type;
struct node{
long val;
array<int,2>nxt;
node():val(0L),nxt({-1,-1}){}
};
vector<node>v;
binarytrie(){v.emplace_back();}
int nxt(int u,int i)
{
if(v[u].nxt[i]==-1)
{
v[u].nxt[i]=v.size();
v.emplace_back();
}
return v[u].nxt[i];
}
void range_add(Bit a,Bit r,long w)
{
assert(0<=a&&(a>>sz)==0);
if(r==((Bit)1<<sz))
{
v[0].val+=w;
return;
}
assert(0<=r&&(r>>sz)==0);
int p=0;
for(int i=sz;i--;)
{
int t=a>>i&1;
if(r>>i&1)
{
v[nxt(p,t)].val+=w;
p=nxt(p,1-t);
}
else p=nxt(p,t);
}
v[p].val+=w;
}
long get_min(int u)
{
long ret=1e18;
for(int t:v[u].nxt)ret=min(ret,t==-1?0L:get_min(t));
ret+=v[u].val;
return ret;
}
long get_min(){return get_min(0);}
};
int N,M;
int R[50505],C[50505];
int main()
{
ios::sync_with_stdio(false);
cin.tie(nullptr);
int T;cin>>T;
for(;T--;)
{
cin>>N>>M;
for(int i=0;i<N;i++)cin>>R[i];
for(int i=0;i<M;i++)cin>>C[i];
vector<vector<int> >A(N,vector<int>(M));
for(int i=0;i<N;i++)for(int j=0;j<M;j++)cin>>A[i][j];
{//check
bool ok=true;
for(int i=0;i<N;i++)
{
int v=i==0?0:A[i][0]^A[0][0];
for(int j=0;j<M;j++)
{
if(A[i][j]!=(v^A[0][j]))ok=false;
}
}
if(!ok)
{
cout<<"-1\n";
continue;
}
}
binarytrie<30>BT;
long inf=1e9;
for(int j=0;j<M;j++)
{
//x^A[0][j], C[j]
int v=0;
while(C[j]>>v)v++;
BT.range_add(A[0][j],1<<30,inf);
BT.range_add(A[0][j],(1<<v)-1,2-inf);
BT.range_add(A[0][j],C[j],-1);
BT.range_add(A[0][j],0,-1);
}
for(int i=0;i<N;i++)
{
//x^A[0][0]^A[i][0], R[i]
int v=0;
while(R[i]>>v)v++;
BT.range_add(A[0][0]^A[i][0],1<<30,inf);
BT.range_add(A[0][0]^A[i][0],(1<<v)-1,2-inf);
BT.range_add(A[0][0]^A[i][0],R[i],-1);
BT.range_add(A[0][0]^A[i][0],0,-1);
}
long t=BT.get_min();
if(t<inf)cout<<t<<"\n";
else cout<<"-1\n";
}
}