社区讨论

我常常追忆过去。

学术版参与者 19已保存回复 21

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
21 条
当前快照
1 份
快照标识符
@mhj9sxjn
此快照首次捕获于
2025/11/03 23:03
4 个月前
此快照最后确认于
2025/11/04 06:01
4 个月前
查看原帖
https://www.luogu.com.cn/problem/P11831 求条
92 分,D 性质错了,D 性质样例错了一组询问
CPP
#include<bits/stdc++.h>
#define ll long long
#define rd read()
#define gc pa == pb && (pb = (pa = buf) + fread(buf, 1, 100000, stdin), pa == pb) ? EOF : *pa++
using namespace std;
static char buf[100000], * pa(buf), * pb(buf);
inline int read()
{
	register int x=0,s=gc;
	while(!isdigit(s))s=gc;
	while(isdigit(s))x=(x<<1)+(x<<3)+(s^48),s=gc;
	return x;
}
const int N=100005,B=300,S=B/64+1;
int n,m,q,cnt,rk,a[N],b[N],c[N],ans[B+1];
struct bit
{
	unsigned ll A[S+1];
	inline void reset(){memset(A,0,sizeof(A));}
	inline void set(int x){A[x>>6]|=1ull<<(x&63);}
	inline void flip(int x){A[x>>6]^=1ull<<(x&63);}
	inline void operator|=(const bit &b){for(int i=0;i<S;++i)A[i]|=b.A[i];}
	inline void operator^=(const bit &b){for(int i=0;i<S;++i)A[i]^=b.A[i];}
	inline void operator&=(const bit &b){for(int i=0;i<S;++i)A[i]&=b.A[i];}
	inline int w(int x){return A[x>>6]>>(x&63)&1;}
	inline int fir(int x){unsigned ll k=A[x]&-A[x];A[x]^=k;return k?(x<<6)+__lg(k):0;}
}g[N],f[N],z,W;bitset<N> is;
struct query{int x,y,l,r;};vector<query> d;vector<int> p,v[N];
inline void Swap(int x,int y){swap(b[x],b[y]),swap(c[b[x]],c[b[y]]);}
inline void get()
{
	for(auto [op,x,l,r]:d)
		if(op==3)g[l].set(cnt),g[r+1].set(cnt),f[x].set(cnt),++cnt;
		else is[x]=is[l]=1;	
	for(int i=1;i<=n;++i)for(int j:v[i])f[j]|=f[i];
	for(int i=2;i<=n;++i)g[i]^=g[i-1];p.clear();
	for(int i=1;i<=n;++i)if(is[i])p.push_back(i);
	for(int i=n;i>=1;--i)if(!is[c[i]])
	{
		z=f[c[i]],z&=g[a[c[i]]],z|=W,z^=W,W|=z;
		for(int j=0,x;j<S;++j)while(z.A[j])x=z.fir(j),ans[x]=i;
	}cnt=0;
	for(auto [op,x,l,r]:d)if(op==1)swap(a[x],a[l]);
	else if(op==2)Swap(x,l);else{
		for(int j:p)if(a[j]>=l&&a[j]<=r&&f[j].w(cnt))ans[cnt]=max(ans[cnt],b[j]);
		cout<<ans[cnt++]<<'\n';}
	d.clear(),is.reset(),W.reset(),memset(ans,0,sizeof(ans));
	for(int i=1;i<=n;++i)g[i].reset(),f[i].reset();cnt=0;
}
inline void sol()
{
	n=rd,m=rd,q=rd;
	for(int i=1;i<=m;++i)v[rd].push_back(rd);
	for(int i=1;i<=n;++i)a[i]=rd;
	for(int i=1;i<=n;++i)c[b[i]=rd]=i;
	for(int i=1,op,x,l,r;i<=q;++i)
	{
		op=rd,x=rd,l=rd;if(op==3)r=rd,++rk;
		d.push_back({op,x,l,r});
		if(d.size()>=1500||rk>=B)get(),rk=0;
	}if(rk)get(),rk=0;for(int i=1;i<=n;++i)v[i].clear();
}
signed main()
{
//	freopen("recall6.in","r",stdin);
//	freopen("outa.out","w",stdout);
	rd;int T=rd;while(T--)sol();return 0;}

回复

21 条回复,欢迎继续交流。

正在加载回复...