QOJ.ac
QOJ
ID | Problem | Submitter | Result | Time | Memory | Language | File size | Submit time | Judge time |
---|---|---|---|---|---|---|---|---|---|
#351850 | #9. 简单回路 | cy1999 | 0 | 0ms | 0kb | C++11 | 4.7kb | 2024-03-12 16:26:07 | 2024-03-12 16:26:12 |
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...