社区讨论

孩子不会卡常,75分求助

P12262 『STA - R9』交错参与者 4已保存回复 11

讨论操作

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

当前回复
11 条
当前快照
1 份
快照标识符
@mhjty4ir
此快照首次捕获于
2025/11/04 08:27
4 个月前
此快照最后确认于
2025/11/04 10:29
4 个月前
查看原帖
CPP
#include<bits/stdc++.h>
#define il inline
#define ui unsigned int
#define ll long long
#define ull unsigned ll
#define lll __int128
#define db double
#define ldb long double
#define pii pair<int,int>
#define vi vector<int>
#define vpii vector<pii>
#define fir first
#define sec second
#define gc getchar
#define pc putchar
#define pb push_back
#define lb lower_bound
#define ub upper_bound
#define pct __builtin_popcount
#define mst(a,x) memset(a,x,sizeof a)
#define mcp(a,b) memcpy(a,b,sizeof b)
using namespace std;
const int N=3010,INF=0x3f3f3f3f,MOD=998244353;
const ll INFll=0x3f3f3f3f3f3f3f3f;
il int rd() {int x=0,f=1; char ch=gc(); while(ch<'0'||ch>'9') {if(ch=='-') f=-1; ch=gc();} while(ch>='0'&&ch<='9') x=x*10+ch-'0',ch=gc(); return x*f;}
il ll rdll() {ll x=0; int f=1; char ch=gc(); while(ch<'0'||ch>'9') {if(ch=='-') f=-1; ch=gc();} while(ch>='0'&&ch<='9') x=x*10+ch-'0',ch=gc(); return x*f;}
il void wr(int x) {if(x==INT_MIN) return printf("-2147483648"),void(); if(x<0) return pc('-'),wr(-x); if(x<10) return pc(x+'0'),void(); wr(x/10),pc(x%10+'0');}
il void wrll(ll x) {if(x==LLONG_MIN) return printf("-9223372036854775808"),void(); if(x<0) return pc('-'),wrll(-x); if(x<10) return pc(x+'0'),void(); wrll(x/10),pc(x%10+'0');}
il void wr(int x,char *s) {wr(x),printf("%s",s);}
il void wrll(ll x,char *s) {wrll(x),printf("%s",s);}
il int vmod(int x) {return x>=MOD?x-MOD:x;}
il int vadd(int x,int y) {return vmod(x+y);}
il int vsub(int x,int y) {return vmod(x-y+MOD);}
il int vmul(int x,int y) {return 1ll*x*y%MOD;}
il int qpow(int x,int y) {int r=1; for(;y;y>>=1,x=vmul(x,x)) if(y&1) r=vmul(r,x); return r;}
il void cadd(int &x,int y) {x=vmod(x+y);}
il void csub(int &x,int y) {x=vmod(x-y+MOD);}
il void cmul(int &x,int y) {x=vmul(x,y);}
il void cmax(int &x,int y) {x<y&&(x=y);}
il void cmaxll(ll &x,ll y) {x<y&&(x=y);}
il void cmin(int &x,int y) {x>y&&(x=y);}
il void cminll(ll &x,ll y) {x>y&&(x=y);}
int n,ln,tt,q,a[N],b[N],ps[N],c[N],vs[N],as[N][N];
#define _(x,y) (x<y?as[x][y]:as[y][x])
#define rr register
void upd(int i) {
	ln=0;
	for(rr int j=1;j<=n;j++) if(a[j]==i) ps[++ln]=j;
	ps[ln+1]=n+1;
	for(rr int j=1;j<=n;j++) b[_(i,j)]--,_(i,j)=1;
	for(rr int j=0;j<=ln;j++) {
		tt=0;
		for(rr int k=ps[j]+1;k<ps[j+1];k++) if(!vs[a[k]])
			_(i,a[k])+=!!j+(j!=ln),c[++tt]=a[k],vs[a[k]]=1;
		for(rr int k=1;k<=tt;k++) vs[c[k]]=0;
	}
	for(rr int j=1;j<=n;j++) b[_(i,j)]++;
}
//#define debug
void QwQ() {
	#ifdef debug
		n=3000;
		for(int i=1;i<=n;i++) a[i]=rand()%n+1;
		q=7000;
	#else
		n=rd();
		for(int i=1;i<=n;i++) a[i]=rd();
		q=rd();
	#endif
	b[0]=n*n;
	for(int i=1;i<=n;i++) upd(i);
	for(int i=n;i;i--) if(b[i]) {wr(i,"\n"); break;}
	for(int x,y;q--;) {
		#ifdef debug
			x=rand()%n+1,y=rand()%n+1;
		#else
			x=rd(),y=rd();
		#endif 
		int p=a[x]; a[x]=y,upd(p),upd(a[x]);
		for(int i=n;i;i--) if(b[i]) {wr(i,"\n"); break;}
	}
}
signed main() {
//	freopen("in.in","r",stdin);
	#ifdef debug
		freopen("out.out","w",stdout);
	#endif
	int T=1; while(T--) QwQ();
}
极限数据本地2.4秒,主要是内存访问不连续,怎么优化?

回复

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

正在加载回复...