QOJ.ac

QOJ

IDProblemSubmitterResultTimeMemoryLanguageFile sizeSubmit timeJudge time
#351850#9. 简单回路cy19990 0ms0kbC++114.7kb2024-03-12 16:26:072024-03-12 16:26:12

Judging History

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

  • [2024-03-12 16:26:12]
  • 评测
  • 测评结果:0
  • 用时:0ms
  • 内存:0kb
  • [2024-03-12 16:26:07]
  • 提交

answer

// Hydro submission #65f00d809b5d16325e8cdc57@1710231965978
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cstdlib>
#include<ctime>
#include<utility>
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
typedef pair<int,int> pii;
ll p=1000000007;
int c[100010];
int d[1010];
int ld[1010][10];
int rd[1010][10];
int cnt;
int n,m,k,q;
int la[10];
int ra[10];
int set(int s,int x,int v)
{
	s&=~(3<<(2*(x-1)));
	s|=v<<(2*(x-1));
	return s;
}
int get(int s,int x)
{
	return (s>>(2*(x-1)))&3;
}
int st[10];
void dfs(int x,int s)
{
	if(x>m+1)
	{
		int i;
		int now=0;
		for(i=1;i<=m+1;i++)
		{
			if(get(s,i)==1)
				st[++now]=i;
			else if(get(s,i)==2)
			{
				la[i]=st[now];
				ra[st[now]]=i;
				now--;
			}
			if(now<0)
				return;
		}
		if(now>0)
			return;
		for(i=1;i<=m+1;i++)
			fprintf(stderr,"%d",get(s,i));
		fprintf(stderr,"\n");
		d[++cnt]=s;
		c[s]=cnt;
		memcpy(ld[cnt],la,sizeof la);
		memcpy(rd[cnt],ra,sizeof ra);
		return;
	}
	int i;
	for(i=0;i<=2;i++)
		dfs(x+1,set(s,x,i));
}
void add(ll &x,ll y)
{
	x=(x+y)%p;
}
struct dp
{
	int a[1010][10];
	ll f[1010][10][200];
	void solve()
	{
		f[1][1][1]=1;
		int i,j,k;
		for(i=1;i<=n;i++)
		{
			for(j=1;j<=m;j++)
				for(k=1;k<=cnt;k++)
				{
					if(!f[i][j][k])
						continue;
					int s=d[k];
					int l=get(s,j);
					int r=get(s,j+1);
					if(a[i][j])
					{
						if(!l&&!r)
							add(f[i][j+1][k],f[i][j][k]);
						continue;
					}
					if(!l)
						if(!r)
						{
							add(f[i][j+1][k],f[i][j][k]);
							int v=set(s,j,1);
							v=set(v,j+1,2);
							add(f[i][j+1][c[v]],f[i][j][k]);
						}
						else if(r==1)
						{
							add(f[i][j+1][k],f[i][j][k]);
							int v=set(s,j,1);
							v=set(v,j+1,0);
							add(f[i][j+1][c[v]],f[i][j][k]);
						}
						else
						{
							add(f[i][j+1][k],f[i][j][k]);
							int v=set(s,j,2);
							v=set(v,j+1,0);
							add(f[i][j+1][c[v]],f[i][j][k]);
						}
					else if(l==1)
					{
						if(!r)
						{
							add(f[i][j+1][k],f[i][j][k]);
							int v=set(s,j,0);
							v=set(v,j+1,1);
							add(f[i][j+1][c[v]],f[i][j][k]);
						}
						else if(r==1)
						{
							int v=set(s,j,0);
							v=set(v,j+1,0);
							v=set(v,rd[k][j+1],1);
							add(f[i][j+1][c[v]],f[i][j][k]);
						}
						else
						{
//							fprintf(stderr,"orzzjt\n");
						}
					}
					else
					{
						if(!r)
						{
							add(f[i][j+1][k],f[i][j][k]);
							int v=set(s,j,0);
							v=set(v,j+1,2);
							add(f[i][j+1][c[v]],f[i][j][k]);
						}
						else if(r==1)
						{
							int v=set(s,j,0);
							v=set(v,j+1,0);
							add(f[i][j+1][c[v]],f[i][j][k]);
						}
						else
						{
							int v=set(s,j,0);
							v=set(v,j+1,0);
							v=set(v,ld[k][j],2);
							add(f[i][j+1][c[v]],f[i][j][k]);
						}
					}
				}
			for(j=1;j<=cnt;j++)
				if(!get(d[j],m+1))
					add(f[i+1][1][c[d[j]<<2]],f[i][m+1][j]);
		}
	}
};
dp a,b;
int tot;
int e1[10];
int e2[10];
int op[1010];
int f[1010];
struct list
{
	int h[210];
	int v[100010];
	int t[100010];
	int n;
	list()
	{
		n=0;
		memset(h,0,sizeof h);;
	}
	void add(int x,int y)
	{
		n++;
		v[n]=y;
		t[n]=h[x];
		h[x]=n;
	}
};
list e;
int find(int x)
{
	return f[x]==x?x:f[x]=find(f[x]);
}
int check(int x,int y)
{
	if(x==53&&y==53)
		int xxx=1;
	int i;
	for(i=1;i<=m+1;i++)
	{
		bool x1=get(d[x],i);
		bool y1=get(d[y],i);
		if(x1^y1)
			return 0;
	}
	for(i=1;i<=m+1;i++)
		f[i]=i;
	int fa;
	for(i=1;i<=m+1;i++)
		if(get(d[x],i))
		{
			fa=find(i);
			if(get(d[x],i)==1)
				f[find(i)]=find(rd[x][i]);
			if(get(d[y],i)==1)
				f[find(i)]=find(rd[y][i]);
		}
	for(i=1;i<=m+1;i++)
		if(get(d[x],i)&&find(i)!=fa)
			return 0;
	return 1;
}
int main()
{
	freopen("d2t1.in","r",stdin);
	freopen("d2t1.out","w",stdout);
	scanf("%d%d%d",&n,&m,&k);
	int j,l;
	int i,x,y;
	for(i=1;i<=k;i++)
	{
		scanf("%d%d",&x,&y);
		a.a[x][y]=b.a[n-x+1][y]=1;
	}
	dfs(1,0);
	for(i=1;i<=cnt;i++)
		for(j=1;j<=cnt;j++)
			if(check(i,j))
				e.add(i,j);
	a.solve();
	b.solve();
	scanf("%d",&q);
	for(i=1;i<=q;i++)
	{
		scanf("%d%d",&x,&y);
		ll ans=0;
		for(j=1;j<=cnt;j++)
		{
			int s=d[j];
			if(get(s,m+1))
				continue;
			if(!get(s,y))
				continue;
			int bo=1;
			tot=0;
			for(l=1;l<=m;l++)
				if(get(s,l))
				{
					if((a.a[x][l]||a.a[x+1][l]))
					{
						bo=0;
						break;
					}
					tot++;
					e1[tot]=l;
					e2[tot]=get(s,l);
				}
			if(!bo)
				continue;
			for(l=e.h[j];l;l=e.t[l])
				ans=(ans+a.f[x+1][1][c[s<<2]]*b.f[n-x+1][1][c[d[e.v[l]]<<2]])%p;
		}
		printf("%lld\n",ans);
	}
	return 0;
}

