QOJ.ac

QOJ

IDProblemSubmitterResultTimeMemoryLanguageFile sizeSubmit timeJudge time
#288273#5446. 琪露诺的符卡交换catagory#0 209ms9908kbC++237.3kb2023-12-22 13:15:072024-07-04 03:14:43

Judging History

你现在查看的是最新测评结果

  • [2024-07-04 03:14:43]
  • 评测
  • 测评结果:0
  • 用时:209ms
  • 内存:9908kb
  • [2023-12-22 13:15:07]
  • 提交

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(' ');}

void lsh(vector<LL>&vc){
  sort(vc.begin(),vc.end(),[&](LL x,LL y){return x<y;});
  vc.erase(unique(vc.begin(),vc.end()),vc.end());
  return ;
}

namespace dinic{
  const long long N = 100000+95 , M = 500000+95;
  LL n,s,t;
  struct Edge{
    LL to,nxt,w;
  }e[M<<1];LL head[N],tot=1,cur[N];
  void add(LL u,LL v,LL w){
    e[++tot].to=v;e[tot].nxt=head[u];
    e[tot].w=w;head[u]=tot;return ;
  }
  void add_e(LL u,LL v,LL w){
    add(u,v,w);add(v,u,0);
  }
  void clear(){
    for(LL i=1;i<=n;i++)head[i]=cur[i]=0;
    n=s=t=0;tot=1;return ;
  }
  LL dep[N];
  bool bfs(){
    for(LL i=1;i<=n;i++){dep[i]=-1;cur[i]=head[i];}
    queue<LL>q;q.push(s);dep[s]=0;
    while(!q.empty()){
      LL x=q.front();q.pop();
      for(LL i=head[x];i;i=e[i].nxt)
	if(dep[e[i].to]==-1&&e[i].w){
	  dep[e[i].to]=dep[x]+1;
	  q.push(e[i].to);
	}
    }
    return (dep[t]!=-1);
  }
  LL dfs(LL x,LL flow){
    if(x==t)return flow;
    LL lastflow=flow;
    for(LL i=cur[x];i;i=e[cur[x]].nxt){
      cur[x]=i;
      if(dep[e[i].to]==dep[x]+1&&e[i].w){
	LL d=dfs(e[i].to,min(flow,e[i].w));
	if(d){e[i].w-=d;e[i^1].w+=d;flow-=d;}
      }
    }
    if(lastflow==flow)dep[x]=-1;
    return lastflow-flow;
  }
  LL solve(){
    LL maxflow=0;
    while(bfs())maxflow+=dfs(s,(LL)(1e18));
    //    cerr<<" maxflow = "<<maxflow<<endl;
    return maxflow;
  }
}

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;LL __c[N][N];
void make(LL x0,LL y0,LL x1,LL y1){
  //  cout<<" x0 = "<<x0<<" y0 = "<<y0<<" x1 = "<<x1<<" y1 = "<<y1<<endl;
  if(x0==x1&&y0==y1){
    assert(SZ(a[x0][y0])&&!b[x0][y0]);
    a[x0][y0].pop_back();
    b[x0][y0]=1;return ;
  }
  //  cout<<" SZ(a[x0][y0]) = "<<SZ(a[x0][y0])<<endl;
  //  cout<<" SZ(a[x1][y1]) = "<<SZ(a[x1][y1])<<endl;
  //  cout<<" b[x0][y1] = "<<b[x0][y1]<<" b[x1][y0] = "<<b[x1][y0]<<endl;
  assert(SZ(a[x0][y0])&&SZ(a[x1][y1])&&!b[x0][y1]&&!b[x1][y0]);
  pt X=a[x0][y0].back();a[x0][y0].pop_back();
  pt Y=a[x1][y1].back();a[x1][y1].pop_back();
  b[x0][y1]=b[x1][y0]=1;
  ans.push_back({X.x,X.y,Y.x,Y.y});
  return ;
}

#define PLL pair<LL,LL>
#define mp(a,b) make_pair(a,b)
#define fir first
#define sec second

