跟题解写的很像啊,为啥 WA 了。。。
而且好像 Yes 和 No 都有挂掉的。。。
玄关
// Author: Minghan Ye
// Name: D - Substring Comparison
// URL: https://atcoder.jp/contests/arc165/tasks/arc165_d
// ML: 1024MB
// TL: 2000ms
// Time: 24/05/22 21:31
#include<bits/stdc++.h>
using namespace std;
#ifdef DEBUG
#include "E:/OI/normal/templates/debug.h"
#else
#define dbg(...) (void)0
#define msg(...) (void)0
#endif
#define ll long long
#define endl '\n'
#define PB emplace_back
#define PPB pop_back
#define MP make_pair
#define ALL(Name) Name.begin(),Name.end()
#define PII pair<int,int>
#define VI vector<int>
#define GI greater<int>
#define fi first
#define se second
const int N=2005;
int n,m,a[N],b[N],c[N],d[N],pos[N];
struct E
{
int v,id;
E(int v,int x):v(v),id(x){}
};
vector<E>g[N];
int fa[N],dfn[N],df,low[N],bel[N];
VI stk;
vector<VI>scc;
void tarjan(int x)
{
low[x]=dfn[x]=++df;
stk.PB(x);
for(auto e:g[x])
{
int y=e.v;
if(!dfn[y])tarjan(y),low[x]=min(low[x],low[y]);
else if(!bel[y])low[x]=min(low[y],dfn[y]);
}
if(low[x]==dfn[x])
{
int cnt=scc.size();
scc.PB();
int u;
do
{
u=stk.back();
stk.pop_back();
scc.back().PB(u),bel[u]=cnt;
}while(u!=x);
}
}
int find(int x){return fa[x]==x?x:fa[x]=find(fa[x]);}
int main()
{
ios::sync_with_stdio(false),cin.tie(nullptr);
// int _;cin>>_;while(_--)
cin>>n>>m;
for(int i=1;i<=m;i++)cin>>a[i]>>b[i]>>c[i]>>d[i];
iota(fa+1,fa+n+1,1);
bool ok=1;
while(ok)
{
ok=0;
fill(g+1,g+n+1,vector<E>());
for(int i=1;i<=m;i++)
{
if(c[i]+pos[i]>d[i])return puts("No"),0;
if(a[i]+pos[i]<=b[i])g[find(a[i]+pos[i])].PB(find(c[i]+pos[i]),i);
}
df=0;
scc.clear(),scc.PB();
fill(dfn+1,dfn+n+1,0),fill(low+1,low+n+1,0),fill(bel+1,bel+n+1,0);
for(int i=1;i<=n;i++)
if(!dfn[i]&&fa[i]==i)tarjan(i);
for(VI i:scc)
{
for(int j:i)fa[find(j)]=find(i[0]);
for(int j:i)
for(auto e:g[j])if(bel[e.v]==bel[j])pos[e.id]++,ok=1;
}
}
puts("Yes");
return 0;
}