社区讨论
我常常追忆过去。
学术版参与者 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 条回复,欢迎继续交流。
正在加载回复...