分治做法求卡常
查看原帖
分治做法求卡常
754502
_AyachiNene楼主2024/12/10 20:15
#include<bits/stdc++.h>
using namespace std;
namespace IO
{
	char buff[1<<21],*p1=buff,*p2=buff;
	char getch(){return p1==p2&&(p2=((p1=buff)+fread(buff,1,1<<21,stdin)),p1==p2)?EOF:*p1++;}
	template<typename T>void read(T &x){char ch=getch();int fl=1;x=0;while(ch>'9'||ch<'0'){if(ch=='-')fl=-1;ch=getch();}while(ch<='9'&&ch>='0'){x=x*10+ch-48;ch=getch();}x*=fl;}
	template<typename T>void read_s(T &x){x="";char ch=getch();while(ch<'a'||ch>'z')ch=getch();while(ch>='a'&&ch<='z'){x+=ch;ch=getch();}}
	template<typename T,typename ...Args>void read(T &x,Args& ...args){read(x);read(args...);}
	char obuf[1<<21],*p3=obuf;
	void putch(char ch) {if(p3-obuf<(1<<21))*p3++=ch;else fwrite(obuf,p3-obuf,1,stdout),p3=obuf,*p3++=ch;}
	char ch[100];
	template<typename T>void write(T x) {if(!x)return putch('0');if(x<0)putch('-'),x*=-1;int top=0;while(x)ch[++top]=x%10+48,x/=10;while(top)putch(ch[top]),top--;}
	template<typename T,typename ...Args>void write(T x,Args ...args) {write(x);write(args...);}
	void put(string s){for(int i=0;i<s.size();i++)putch(s[i]);}
	void flush(){fwrite(obuf,p3-obuf,1,stdout);}
}
using namespace IO;
const int mod=998244353;
int n,a[1000005];
int f[1000005];
vector<int>w(45);
int cnt[1000005],vis[1000005];
int sum[1000005],suf[1000005];
int t[2][2000005];
inline void add(int &x,int v){x+=v;if(x<0)x+=mod;if(x>=mod)x-=mod;}
const int V=1e6;
void solve(int l,int r)
{
	if(l==r) return;
	int mid=l+r>>1;
	solve(l,mid);
	w.clear();
	for(int i=l;i<=r;i++) cnt[a[i]]=vis[a[i]]=sum[i]=suf[i]=0;
	for(int i=-(r-l+1);i<=r-l+1;i++) t[0][i+V]=t[1][i+V]=0;
	int s[2];s[0]=s[1]=0;
	for(int i=mid;i>=l;i--)
	{
		add(s[i&1],f[i]);
		++cnt[a[i]];
		if(!vis[a[i]]&&cnt[a[i]]>(mid-i+1)/2) w.push_back(a[i]),vis[a[i]]=1;  
	}
	for(int i=l;i<=mid;i++) cnt[a[i]]=0;
	for(int i=mid+1;i<=r;i++)
	{
		add(f[i],s[i&1]);
		++cnt[a[i]];
		if(!vis[a[i]]&&cnt[a[i]]>(i-mid)/2) w.push_back(a[i]),vis[a[i]]=1; 
	}
	for(int x=0;x<w.size();x++)
	{
		for(int i=mid;i>=l;i--) suf[i]=suf[i+1]+(a[i]==w[x]?1:-1),add(t[i&1][V+suf[i+1]],f[i]);
		for(int j=0;j<=1;j++)
			for(int i=r-l;i>=(-r-l+1);i--) add(t[j][i+V],t[j][i+1+V]);
		for(int i=mid+1;i<=r;i++) sum[i]=sum[i-1]+(a[i]==w[x]?1:-1),add(f[i],-t[i&1][-sum[i]+V+1]);
		for(int i=-(r-l+1);i<=r-l+1;i++) t[0][i+V]=t[1][i+V]=0;
	}
	solve(mid+1,r); 
}
int main()
{
//	freopen(".in","r",stdin);
//	freopen(".out","w",stdout);
	read(n);n<<=1;
	for(int i=1;i<=n;i++) read(a[i]);
	f[0]=1;
	solve(0,n);
//	for(int i=1;i<=n;i++) cout<<f[i]<<" ";
	write(f[n]);
	flush();
	return 0;
}
2024/12/10 20:15
加载中...