結果
問題 | 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"; } }