社区讨论
追忆失败求卡常
P11831[省选联考 2025] 追忆参与者 4已保存回复 4
讨论操作
快速查看讨论及其快照的属性,并进行相关操作。
- 当前回复
- 4 条
- 当前快照
- 1 份
- 快照标识符
- @mmc0tn1a
- 此快照首次捕获于
- 2026/03/04 20:36 6 天前
- 此快照最后确认于
- 2026/03/05 16:20 5 天前
块长调了半天,现在这个块长第 23 个点能跑 9.5s。
加上了大部分可能有用的优化但还是过不去,怀疑复杂度假了。
求帮调。
Info
CPP#include<bits/stdc++.h>
#include<immintrin.h>
#define inf 0x3f3f3f3f
#define infll 0x3f3f3f3f3f3f3f3fll
using namespace std;
#define SIZ 1568
struct bitst {
static constexpr int SZ = SIZ;
alignas(32) uint64_t a[SZ];
void reset() {
memset(a, 0, sizeof(a));
}
void set(int x) {
a[x >> 6] |= 1ull << (x & 63);
}
void flip(int x) {
a[x >> 6] ^= 1ull << (x & 63);
}
int val(int x) {
return (a[x >> 6] >> (x & 63)) & 1;
}
void operator|=(const bitst &b) {
for (int i=0;i<SZ;i+=4) {
__m256i x = _mm256_load_si256((__m256i*)(a+i));
__m256i y = _mm256_load_si256((__m256i*)(b.a+i));
__m256i z = _mm256_or_si256(x,y);
_mm256_store_si256((__m256i*)(a+i),z);
}
}
void operator^=(const bitst &b) {
for (int i=0;i<SZ;i+=4) {
__m256i x = _mm256_load_si256((__m256i*)(a+i));
__m256i y = _mm256_load_si256((__m256i*)(b.a+i));
__m256i z = _mm256_xor_si256(x,y);
_mm256_store_si256((__m256i*)(a+i),z);
}
}
void operator&=(const bitst &b) {
for (int i=0;i<SZ;i+=4) {
__m256i x = _mm256_load_si256((__m256i*)(a+i));
__m256i y = _mm256_load_si256((__m256i*)(b.a+i));
__m256i z = _mm256_and_si256(x,y);
_mm256_store_si256((__m256i*)(a+i),z);
}
}
};
#ifdef ONLINE_JUDGE
#define getchar getchar_unlocked
#define putchar putchar_unlocked
#endif
template <typename Tp> static inline void read(Tp&x){
int f=1;x=0;char c=getchar();
while(c<'0'||c>'9') f=(c=='-'?-f:f),c=getchar();
while(c>='0'&&c<='9') x=(x<<1)+(x<<3)+(c^48),c=getchar();
x*=f;
}
template <typename Tp,typename...Ts> static inline void read(Tp&x,Ts&...Args){read(x),read(Args...);}
template <typename Tp> static inline void print(Tp x){
if(x<0) putchar('-'),x=-x;
if(x<=9) putchar(x^48);
else print(x/10),putchar((x%10)^48);
}
template <typename Tp,typename...Ts> static inline void print(Tp x,Ts ...Args){print(x),putchar('\n'),print(Args...);}
struct edge{int to,nxt;}e[200010];int head[100010],ecnt=1;
static inline void addedge(int x,int y){e[ecnt]={y,head[x]},head[x]=ecnt++;}
int n,m,s;
// bitset<100010> bts[100010];
bitst bts[100010];
int a[100010],b[100010];
int rnka[100010];
const int B1=4096,B2=5250;
int OPT[200010],X[200010],Y[200010],Z[200010];
// struct operations{
// int opt;
// int x,y,z;
// }q[200010];
bool edited[100010];
int tmp[100010],tmp_siz;
int dp[100010];
int Ans[200010];
int main(){
// freopen("..\\samples\\P11831_23.in","r",stdin);
// freopen("..\\samples\\xxx.out","w",stdout);
// freopen("xxx.in","r",stdin);
// freopen("xxx.out","w",stdout);
// cin.tie(0)->sync_with_stdio(false);
int c,T;read(c,T);
while(T--){
read(n,m,s);
for(int i=1;i<=m;i++){
int x,y;read(x,y);
addedge(y,x);
}
// for(int i=1;i<=n;i++) bts[i][i]=true;
for(int i=1;i<=n;i++) bts[i].set(i);
for(int x=n;x>=1;x--) for(int i=head[x],y=e[i].to;i;i=e[i].nxt,y=e[i].to) bts[y]|=bts[x];
for(int i=1;i<=n;i++) read(a[i]),rnka[a[i]]=i;
for(int i=1;i<=n;i++) read(b[i]);
for(int i=1;i<=s;i++){
read(OPT[i],X[i],Y[i]);
if(OPT[i]==3) read(Z[i]);
}
for(int ql=1,qr=min(ql+B2-1,s);ql<=s;ql+=B2,qr=min(ql+B2-1,s)){
for(int i=ql;i<=qr;i++) if(OPT[i]!=3) edited[X[i]]=edited[Y[i]]=true;
for(int i=1;i<=n;i++) if(edited[i]) tmp[++tmp_siz]=i;
for(int al=1,ar=min(al+B1-1,n);al<=n;al+=B1,ar=min(al+B1-1,n)){
for(int i=al;i<=ar;i++) if(!edited[rnka[i]]) dp[rnka[i]]=b[rnka[i]];
for(int x=n;x>=1;x--) for(int i=head[x],y=e[i].to;i;i=e[i].nxt,y=e[i].to) dp[y]=max(dp[y],dp[x]);
for(int i=ql;i<=qr;i++) if(OPT[i]==3&&Y[i]<=al&&ar<=Z[i]) Ans[i]=max(Ans[i],dp[X[i]]);
for(int i=1;i<=n;i++) dp[i]=0;
}
for(int i=ql;i<=qr;i++){
if(OPT[i]!=3) continue;
int l_end=(Y[i]-1)/B1*B1+B1,r_begin=(Z[i]-1)/B1*B1+1;
if(l_end>r_begin){
// for(int p=Y[i];p<=Z[i];p++) if(bts[X[i]][rnka[p]]&&!edited[rnka[p]]) Ans[i]=max(Ans[i],b[rnka[p]]);
for(int p=Y[i];p<=Z[i];p++) if(bts[X[i]].val(rnka[p])&&!edited[rnka[p]]) Ans[i]=max(Ans[i],b[rnka[p]]);
}else{
// for(int p=Y[i];p<=l_end;p++) if(bts[X[i]][rnka[p]]&&!edited[rnka[p]]) Ans[i]=max(Ans[i],b[rnka[p]]);
for(int p=Y[i];p<=l_end;p++) if(bts[X[i]].val(rnka[p])&&!edited[rnka[p]]) Ans[i]=max(Ans[i],b[rnka[p]]);
// for(int p=r_begin;p<=Z[i];p++) if(bts[X[i]][rnka[p]]&&!edited[rnka[p]]) Ans[i]=max(Ans[i],b[rnka[p]]);
for(int p=r_begin;p<=Z[i];p++) if(bts[X[i]].val(rnka[p])&&!edited[rnka[p]]) Ans[i]=max(Ans[i],b[rnka[p]]);
}
}
for(int i=ql;i<=qr;i++){
if(OPT[i]==1) swap(a[X[i]],a[Y[i]]),swap(rnka[a[X[i]]],rnka[a[Y[i]]]);
else if(OPT[i]==2) swap(b[X[i]],b[Y[i]]);
// else if(OPT[i]==3) for(int p=1,x=tmp[p];p<=tmp_siz;p++,x=tmp[p]) if(bts[X[i]][x]&&Y[i]<=a[x]&&a[x]<=Z[i]) Ans[i]=max(Ans[i],b[x]);
else if(OPT[i]==3) for(int p=1,x=tmp[p];p<=tmp_siz;p++,x=tmp[p]) if(bts[X[i]].val(x)&&Y[i]<=a[x]&&a[x]<=Z[i]) Ans[i]=max(Ans[i],b[x]);
}
for(int i=1;i<=n;i++) edited[i]=false;
tmp_siz=0;
}
for(int i=1;i<=s;i++) if(OPT[i]==3) print(Ans[i]),putchar(0xa);
ecnt=1;
for(int i=1;i<=n;i++) head[i]=0,bts[i].reset();
for(int i=1;i<=m;i++) Ans[i]=0;
}
# ifdef TakanashiHoshino
cerr<<"\nUsed time: "<<clock()*1.0/CLOCKS_PER_SEC<<"s.\n";
# endif
return 0;
}
回复
共 4 条回复,欢迎继续交流。
正在加载回复...