QOJ.ac
QOJ
ID | 题目 | 提交者 | 结果 | 用时 | 内存 | 语言 | 文件大小 | 提交时间 | 测评时间 |
---|---|---|---|---|---|---|---|---|---|
#288199 | #5446. 琪露诺的符卡交换 | catagory# | 0 | 5ms | 6084kb | C++23 | 2.8kb | 2023-12-22 10:11:03 | 2024-07-04 03:14:37 |
answer
#include<bits/stdc++.h>
#define LL long long
#define SZ(x) ((LL)(x.size()))
using namespace std;
long long read(){
long long q=0,w=1;
char ch=getchar();
while(ch>'9' || ch<'0'){if(ch=='-')w=-1;ch=getchar();}
while(ch>='0'&&ch<='9'){q=q*10+(ch-'0');ch=getchar();}
return q*w;
}
void write(LL x){
if(x<0){putchar('-');x=(-x);}
if(x>9)write(x/10);
putchar('0'+x%10);
}
void writeln(LL x){write(x);puts("");}
void writecs(LL x){write(x);putchar(' ');}
namespace TP{
const long long N = 200+95;
LL lim;vector<LL>E[N];LL matchL[N],matchR[N];
void clear(){
for(LL i=1;i<=lim;i++){E[i].clear();matchL[i]=matchR[i]=0;}
return ;
}
void add_e(LL x,LL y){E[x].push_back(y);return ;}
bool vis[N];
bool dfs(LL x){
if(vis[x])return 0;
vis[x]=1;
for(auto y:E[x]){
if(!matchR[y]){matchL[x]=y;matchR[y]=x;return 1;}
if(dfs(matchR[y])){matchL[x]=y;matchR[y]=x;return 1;}
}
return 0;
}
void solve(LL CNT=-1){
LL cnt=0;
for(LL t=1;t<=lim;t++){
for(LL x=1;x<=lim;x++)vis[x]=0;
cnt+=dfs(t);
}
if(CNT!=-1)assert(CNT==cnt);
return ;
}
}
#define x1 x_tmp_1
#define y1 y_tmp_1
struct pt{LL x,y;};
const long long N = 200+95;
long long T,n;vector<pt>a[N][N];bool b[N][N];vector<vector<LL>>ans;
void make(LL x0,LL y0,LL x1,LL y1){
assert(SZ(a[x0][y0])&&SZ(a[x1][y1])&&!b[x0][y1]&&!b[x1][y0]);
ans.push_back({x0,y0,x1,y1});
return ;
}
int main(){
T=read();
while(T--){
ans.clear();n=read();TP::lim=n;
for(LL i=1;i<=n;i++)
for(LL j=1;j<=n;j++){a[i][j].clear();b[i][j]=0;}
for(LL i=1;i<=n;i++)
for(LL j=1;j<=n;j++){LL x=read();a[i][x].push_back((pt){i,j});}
{
vector<LL>ord(n+2);vector<LL>vis(n+2);for(LL i=1;i<=n;i++)vis[i]=0;
for(LL v=1;v<=n;v++)
for(LL i=1;i<=n;i++)
if(!vis[i]&&SZ(a[i][v])>=(n-1)){ord[v]=i;vis[i]=1;break;}
vector<pt>tmp[n+2][n+2];
for(LL i=1;i<=n;i++)
for(LL j=1;j<=n;j++)tmp[i][j]=a[i][j];
for(LL i=1;i<=n;i++)
for(LL j=1;j<=n;j++)a[i][j]=tmp[ord[i]][j];
}
for(LL t=1;t<=n;t++){
vector<LL>visL(n+2),visR(n+2);
for(LL i=t+1;i<=n;i++)
if(SZ(a[t][i])){make(t,i,t,i);visR[i]=1;}
for(LL i=t+1;i<=n;i++)
if(SZ(a[i][t])){make(i,t,i,t);visL[i]=1;}
LL cnt=0;
for(LL i=t+1;i<=n;i++)
if(!b[t][i])cnt++;
TP::clear();
for(LL i=t+1;i<=n;i++)
for(LL j=t+1;j<=n;j++)
if(!b[t][i]&&!b[j][t]&&SZ(a[j][i]))TP::add_e(i,j);
TP::solve(cnt);
for(LL i=t+1;i<=n;i++){
if(b[t][i])continue;
LL j=TP::matchL[i];
make(t,t,j,i);
}
}
writeln(SZ(ans));
for(LL t=0;t<SZ(ans);t++){
for(LL i=0;i<SZ(ans[t]);i++)writecs(ans[t][i]);
puts("");
}
}
return 0;
}
详细
Subtask #1:
score: 0
Wrong Answer
Test #1:
score: 0
Wrong Answer
time: 5ms
memory: 6084kb
input:
7 132 96 96 96 96 96 96 96 96 96 96 96 96 96 96 96 96 96 96 96 96 96 96 96 96 96 96 96 96 96 96 96 96 96 96 96 96 96 96 96 96 96 96 96 96 96 96 96 96 96 96 96 96 96 96 96 96 96 96 96 96 96 96 96 96 96 96 96 96 96 96 96 96 96 96 96 96 96 96 96 96 96 96 96 96 96 96 96 96 96 96 96 96 96 96 96 96 96 96 ...
output:
8646 1 1 2 2 1 1 3 3 1 1 4 4 1 1 5 5 1 1 6 6 1 1 7 7 1 1 8 8 1 1 9 9 1 1 10 10 1 1 11 11 1 1 12 12 1 1 13 13 1 1 14 14 1 1 15 15 1 1 16 16 1 1 17 17 1 1 18 18 1 1 19 19 1 1 20 20 1 1 21 21 1 1 22 22 1 1 23 23 1 1 24 24 1 1 25 25 1 1 26 26 1 1 27 27 1 1 28 28 1 1 29 29 1 1...
result:
wrong answer exist a card swapped twice.
Subtask #2:
score: 0
Skipped
Dependency #1:
0%
Subtask #3:
score: 0
Skipped
Dependency #1:
0%