QOJ.ac

QOJ

ID题目提交者结果用时内存语言文件大小提交时间测评时间
#335504#1395. Trzy drogi [A]qwqwfCompile Error//C++144.6kb2024-02-23 15:12:172024-02-23 15:12:18

Judging History

你现在查看的是最新测评结果

  • [2024-02-23 15:12:18]
  • 评测
  • [2024-02-23 15:12:17]
  • 提交

answer

#pragma GCC target("sse,sse2,sse3,ssse3,sse4,popcnt,abm,mmx,avx,avx2")
#pragma GCC optimize("Ofast","unroll-loops","inline")
#include<bits/stdc++.h>
#define ll long long
//#define int ll
#define ull unsigned ll
#define pii pair<int,int>
#define pb push_back
#define fi first
#define se second
#define MP make_pair
#define umap unordered_map<ull,ll>
#define pq priority_queue<pii>
using namespace std;
const int N=3e5+60,M=5e5+20;
mt19937 rnd(time(0));
int n,m,sm;ll ans;
struct Edge{int u,v,c;}e[M];
int fa[N],Id[N],p[N],dep[N],dfn[N],id[N],up[N],dn[N],dfc;ull w[M],v[M];bool cut[M],on[M],vis[N];
vector<pii> g[N];
pq rt[N],rt2[N];umap mp[N],st;
inline ll S1(int x){return 1ll*x*(x-1)/2;}
inline ll S2(int x){return 1ll*x*(x-1)*(x-2)/6;}
inline int find(int x){return x==fa[x]?fa[x]:fa[x]=find(fa[x]);}
inline ll pw(ll x){return x*x;}
inline void get(umap &u,int x,int y){if(x&&y&&u.count(w[x]^w[y])) ans+=u[w[x]^w[y]]*e[x].c*e[y].c;}
inline void clear(pq &x){while(!x.empty()) x.pop();}
void merge(umap &x,umap &y){
	if(x.size()<y.size()) x.swap(y);
	for(auto z:y) x[z.fi]+=z.se;y.clear();
}
void merge(pq &x,pq &y){
	if(x.size()<y.size()) x.swap(y);
	while(!y.empty()) x.push(y.top()),y.pop();
}
inline void pop(pq &x,int val){while(!x.empty()&&dep[e[x.top().se].v]>=val) x.pop();}
namespace Init{
	inline void add(int u,int v,int id){g[u].pb(MP(v,id)),g[v].pb(MP(u,id));}
	void re(){
		int nn=n,mm=m;n=m=sm=0;
		for(int i=1;i<=nn;i++) fa[i]=i,p[i]=0;
		for(int i=1;i<=mm;i++) if(cut[i]) fa[find(e[i].u)]=find(e[i].v);
		for(int i=1;i<=mm;i++) cut[i]=0;
		for(int i=1;i<=nn;i++) if(i==find(i)) p[i]=++n;
		for(int i=1;i<=mm;i++){
			int u=p[find(e[i].u)],v=p[find(e[i].v)]; 
			if(u!=v) e[++m]=(Edge){u,v,e[i].c},sm+=e[i].c;
		}
	}
	void dfs(int u){
		vis[u]=1;id[dfn[u]=++dfc]=u;
		for(pii x:g[u]) if(!vis[x.fi]) dep[x.fi]=dep[u]+1,Id[x.fi]=x.se,dfs(x.fi),on[x.se]=1;
	}
	void getw(){for(int i=n,u=id[n];i;i--,u=id[i]) for(pii x:g[u]) w[x.se]=v[x.fi],v[u]^=v[x.fi];}
	void init(){
		for(int i=1;i<=n;i++) v[i]=dfn[i]=id[i]=dep[i]=vis[i]=0,g[i].clear(); 
		for(int i=1;i<=m;i++) w[i]=on[i]=0;dfc=0;
		for(int i=1;i<=m;i++) add(e[i].u,e[i].v,i);
		dfs(1);
		for(int i=1;i<=n;i++) g[i].clear();
		for(int i=1;i<=m;i++){
			if(on[i]){
				if(dep[e[i].u]+1==dep[e[i].v]) g[e[i].u].pb(MP(e[i].v,i));
				else g[e[i].v].pb(MP(e[i].u,i));
			}
			else w[i]=rnd(),v[e[i].u]^=w[i],v[e[i].v]^=w[i];//u -1,v +1
		}
		getw();
	}
}
struct data{
	ll a[3];
	data(){}
	data(ll x,ll y,ll z){a[0]=x,a[1]=y,a[2]=z;}
}s[N];
inline data operator +(data x,data y){x.a[0]+=y.a[0];x.a[1]+=y.a[1];x.a[2]+=y.a[2];return x;}
inline data operator +(data x,int y){x.a[0]+=1;x.a[1]+=y;x.a[2]+=1ll*y*y;return x;}
inline data operator -(data x,int y){x.a[0]-=1;x.a[1]-=y;x.a[2]-=1ll*y*y;return x;}
void sv(){
	Init::init();umap t;
	for(int i=1;i<=m;i++) if(!w[i]) --sm,ans+=S1(sm),cut[i]=1;else t[w[i]]++;
	for(int i=1;i<=m;i++){
		if(!t.count(w[i])) cut[i]=1;
		else e[i].c=t[w[i]],ans+=S1(e[i].c)*(sm-e[i].c)+S2(e[i].c),t.erase(w[i]);
	}
	Init::re();
}
void dfs1(int u){
	for(pii x:g[u]) dfs1(x.fi),s[u]=s[u]+s[x.fi];
	if(s[u].a[0]==2) ans+=e[Id[u]].c*(pw(s[u].a[1])-s[u].a[2])/2;
}
void dfs2(int u){
	for(pii x:g[u]) dfs2(x.fi),merge(rt[u],rt[x.fi]);
	pop(rt[u],dep[u]);
	if(!rt[u].empty()) up[u]=rt[u].top().se;
}
void dfs3(int u){
	get(st,Id[u],up[u]);
	if(Id[u]) st[w[Id[u]]]+=e[Id[u]].c;
	for(pii x:g[u]) dfs3(x.fi);
	if(Id[u]) st[w[Id[u]]]-=e[Id[u]].c;
}
void dfs4(int u){
	for(pii x:g[u]) dfs4(x.fi),merge(rt[u],rt[x.fi]),merge(rt2[u],rt2[x.fi]),merge(mp[u],mp[x.fi]);
	pop(rt[u],dep[u]),pop(rt2[u],dep[u]);
	if(Id[u]){
		if(!rt[u].empty()) get(mp[u],Id[u],rt[u].top().se);
		if(!rt2[u].empty()) get(mp[u],Id[u],rt2[u].top().se);
		mp[u][w[Id[u]]]+=e[Id[u]].c;
	}
}
signed main(){
	ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
	cin>>n>>m;sm=m;
	for(int i=1;i<=n;i++) fa[i]=i;
	for(int i=1;i<=m;i++) cin>>e[i].u>>e[i].v,e[i].c=1;
	sv();
	while(n>1){
		Init::init();
		for(int i=1;i<=n;i++) s[i].a[0]=s[i].a[1]=s[i].a[2]=0; 
		for(int i=1;i<=m;i++) if(dep[e[i].u]<dep[e[i].v]) swap(e[i].u,e[i].v);
		for(int i=1;i<=m;i++) if(!on[i]) s[e[i].u]=s[e[i].u]+e[i].c,s[e[i].v]=s[e[i].v]-e[i].c;
		dfs1(1);
		for(int i=1;i<=n;i++) clear(rt[i]);st.clear();
		for(int i=1;i<=m;i++) if(!on[i]) rt[e[i].u].push(MP(dep[e[i].v],i));
		dfs2(1),dfs3(1);
		for(int i=1;i<=n;i++) clear(rt[i]),clear(rt2[i]),mp[i].clear();
		for(int i=1;i<=m;i++) if(!on[i]) rt[e[i].u].push(MP(dfn[e[i].u],i)),rt2[e[i].u].push(MP(-dfn[e[i].u],i));
		dfs4(1);
		for(int i=1;i<=m;i++) if(!on[i]) cut[i]=1;
		Init::re(); 
	}
	cout<<ans<<'\n';
	return 0;
}

詳細信息

In file included from /usr/include/c++/13/string:43,
                 from /usr/include/c++/13/bitset:52,
                 from /usr/include/x86_64-linux-gnu/c++/13/bits/stdc++.h:52,
                 from answer.code:3:
/usr/include/c++/13/bits/allocator.h: In destructor ‘std::_Vector_base<std::pair<int, int>, std::allocator<std::pair<int, int> > >::_Vector_impl::~_Vector_impl()’:
/usr/include/c++/13/bits/allocator.h:184:7: error: inlining failed in call to ‘always_inline’ ‘std::allocator< <template-parameter-1-1> >::~allocator() noexcept [with _Tp = std::pair<int, int>]’: target specific option mismatch
  184 |       ~allocator() _GLIBCXX_NOTHROW { }
      |       ^
In file included from /usr/include/c++/13/vector:66,
                 from /usr/include/c++/13/queue:63,
                 from /usr/include/x86_64-linux-gnu/c++/13/bits/stdc++.h:157:
/usr/include/c++/13/bits/stl_vector.h:133:14: note: called from here
  133 |       struct _Vector_impl
      |              ^~~~~~~~~~~~