求助
查看原帖
求助
593791
_Catluo_楼主2024/4/28 21:44

cdq分治+摩尔投票

#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,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),putch(' '),write(args...);
    }
    void flush(){fwrite(obuf,p3-obuf,1,stdout);}
}
using namespace IO;
const int mod=998244353;
inline int Mod(int x){return x>=mod?x-mod:x;}
inline int Inc(int x,int y){return Mod(x+y);}
inline int Sub(int x,int y){return Mod(x+mod-y);}
inline int Mul(int x,int y){return 1ll*x*y%mod;}
inline int inc(int &x,int y){return x=Mod(x+y);}
inline int sub(int &x,int y){return x=Mod(x+mod-y);}
inline int mul(int &x,int y){return x=1ll*x*y%mod;}
inline int poww(int x,int y){
	int sum=1;
	while(y>0){
		if(y&1)mul(sum,x);
		x=1ll*x*x%mod;
		y>>=1;
	}
	return sum;
}
const int N=2e6+5;
int n;
int a[N],w[N];
int f[N];
vector<int>S;
struct node{
	int tree[N<<1];
	inline int lowbit(int x){return x&(-x);}
	inline void add(int x,int y){
		x+=n;
		while(x<=2*n){
			inc(tree[x],y);
			x+=lowbit(x);
		}
	}
	inline int ask(int x){
		x+=n;
		int sum=0;
		while(x){
			inc(sum,tree[x]);
			x-=lowbit(x);
		}
		return sum;
	}
}T[2];
int b[N<<1],maxn;
void sol(int l,int r){
	if(l==r)return;
	int mid=((l+r)>>1);
	sol(l,mid);
	
	for(int i=mid;i>=l;i--){
		b[a[i]]++;
		if(b[a[i]]>b[maxn]){
			if(a[i]!=maxn)S.push_back(a[i]);
			maxn=a[i];
		}
	}
	maxn=0;for(int i=l;i<=mid;i++)b[a[i]]--;
	
	
	for(int i=mid+1;i<=r;i++){
		b[a[i]]++;
		if(b[a[i]]>b[maxn]){
			if(a[i]!=maxn)S.push_back(a[i]);
			maxn=a[i];
		}
	}
	maxn=0;for(int i=mid+1;i<=r;i++)b[a[i]]--;
	
	sort(S.begin(),S.end());
	S.erase(unique(S.begin(),S.end()),S.end());
	
	int res0=0,res1=0;
	for(int i=l;i<=mid;i++)
		if(i&1)inc(res1,f[i]);
		else inc(res0,f[i]);
	for(int i=mid+1;i<=r;i++)
		if(i&1)inc(f[i],res1);
		else inc(f[i],res0);
	for(auto W:S){
		for(int i=l;i<=r;i++)w[i]=(a[i]==W?1:-1);
		for(int i=mid-1;i>=l;i--)w[i]+=w[i+1];
		for(int i=mid+2;i<=r;i++)w[i]+=w[i-1];
		for(int i=l;i<mid;i++)T[i&1].add(-w[i+1],f[i]);T[mid&1].add(0,f[mid]);
		for(int i=mid+1;i<=r;i++)sub(f[i],T[i&1].ask(w[i]-1));
		for(int i=l;i<mid;i++)T[i&1].add(-w[i+1],-f[i]);T[mid&1].add(0,-f[mid]);
	}
	
	S.clear();
	sol(mid+1,r);
}
signed main(){
	f[0]=1;
	read(n);n*=2;
	for(int i=1;i<=n;i++)read(a[i]);
	sol(0,n);
	write(f[n]);
	flush();
	return 0;
}

2024/4/28 21:44
加载中...