MnZn求助,可持久化线段树 + 哈希 悬赏 1 个关注。
查看原帖
MnZn求助,可持久化线段树 + 哈希 悬赏 1 个关注。
197648
封禁用户楼主2022/11/20 22:06
#include <bits/stdc++.h>
using namespace std;
template<typename T>inline void read(register T &x)
{
	register T p = 1,num = 0;
	char c = getchar();
	while(c < '0'||c > '9')
	{
		if(c == '-') p = -p;
		c = getchar();
	}
	while('0' <= c&&c <= '9')
	{
		num = (num<<3)+(num<<1)+(c^48);
		c = getchar();
	}
	x = p * num;
}
template<typename T>inline void write(register T x)
{
	if(x < 0) putchar('-'),x = -x;
	if(x > 9) write(x/10);
	putchar(x%10+48);
}
#define D(i,a,b) for(register int i=a;i>=b;--i)
#define F(i,a,b) for(register int i=a;i<=b;++i)
#define ll long long
#define N 200010
const int mod = 1e9 + 7;
int Q[N],val[N],ans[N],rt[N],n,m,qt;
struct node
{
	#define ls u<<1
	#define rs u<<1|1
	#define mid (l+r)/2
	unsigned ll a[N<<5];
	int L[N<<5],R[N<<5]; 
	int num;
	node()
	{
		num = 1;
	}
	inline void pushup(int u)
	{
		a[u] = 114514ull * a[L[u]] + a[R[u]]; 
	}
	int update(int u,int v,int l,int r,int x)
	{
		if(!u) u = ++num;
		if(l == r)
		{
			a[u] = a[v] + 1ull*x*x*x+x*x+2*x+20080520;	
			return u;
		}
		if(x <= mid) L[u] = update(L[u],v,l,mid,x),R[u] = R[v];
		else R[u] = update(R[u],v,mid+1,r,x),L[u] = L[v];		
		pushup(u); 
		return u;
	} 
	int cmp(int u,int v,int l,int r)// 0 u 大   1 v 大   2 一样大 
	{
		if(a[u] == a[v]) return 2;
		if(a[u]&&!a[v]) return 1;
		if(!a[u]&&a[v]) return 0;
		if(l == r) return 2;
		int x = cmp(L[u],L[v],l,mid);
		if(x == 2) return cmp(R[u],R[v],mid+1,r);
		return x;
	}
	void check(int u,int l,int r)
	{
		if(!u) return;
		if(l == r)
		{
			if(a[u]) ans[l] = 1;
			return;
		}
		check(L[u],l,mid);
		check(R[u],mid+1,r);
	}
}tree;
struct edge
{
	int v,id;
	bool friend operator<(const edge &X,const edge &Y) {return val[X.id] > val[Y.id];}
};
vector<edge> g[N];
struct cmp
{
	bool operator ()(const int x,const int y)
	{
		return tree.cmp(rt[x],rt[y],1,m);   
	}
};
bitset<N> vis;
int main()
{
	read(n),read(m),read(qt);
	F(i,1,m)
	{
		int x,y;
		read(x),read(y);
		g[x].push_back((edge){y,i});
	}
	int cnt = qt;
	F(i,1,qt)
	{
		read(Q[i]);
		if(!val[Q[i]]) val[Q[i]] = ++cnt;
	}
	F(i,1,m)
		if(!val[i])
			val[i] = ++cnt;
	F(i,1,n) sort(g[i].begin(),g[i].end());
	priority_queue<int,vector<int>,cmp> q;	
	q.push(1);
	rt[1] = 1;
	while(q.size())
	{
		int u = q.top();
		q.pop();
		if(vis[u]) continue;
		vis[u] = 1;
		for(auto p:g[u])
		{
			int v = p.v,id = val[p.id];
			if(vis[v]) continue;
			int prt = 0;
			prt = tree.update(prt,rt[u],1,m,id);
			if(!rt[v]) rt[v] = prt;
			else
			{
				if(!tree.cmp(prt,rt[v],1,m)) rt[v] = prt;
			}
			q.push(v);
		}
	}
	tree.check(rt[n],1,m);
	F(i,1,qt)
	{
		if(ans[Q[i]]) putchar('0');
		else putchar('1');
		ans[Q[i]] = 1;
		putchar('\n');
	}
	return 0;
}
2022/11/20 22:06
加载中...