1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73
| #include<bits/stdc++.h> using namespace std; int n,m,q; struct node{int x,y;} a[10]; bool vis[10]; pair<int,int> now[20]; int head,tail,lst[20],nxt[20],cnt=0; void dfs() { if(nxt[head]==tail) { cout<<"yes"<<endl; exit(0); } for(int i=nxt[head];i!=tail;i=nxt[i]) { int fir=now[i].first,sec=now[i].second; for(int j=1;j<=q;j++) { if(vis[j]) continue; for(int t=0;t<=1;t++,swap(a[j].x,a[j].y)) { if(a[j].x>fir||a[j].y>sec) continue; vis[j]=1; if(a[j].x==fir&&a[j].y==sec) { now[nxt[i]].first+=fir,now[lst[i]].second+=sec; nxt[lst[i]]=nxt[i],lst[nxt[i]]=lst[i]; dfs(); now[nxt[i]].first-=fir,now[lst[i]].second-=sec; nxt[lst[i]]=i,lst[nxt[i]]=i; } else if(a[j].x==fir) { now[i].second-=a[j].y,now[lst[i]].second+=a[j].y; dfs(); now[i].second+=a[j].y,now[lst[i]].second-=a[j].y; } else if(a[j].y==sec) { now[i].first-=a[j].x,now[nxt[i]].first+=a[j].x; dfs(); now[i].first+=a[j].x,now[nxt[i]].first-=a[j].x; } else { now[++cnt]={fir-a[j].x,a[j].y}; nxt[lst[i]]=cnt,lst[cnt]=lst[i]; now[++cnt]={a[j].x,sec-a[j].y}; lst[cnt]=cnt-1,nxt[cnt-1]=cnt; nxt[cnt]=nxt[i],lst[nxt[i]]=cnt; dfs(); lst[nxt[i]]=i,nxt[lst[i]]=i,cnt-=2; } vis[j]=0; } } } } signed main() { cin>>n>>m>>q; int tot=0; for(int i=1;i<=q;i++) { int num,x,y; cin>>num>>x>>y; while(num--) a[++tot]={x,y}; } q=tot; head=++cnt,tail=++cnt; now[++cnt]={m,n},lst[cnt]=head,nxt[cnt]=tail; nxt[head]=cnt,lst[tail]=cnt; for(int s=1;s<(1<<q);s++) { int sum=0; for(int i=1;i<=q;i++) if(s&(1<<(i-1))) sum+=a[i].x*a[i].y; else vis[i]=1; if(sum==n*m) dfs(); for(int i=1;i<=q;i++) vis[i]=0; } cout<<"no"<<endl; return 0; }
|