这代码一直 TLE on #16。蒟蒻已经调一下午了。(再改就要跟题解一样了)
#include<bits/stdc++.h>
#define int long long
#define il inline
#define pii pair<int,int>
#define mk make_pair
#define mod 1000000007
using namespace std;
il int rd(){
int jya=0,tl=1;char jyt=getchar();
while(!isdigit(jyt)){if(jyt=='-')tl=-1;jyt=getchar();}
while(isdigit(jyt)){jya=(jya<<1)+(jya<<3)+(jyt-'0');jyt=getchar();}
return jya*tl;
}
il void wr(int jjy){
if(jjy<0)putchar('-'),jjy=-jjy;
if(jjy>9)wr(jjy/10);
putchar(jjy%10+48);
}
const int JYAAKIOI=1145141919810;
struct Edge{
int to,next;
}e[500086];
struct node{
int x,y;
}b[200086];
int n,m,u,v,low[200086],dfn[200086],now,cnt,scc[200086],mm,sc[200086],noww;
int up[200086],down[200086],po[200086],d[200086],f[200086][26],q,head[200086],len;
vector<int>g[200086];
stack<int>st;
bool vis[500086];
il void add_edge(int u,int v){
e[++len]=(Edge){v,head[u]};
head[u]=len;
}
il void tj(int u,int fa){
low[u]=dfn[u]=++now;
st.push(u);
for(int i=head[u];i!=-1;i=e[i].next){
int v=e[i].to;
if(v==fa)continue;
if(!dfn[v]){
tj(v,u);
low[u]=min(low[u],low[v]);
if(low[v]>dfn[u])vis[i]=vis[i^1]=1;
}
else low[u]=min(low[u],dfn[v]);
}
}
il void dfs1(int u){
scc[u]=cnt;
for(int i=head[u];i!=-1;i=e[i].next){
int v=e[i].to;
if(scc[v]||vis[i])continue;
dfs1(v);
}
}
il void dfs(int x,int fa){
sc[x]=noww;
f[x][0]=fa;d[x]=d[fa]+1;
for(int i=1;i<=po[d[x]];++i)f[x][i]=f[f[x][i-1]][i-1];
for(auto v:g[x])if(v!=fa)dfs(v,x);
}
il int lca(int x,int y){
if(d[x]<d[y])swap(x,y);
while(d[x]>d[y])x=f[x][po[d[x]-d[y]]-1];
if(x==y)return x;
for(int k=po[d[x]-1];k>=0;--k){
if(f[x][k]!=f[y][k])x=f[x][k],y=f[y][k];
}
return f[x][0];
}
il bool ck(int u,int fa){
for(int v:g[u]){
if(v==fa)continue;
if(!ck(v,u)||(up[v]&&down[v]))return 0;
up[u]+=up[v];
down[u]+=down[v];
}
return 1;
}
signed main(){
memset(head,-1,sizeof head);
n=rd();m=rd();q=rd();
for(int i=1;i<=m;++i){
u=rd();v=rd();
add_edge(u,v);
add_edge(v,u);
}
for(int i=1;i<=n;++i){
//cout<<1;
if(!dfn[i]){
tj(i,0);
}
}
//cout<<cnt;
for(int i=1;i<=n;++i){
if(!scc[i]){
++cnt;
dfs1(i);
}
}
for(int i=1;i<=n;++i){
for(int j=head[i];j!=-1;j=e[j].next){
int v=e[j].to;
if(scc[i]<scc[v]){
g[scc[i]].push_back(scc[v]);
g[scc[v]].push_back(scc[i]);
}
}
//cout<<scc[i]<<" ";
}
for(int i=1;i<=n;++i)po[i]=po[i-1]+(1<<po[i-1]==i);
for(int i=1;i<=cnt;++i){
if(!sc[i]){
++noww;//cout<<2;
dfs(i,0);
}
}
//cout<<noww;
while(q--){
u=rd();v=rd();
if(scc[u]!=scc[v]){
b[++mm].x=scc[u];
b[mm].y=scc[v];
}
}
//cout<<mm;
for(int i=1;i<=mm;++i){
u=b[i].x,v=b[i].y;
if(sc[u]!=sc[v]){
printf("No");
return 0;
}
int lac=lca(u,v);
//cout<<lac<<endl<<endl;
++up[u],++down[v];
--up[lac],--down[lac];
}
for(int i=1;i<=cnt;++i){
if(!f[i][0]&&!ck(i,0)){
printf("No");
return 0;
}
}
printf("Yes");
return 0;
}