QOJ.ac

QOJ

IDProblemSubmitterResultTimeMemoryLanguageFile sizeSubmit timeJudge time
#114986#5956. Paradox Sortzhouhuanyi32 ✓69ms3596kbC++111.9kb2023-06-24 13:12:562023-06-24 13:13:00

Judging History

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

  • [2023-08-10 23:21:45]
  • System Update: QOJ starts to keep a history of the judgings of all the submissions.
  • [2023-06-24 13:13:00]
  • 评测
  • 测评结果:32
  • 用时:69ms
  • 内存:3596kb
  • [2023-06-24 13:12:56]
  • 提交

answer

#include<iostream>
#include<cstdio>
#include<algorithm>
#define N 100
using namespace std;
int read()
{
    char c=0;
    int sum=0;
    while (c<'0'||c>'9') c=getchar();
    while ('0'<=c&&c<='9') sum=sum*10+c-'0',c=getchar();
    return sum;
}
int T,n,A,cater,nw,length,in[N+1],p[N+1],q[N+1],belong[N+1];
char c[N+1][N+1];
bool used[N+1];
bool cmp(int x,int y)
{
    return in[x]<in[y];
}
int get_max(int x,int y)
{
    if (!x||!y) return x^y;
    return (c[x][y]=='N')?y:x;
}
bool check(int x)
{
    int res=0,ps=1;
    if (!used[A])
    {
	length=0;
	for (int i=1;i<=n;++i)
	    if (!used[i])
		p[++length]=i;
	sort(p+1,p+length+1,cmp);
	for (int i=1;i<=length;++i)
	{
	    res+=in[p[i]];
	    if (res==((i*(i-1))>>1))
	    {
		++cater;
		for (int t=ps;t<=i;++t) belong[p[t]]=cater;
		ps=i+1;
	    }
	}
	for (int i=1;i<=n;++i)
	    if ((!x||c[x][i]=='N')&&belong[i]>belong[A])
		return 0;
	return 1;
    }
    else
    {
	if (get_max(nw,A)!=A) return 0;
	for (int i=1;i<=n;++i)
	    if (!used[i]&&c[A][i]=='N')
		return 0;
	return 1;
    }
}
int main()
{
    T=read();
    for (int i=1;i<=T;++i)
    {
	n=read(),A=read()+1,nw=0;
	for (int j=1;j<=n;++j) in[j]=used[j]=0;
	for (int j=1;j<=n;++j)
	    for (int k=1;k<=n;++k)
	    {
		cin>>c[j][k];
		if (c[j][k]=='N') in[k]++;
	    }
	if (!check(0))
	{
	    printf("Case #%d: IMPOSSIBLE\n",i);
	    continue;
	}
	for (int j=1;j<=n;++j)
	{
 	    for (int k=1;k<=n;++k)
		if (!used[k])
		{
		    for (int t=1;t<=n;++t)
			if (!used[t]&&c[k][t]=='N')
			    in[t]--;
		    used[k]=1;
		    if (check(get_max(nw,k)))
		    {
			q[j]=k;
			break;
		    }
		    used[k]=0;
		    for (int t=1;t<=n;++t)
			if (!used[t]&&c[k][t]=='N')
			    in[t]++;
		}
	    nw=get_max(nw,q[j]);
	}
	printf("Case #%d: ",i);
	for (int j=1;j<=n;++j) printf("%d ",q[j]-1);
	puts("");
    }
    return 0;
}

Details

Tip: Click on the bar to expand more detailed information

Subtask #1:

score: 4
Accepted

Test #1:

score: 4
Accepted
time: 2ms
memory: 3596kb

input:

100
3 0
-YN
N-Y
YN-
2 0
-Y
N-
5 0
-YNNN
N-YNN
YN-YN
YYN-Y
YYYN-
5 1
-NYYY
Y-NNN
NY-NY
NYY-N
NYNY-
6 5
-YYNNY
N-YYNY
NN-NYN
YNY-NY
YYNY-Y
NNYNN-
4 0
-YYY
N-YN
NN-N
NYY-
2 0
-Y
N-
5 1
-NYNY
Y-YYY
NN-YY
YNN-N
NNNY-
7 5
-YYYYYY
N-NNYYN
NY-YNNN
NYN-NYN
NNYY-NN
NNYNY-N
NYYYYY-
8 0
-YNNNNNN
N-YNNNNN
YN-YNN...

output:

Case #1: 1 2 0 
Case #2: 0 1 
Case #3: 3 4 2 1 0 
Case #4: 0 2 3 4 1 
Case #5: 0 1 3 4 2 5 
Case #6: 0 1 2 3 
Case #7: 0 1 
Case #8: 0 1 2 3 4 
Case #9: IMPOSSIBLE
Case #10: 6 7 5 4 3 2 1 0 
Case #11: 0 1 2 
Case #12: 0 1 
Case #13: 0 1 
Case #14: IMPOSSIBLE
Case #15: IMPOSSIBLE
Case #16: 7 8 6 5 4 ...

result:

ok 100 lines

Subtask #2:

score: 28
Accepted

Test #2:

score: 28
Accepted
time: 69ms
memory: 3544kb

input:

100
39 0
-YNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
N-YNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
YN-YNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
YYN-YNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
YYYN-YNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
YYYYN-YNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
YYYYYN-YNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
YYYYYYN-YNN...

output:

Case #1: 37 38 36 35 34 33 32 31 30 29 28 27 26 25 24 23 22 21 20 19 18 17 16 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0 
Case #2: 0 13 23 28 30 34 38 40 41 42 43 46 49 51 52 33 5 1 17 32 15 29 19 10 16 47 48 9 4 27 6 7 18 31 8 11 26 50 3 37 25 35 45 20 24 39 22 12 44 36 2 21 14 
Case #3: 0 1 2 3 4 5 6 8...

result:

ok 100 lines

Extra Test:

score: 0
Extra Test Passed