Details

Tip: Click on the bar to expand more detailed information

Test #1:

score: 0
Dangerous Syscalls

input:

100 1 10
68 1
13 1
48 1
51 1
30 1
90 1
74 1
79 1
80 1
63 1
10
73 1
84 1
10 1
44 1
3 1
16 1
17 1
47 1
49 1
94 1

output:


result:


Test #2:

score: 0
Dangerous Syscalls

input:

1000 2 10
468 2
177 1
597 1
396 1
548 2
279 1
601 1
349 1
453 2
217 2
100
954 1
468 1
427 2
948 1
739 2
605 2
177 1
20 2
506 1
778 2
141 1
621 1
273 1
203 2
584 2
718 2
371 2
973 2
892 2
374 2
585 2
419 2
953 2
347 2
575 2
353 2
830 1
196 1
603 2
630 2
144 2
84 2
566 1
598 2
749 1
878 1
322 1
250 2
...

output:


result:


Test #3:

score: 0
Dangerous Syscalls

input:

1000 2 10
378 2
63 1
276 2
245 2
826 1
422 1
634 1
970 1
707 1
386 1
100
987 1
262 2
913 1
201 1
685 1
969 2
382 1
460 1
45 1
535 2
54 2
16 2
436 2
668 1
136 1
210 1
660 2
956 1
743 1
549 2
228 2
967 2
624 2
465 1
135 1
854 1
593 1
359 2
941 1
459 1
456 2
763 2
558 2
116 2
38 2
187 2
108 2
749 1
911...

