缩点板子求助
  • 板块P2194 HXY烧情侣
  • 楼主wxh666
  • 当前回复2
  • 已保存回复2
  • 发布时间2023/9/3 13:10
  • 上次更新2023/11/2 23:14:35
查看原帖
缩点板子求助
342494
wxh666楼主2023/9/3 13:10

提交记录

#include<bits/stdc++.h>
using namespace std;
namespace wxh666{
	#define getchar getchar_unlocked
	#define putchar putchar_unlocked
	#define f(a,b,c) for(int a=b;a<=c;a++)
	#define ff(a,b,c) for(int a=b;a>=c;a--)
	#define g(x) f(i,1,x)
	template<typename T>
	inline void read(T &ans)
	{
		char ch=getchar();int f=1;ans=0;
		for(;!isdigit(ch);ch=getchar()) ch=='-'?f=-1:f=1;
		for(;isdigit(ch);ch=getchar()) ans=(ans<<3)+(ans<<1)+(ch&15);
		ans*=f;
		return;
	}
	template<typename T,typename ...Args>
	inline void read(T &tmp,Args &...tmps){read(tmp);read(tmps...);}
	inline int read()
	{
		char ch=getchar();int f=1,ans=0;
		for(;!isdigit(ch);ch=getchar()) ch=='-'?f=-1:f=1;
		for(;isdigit(ch);ch=getchar()) ans=(ans<<3)+(ans<<1)+(ch&15);
		return f*ans;
	}
	#define in read()
};using namespace wxh666;
namespace lsq {
    typedef int lsqxx;
    struct lq {
        struct lqbz {
            lsqxx v,w,nxt;
        } e[1000005];
        lsqxx h[100005],cnt;
        inline void add(lsqxx u,lsqxx v,lsqxx w=1) {
            e[++cnt].v=v;
            e[cnt].w=w;
            e[cnt].nxt=h[u];
            h[u]=cnt;
        }
    void erase() {cnt=0;memset(h,0,sizeof(h));return;}
    #define F(z,u) for(int j=z.h[u],v=z.e[j].v,w=z.e[j].w;j;j=z.e[j].nxt,v=z.e[j].v,w=z.e[j].w)
    }q;
};
using namespace lsq;
int n,m;
int w[100005];
int x,y;
int low[100005],dfn[100005],dfns,scc;
int dis[100005],vis[100005],bs[100005],sz[100005];
stack<int>s;
void tarjan(int t)
{
    low[t]=dfn[t]=++dfns;s.push(t);vis[t]=dis[t]=1;
    F(q,t)
    {
        if(!dfn[v]) tarjan(v),low[t]=min(low[t],low[v]);
        else if(dis[v]) low[t]=min(low[t],dfn[v]);
    }
    if(dfn[t]==low[t])
    {
        ++scc;int k;
        do{
            bs[k=s.top()]=scc;++sz[scc];
            low[k]=t,dis[k]=0;s.pop();
        }while(k!=t);
    }
}
int cnt[100005],cnts[100005],ans,anss=1;
const int mod=1e9+7;
int main()
{
    cin>>n;
    g(n) w[i]=in;
    cin>>m;
    g(m) read(x,y),q.add(x,y);
    g(n) if(!dfn[i]) tarjan(i);
    g(scc) cnt[i]=0x7f7f7f7f;
    g(n)
		if(cnt[bs[i]]>w[i])
			cnt[bs[i]]=w[i],cnts[i]=1;
		else if(cnt[bs[i]]==w[i])
			cnts[bs[i]]++;
    g(scc) ans+=cnt[bs[i]],anss=(anss*cnts[i])%mod;
    cout<<ans<<" "<<anss<<endl;
	return 0;
}
2023/9/3 13:10
加载中...