#define random(a,b) (rand()%(b-a+1)+a)
int main(){
  random_device seed;srand(seed());
  T=read();
  while(T--){
    ans.clear();

    /*    n=random(1,5);
    for(LL i=1;i<=n;i++)
      for(LL j=1;j<=n;j++)__c[i][j]=i;
    while(true){
      LL v=random(0,10);
      cerr<<" v = "<<v<<endl;
      if(v==0)break;
      LL x0=random(1,n),y0=random(1,n);
      LL x1=random(1,n),y1=random(1,n);
      swap(__c[x0][y0],__c[x1][y1]);
    }

    cout<<n<<endl;
    for(LL i=1;i<=n;i++){
      for(LL j=1;j<=n;j++)cout<<__c[i][j]<<" ";
      cout<<endl;
    }*/

    n=read();
    for(LL i=1;i<=n;i++)
      for(LL j=1;j<=n;j++)__c[i][j]=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++)__c[i][j]=i;
    for(LL i=1;i<=n;i++)
      swap(__c[i][n],__c[random(1,n)][n]);*/

    for(LL i=1;i<=n;i++)
      for(LL j=1;j<=n;j++){a[i][__c[i][j]].push_back((pt){i,j});}
    /*    for(LL i=1;i<=n;i++){
      for(LL j=1;j<=n;j++)cout<<__c[i][j]<<" ";
      cout<<endl;
    }*/

    {
      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;}*/
      for(LL i=1;i<=n;i++)ord[i]=i;
      for(LL i=1;i<=n;i++)
	swap(ord[i],ord[random(1,n)]);
    
      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];
    }

    /*    cout<<endl;
    cout<<" a : "<<endl;
    for(LL i=1;i<=n;i++){
      for(LL j=1;j<=n;j++)cout<<SZ(a[i][j])<<" ";
      cout<<endl;
    }
    cout<<endl;*/

    vector<LL>idxL(n+2),idxR(n+2);LL Id=0,S=0,T=0;
    vector<vector<LL>>idL(n+2),idR(n+2);
    S=++Id;T=++Id;
    for(LL i=1;i<=n;i++){
      idxL[i]=++Id;idL[i].resize(n+2);
      for(LL j=1;j<=n;j++)idL[i][j]=++Id;
    }
    for(LL i=1;i<=n;i++){
      idxR[i]=++Id;idR[i].resize(n+2);
      for(LL j=1;j<=n;j++)idR[i][j]=++Id;
    }
    
    for(LL t=1;t<=n;t++){
      dinic::clear();dinic::n=Id;dinic::s=S;dinic::t=T;
      
      for(LL i=1;i<=n;i++){
	if(!SZ(a[i][t]))continue;
	dinic::add_e(S,idxL[i],SZ(a[i][t]));
	for(LL k=1;k<=n;k++)
	  if((!b[i][k]))dinic::add_e(idxL[i],idL[i][k],1);
      }
      for(LL j=1;j<=n;j++){
	if(b[j][t])continue;
	dinic::add_e(idxR[j],T,1);
	for(LL k=1;k<=n;k++)
	  if(SZ(a[j][k])>=1)dinic::add_e(idR[j][k],idxR[j],1);
      }
      vector<vector<LL>>vec;
      for(LL i=1;i<=n;i++){
	vec.push_back({dinic::tot+1,i,i,t});
	dinic::add_e(idxL[i],idxR[i],1);
      }
      LL cnt=0;
      for(LL i=1;i<=n;i++)
	if(!b[i][t])cnt++;
      cnt-=dinic::solve();
      for(LL k=(t+1);k<=n;k++){
	for(LL i=1;i<=n;i++)
	  if(SZ(a[i][t]))
	    for(LL j=1;j<=n;j++)
	      if((!b[i][k])&&SZ(a[j][k])>=1){
		vec.push_back({dinic::tot+1,i,j,k});
		dinic::add_e(idL[i][k],idR[j][k],1);
	      }
	cnt-=dinic::solve();
      }
      assert((!cnt));
      for(LL i=0;i<SZ(vec);i++)
	if(!dinic::e[vec[i][0]].w)
	  make(vec[i][1],t,vec[i][2],vec[i][3]);

      /*      cout<<"------------------------------------> t = "<<t<<" : "<<endl;
      for(LL i=1;i<=n;i++){
	for(LL j=1;j<=n;j++)cout<<SZ(a[i][j])<<" ";
	cout<<endl;
      }
      cout<<" - "<<endl;
      for(LL i=1;i<=n;i++){
	for(LL j=1;j<=n;j++)cout<<b[i][j]<<" ";
	cout<<endl;
      }
      cout<<endl;*/
    }

    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("");
    }
    for(LL t=0;t<SZ(ans);t++){
      LL x0=ans[t][0],y0=ans[t][1],x1=ans[t][2],y1=ans[t][3];
      swap(__c[x0][y0],__c[x1][y1]);
    }
    for(LL t=1;t<=n;t++){
      vector<LL>vec(n);
      for(LL i=1;i<=n;i++)vec[i-1]=__c[t][i];
      lsh(vec);assert(SZ(vec)==n);
    }
  }
  return 0;
}