output:


result:


Test #4:

score: 0
Dangerous Syscalls

input:

1000 3 10
186 3
140 3
410 1
639 1
836 2
399 2
432 3
712 1
946 3
958 3
100
203 3
895 1
351 1
503 2
991 1
61 2
760 1
647 3
70 3
75 1
522 2
539 3
417 1
53 2
404 1
467 2
283 1
313 2
793 3
290 2
410 1
827 1
572 1
534 3
765 2
977 1
97 3
797 3
966 3
404 2
479 1
653 3
212 2
164 2
960 1
655 1
304 1
182 1
190...

output:


result:


Test #5:

score: 0
Dangerous Syscalls

input:

1000 5 10
230 1
368 1
815 1
540 3
496 4
860 4
892 1
183 2
175 2
704 1
100
365 1
79 5
154 1
775 4
451 2
382 2
641 2
509 2
613 4
629 2
24 3
628 4
438 2
894 5
386 3
588 5
742 2
700 2
470 5
333 4
347 3
824 2
98 2
946 4
359 4
199 3
903 1
13 2
545 4
718 5
158 3
462 5
15 3
138 5
101 3
525 5
394 2
282 3
566...

output:


result:


Test #6:

score: 0
Dangerous Syscalls

input:

1000 6 10
459 1
653 6
840 4
256 3
298 1
841 2
749 1
30 5
155 2
534 5
100
703 1
169 2
577 3
818 1
784 5
520 3
106 5
52 4
38 1
533 1
729 4
88 4
586 5
828 6
547 1
194 2
74 4
448 3
673 6
778 1
180 3
612 1
814 6
784 6
658 3
969 3
350 5
606 2
257 1
753 3
309 4
480 4
355 4
33 2
47 4
195 3
282 4
867 5
226 4...

output:


result:


Test #7:

score: 0
Dangerous Syscalls

input:

1000 6 10
322 5
8 2
165 5
590 3
823 6
171 1
987 1
130 2
474 3
838 5
10000
854 4
329 1
324 2
361 4
479 4
657 6
27 1
121 3
57 5
790 4
81 1
246 3
720 5
917 4
430 6
506 3
129 3
752 2
119 6
382 1
146 4
233 3
420 5
20 1
413 5
925 5
466 4
682 5
632 4
128 4
574 1
503 4
543 1
274 3
273 5
742 2
399 4
36 3
237...

output:


result:


Test #8:

score: 0
Dangerous Syscalls

input:

1000 6 10
454 6
42 2
861 3
46 2
592 2
220 1
641 1
415 4
687 3
803 5
10000
646 2
362 3
870 5
523 5
589 4
984 1
981 1
361 4
496 5
584 2
271 1
707 1
111 5
714 3
855 4
793 5
943 2
459 2
422 2
194 6
404 6
786 3
12 5
33 6
628 3
199 1
87 2
882 4
207 2
890 5
121 5
769 2
611 2
398 5
869 6
479 6
926 1
952 4
3...

output:


result:


Test #9:

score: 0
Dangerous Syscalls

input:

1000 6 10
855 4
342 2
897 3
652 6
279 2
715 3
439 1
582 6
711 1
249 3
10000
581 2
907 2
221 6
92 2
355 3
342 2
130 5
820 6
90 2
802 1
803 1
87 3
170 5
553 4
432 2
891 1
523 2
519 4
174 6
933 6
796 3
691 6
982 5
871 1
430 6
230 2
133 6
271 4
442 6
268 6
452 5
656 2
502 3
14 3
248 2
470 2
710 5
954 5
...

output:


result:


Test #10:

score: 0
Dangerous Syscalls

input:

1000 6 10
959 3
380 5
181 5
388 6
749 5
342 5
944 1
918 3
870 1
753 4
10000
383 4
321 3
646 1
893 4
776 3
664 2
518 5
234 1
114 6
639 1
764 1
207 1
877 3
273 5
764 1
799 5
385 6
314 3
982 6
784 6
819 5
83 6
651 4
221 3
355 1
829 4
144 6
862 3
786 2
385 6
857 4
53 4
55 4
710 4
186 2
735 2
878 3
955 5...

output:


result: