网络流,不知道哪里炸了。
#include <stdio.h>
#include <string.h>
#include <queue>
#define od(x) printf("%d",x)
#define odb(x) printf("%d ",x)
#define odl(x) printf("%d\n",x)
#define odp(x,y) printf("%d %d\n",x,y)
#define ol(x) puts("")
#define old(x) printf("%lld",x)
#define oldb(x) printf("%lld ",x)
#define oldl(x) printf("%lld\n",x)
#define oldp(x,y) printf("%lld %lld\n",x,y)
#define rg(x) for(int i=1;i<=(x);i++){
#define rj(j,y,x) for(int j=y;j<=(x);j++){
#define gr }
#define rrg(x) for(int i=0;i<(x);i++)
#define rdln(a) a[i]=read();
#define rdln0(a,x) rrg(x) rdln(a) gr
#define rdln1(a,x) rg(x) rdln(a) gr
inline int read()
{
int num=0,f=1;char c=getchar();
while(c<48||c>57){if(c=='-')f=-1;c=getchar();}
while(c>47&&c<58)num=num*10+(c^48),c=getchar();
return num*f;
}
struct Edge{
int v,w,nxt;
}e[2000005];
int h[1000005],cnt=2;
void addedge(int u,int v,int w)
{
e[cnt]=(Edge){v,w,h[u]};
h[u]=cnt++;
}
int now[1000005];
int vis[1005],dep[1000005];
int bfs(int s,int t)
{
std::queue<int> q;
memset(vis,0,sizeof(vis));
vis[s]=1,dep[s]=0,now[s]=h[s];
q.push(s);
while(!q.empty())
{
int u=q.front();q.pop();
for(int i=h[u];i;i=e[i].nxt)
{
int v=e[i].v;
if(vis[v]||e[i].w==0)continue;
dep[v]=dep[u]+1;
now[v]=h[v];
q.push(v);
vis[v]=1;
if(v==t)return 1;
}
}
return 0;
}
int dfs(int u,int t,int f)
{
if(u==t)return f;
int l=f;
for(int i=now[u];i;i=e[i].nxt)
{
now[u]=i;
int v=e[i].v;
if(e[i].w&&dep[v]==dep[u]+1)
{
int flow=dfs(v,t,e[i].w<l?e[i].w:l);
e[i].w-=flow,e[i^1].w+=flow;
l-=flow;
if(l==0)break;
}
}
return f-l;
}
inline void add(int u,int v,int w)
{
// odp(u,v);
addedge(u,v,w);
addedge(v,u,0);
}
int G[105][105];
signed main()
{
int n=read(),m=read(),k=read();
int s=0,t=n+n+m+k+5;
int q=max(n,m);
n=m=q;
rg(m)add(i+n+n,t,1);gr
rg(n)add(i,i+n,1);gr
rg(k)int a=read(),c=read(),b=read(),d=read();
add(s,i+n+n+m,1);
rj(j,a,b)add(i+n+n+m,j,1);
rj(k,c,d)if(G[j][k]==0){G[j][k]=1;
add(j+n,k+n+n,1);gr gr gr gr
int ans=0;
while(bfs(s,t))ans+=dfs(s,t,0x3f3f3f3f);
printf("%d\n",ans);
return 0;
}