Details

Tip: Click on the bar to expand more detailed information

Subtask #1:

score: 0
Time Limit Exceeded

Test #1:

score: 20
Accepted
time: 209ms
memory: 9020kb

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
59 131 75 132 
59 130 100 132 
59 129 106 132 
59 128 40 132 
59 127 29 132 
59 126 103 132 
59 125 125 132 
59 124 80 132 
59 123 49 132 
59 122 17 132 
59 121 120 132 
59 120 33 132 
59 119 13 132 
59 118 42 132 
59 117 68 132 
59 116 61 132 
59 115 76 132 
59 114 73 132 
59 113 21 132 
59 11...

result:

ok your solution is correct.

Test #2:

score: 0
Accepted
time: 55ms
memory: 7632kb

input:

8
14
13 13 13 13 13 13 13 13 13 13 13 13 13 13
7 7 7 7 7 7 7 7 7 7 7 7 7 7
8 8 8 8 8 8 8 8 8 8 8 8 8 8
14 14 14 14 14 14 14 14 14 14 14 14 14 14
5 5 5 5 5 5 5 5 5 5 5 5 5 5
4 4 4 4 4 4 4 4 4 4 4 4 4 4
1 1 1 1 1 1 1 1 1 1 1 1 1 1
10 10 10 10 10 10 10 10 10 10 10 10 10 10
2 2 2 2 2 2 2 2 2 2 2 2 2 2
9...

output:

91
7 13 9 14 
7 12 13 14 
7 11 6 14 
7 10 5 14 
7 9 11 14 
7 8 2 14 
7 7 3 14 
7 6 10 14 
7 5 8 14 
7 4 14 14 
7 3 12 14 
7 2 1 14 
7 1 4 14 
9 12 13 13 
9 11 6 13 
9 10 5 13 
9 9 11 13 
9 8 2 13 
9 7 3 13 
9 6 10 13 
9 5 8 13 
9 4 14 13 
9 3 12 13 
9 2 1 13 
9 1 4 13 
13 11 6 12 
13 10 5 12 
13 9 1...

result:

ok your solution is correct.

Test #3:

score: 0
Accepted
time: 102ms
memory: 9908kb

input:

4
82
20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 1...

output:

3321
56 81 35 82 
56 80 39 82 
56 79 77 82 
56 78 33 82 
56 77 12 82 
56 76 67 82 
56 75 26 82 
56 74 70 82 
56 73 2 82 
56 72 50 82 
56 71 4 82 
56 70 34 82 
56 69 66 82 
56 68 41 82 
56 67 21 82 
56 66 51 82 
56 65 72 82 
56 64 61 82 
56 63 1 82 
56 62 9 82 
56 61 65 82 
56 60 46 82 
56 59 27 82 
...

result:

ok your solution is correct.

Test #4:

score: -20
Time Limit Exceeded

input:

8
3
1 1 1
3 3 3
2 2 2
3
1 1 1
3 3 3
2 2 2
1
1
11
5 5 5 5 5 5 5 5 5 5 5
3 3 3 3 3 3 3 3 3 3 3
1 1 1 1 1 1 1 1 1 1 1
9 9 9 9 9 9 9 9 9 9 9
4 4 4 4 4 4 4 4 4 4 4
11 11 11 11 11 11 11 11 11 11 11
2 2 2 2 2 2 2 2 2 2 2
6 6 6 6 6 6 6 6 6 6 6
8 8 8 8 8 8 8 8 8 8 8
10 10 10 10 10 10 10 10 10 10 10
7 7 7 7 7...

output:

3
1 2 3 3 
1 1 2 3 
3 1 2 2 
3
1 2 3 3 
1 1 2 3 
3 1 2 2 
0
55
3 10 7 11 
3 9 2 11 
3 8 5 11 
3 7 1 11 
3 6 8 11 
3 5 11 11 
3 4 9 11 
3 3 4 11 
3 2 10 11 
3 1 6 11 
7 9 2 10 
7 8 5 10 
7 7 1 10 
7 6 8 10 
7 5 11 10 
7 4 9 10 
7 3 4 10 
7 2 10 10 
7 1 6 10 
2 8 5 9 
2 7 1 9 
2 6 8 9 
2 5 11 9 
2 4 9...

result:


Subtask #2:

score: 0
Skipped

Dependency #1:

0%

Subtask #3:

score: 0
Skipped

Dependency #1:

0%