11.04 代码源 2024 NOIP 模拟赛 Day 1

手感最好的一集

T1

发现当序列从 \(1 \rightarrow 0\)\(0 \rightarrow 1\) 时,得到的全为 \(1\) 或全为 \(0\) 的长为 \(k\) 的区间等价于长为 \(2k\) 的合法括号序列有几种

随即推了个柿子:

\[ans=\frac{2k!}{k!(k+1)!} \]

赛时唐了,没用卡特兰数()

Code
#include<bits/stdc++.h>
#define int long long
#define ll long long
#define fd(i,a,b) for(int i=(a);i<=(b);i=-~i)
#define bd(i,a,b) for(int i=(a);i>=(b);i=~-i)
#define db(x) cout<<"DEBUG "<<#x<<" = "<<x<<endl;
using namespace std;

const int N=1e5+509,M=1e6+509,mod=998244353;

int n;
string s;
int fac[N<<1],inv[N<<1];
inline int qpow(int x,int y)
{
    int re=1;
    while(y)
    {
        if(y&1) (re*=x)%=mod;
        (x*=x)%=mod,y>>=1;
    }
    return re;
}

signed main()
{
// #define FJ
#ifdef FJ
    freopen(".in","r",stdin);
    freopen(".out","w",stdout);
#else
    // freopen("A.in","r",stdin);
    // freopen("A.out","w",stdout);
#endif
    
    ios::sync_with_stdio(0);
    cin.tie(0); cout.tie(0);

    cin>>n>>s;s=' '+s;

    fac[0]=inv[0]=1;
    fd(i,1,n<<1) fac[i]=fac[i-1]*i%mod;
    inv[n<<1]=qpow(fac[n<<1],mod-2);
    bd(i,n<<1,2) inv[i-1]=inv[i]*i%mod;

    int k=0,ans=1;
    fd(i,1,n)
    {
        k++;
        if(i<n&&s[i+1]!=s[i])
        {
            (ans*=(fac[k<<1]*inv[k]%mod*inv[k+1])%mod)%=mod;
            k=0;
        }
        if(i==n)
        {
            (ans*=(fac[k<<1]*inv[k]%mod*inv[k+1])%mod)%=mod;
        }
    }

    cout<<ans;

    return 0;
}

T2

花了大概 \(0.75h\) 回忆 \(SG\) 函数

然后码完过了第一个样例

然后一般来说带博弈论的要么是转化要么是打表

然后打表发现 \(SG_i=a_i\%(x+1)\)

写了个 \(O(n^2)\) 的润了

赛后发现用去重 \(+\) 指针的手法可以卡到 \(40\)

《手法》代码
#include<bits/stdc++.h>
#define int long long
#define ll long long
#define fd(i,a,b) for(int i=(a);i<=(b);i=-~i)
#define bd(i,a,b) for(int i=(a);i>=(b);i=~-i)
#define endl '\n'
#define db(x) cout<<"DEBUG "<<#x<<" = "<<x<<endl;
using namespace std;

#define SIZE (1<<20)
char In[SIZE],Out[SIZE],*p1=In,*p2=In,*p3=Out;
#define getchar() (p1==p2&&(p2=(p1=In)+fread(In,1,SIZE,stdin),p1==p2)?EOF:*p1++)
inline int read()
{
	int x=0,f=1;char c=getchar();
	while(c<'0'||c>'9'){if(c=='-') f=-1;c=getchar();}
	while(c>='0'&&c<='9'){x=x*10+(c-48);c=getchar();}
	return x*f;
}

const int N=5e5+509,M=1e6+509,mod=998244353;

int n,m,a[N],ans;
int b[N],tot,cnt[N],c[N],Xor[N];

signed main()
{
#define FJ
#ifdef FJ
//    freopen(".in","r",stdin);
//    freopen(".out","w",stdout);
#else
    // freopen("A.in","r",stdin);
    // freopen("A.out","w",stdout);
#endif
    
//    ios::sync_with_stdio(0);
//    cin.tie(0); cout.tie(0);

    n=read();
	
	fd(i,1,n)
	{
		a[i]=read();
		if(!c[a[i]]) c[a[i]]=++tot,b[tot]=a[i];
		cnt[c[a[i]]]^=1;
	}
	
	fd(i,1,tot) if(cnt[i]&1) a[++m]=b[i];
	sort(a+1,a+m+1);
	fd(i,1,m) Xor[i]=Xor[i-1]^a[i];
	int pos=0;
	
	fd(x,1,n)
	{
		ans=0;
		while(a[pos+1]<=x&&pos<m) ++pos;
		fd(j,pos+1,m)
			ans^=a[j]%(x+1);
		ans^=Xor[pos];
		if(ans) printf("Alice ");
		else printf("Bob ");
	}

    return 0;
}

T3

码的暴力 \(+\) 菊花图性质

Code
#include<bits/stdc++.h>
#define int long long
#define ll long long
#define fd(i,a,b) for(int i=(a);i<=(b);i=-~i)
#define bd(i,a,b) for(int i=(a);i>=(b);i=~-i)
#define endl '\n'
#define Cerr(x) cerr<<#x<<" = "<<x<<endl;
using namespace std;

const int N=5090,M=50+9,mod=1e9+7;

int n,fa[N],q[N],fais1=1;

namespace SubI
{
	bool flag=1;
	struct SP {int p[M];};
	inline bool operator<(SP x,SP y)
	{
		fd(i,1,n)
		{
			if(x.p[i]==y.p[i]) continue;
			return x.p[i]<y.p[i];
		}
		return 0;
	}
	
	SP v[3628805];
	int tot;
	
	inline bool check(int p[])
	{
		fd(i,1,n)
		{
			if(p[fa[i]]>=p[i])
				return 0;
		}
		return 1;
	}
	
	int p[N],vis[N];
	void dfs(int x)
	{
		if(x>n)
		{
			if(check(p))
			{
				tot++;
				fd(i,1,n) v[tot].p[i]=p[i];
			}
			return;
		}
		fd(i,1,n)
		{
			if(vis[i]) continue;
			vis[i]=1,p[x]=i;
			dfs(x+1);
			vis[i]=p[x]=0;
		}
	}
	
	void Main()
	{
		flag=check(q);
		dfs(1);tot++;
		fd(i,1,n) v[tot].p[i]=q[i];
		sort(v+1,v+tot+1);
		fd(i,1,tot)
		{
			bool fl=1;
			fd(j,1,n)
			{
				if(v[i].p[j]!=q[j])
				{
					fl=0;break;
				}
			}
			if(fl)
			{
				if(flag)
				{
					fd(j,1,n) cout<<q[j]<<' ';
					cout<<endl;
					cout<<i<<endl;
				}
				else
				{
					fd(j,1,n) cout<<v[i-1].p[j]<<' ';
					cout<<endl;
					cout<<i-1<<endl;
				}
				exit(0);
			}
		}
	}
}

namespace SubII
{
	int fac[N],ans=1;
	inline void pre(int n)
	{
		fac[0]=1;
		fd(i,1,n) fac[i]=fac[i-1]*i%mod;
	}
	struct ST
	{
		int c[N];
		inline void add(int x,int y=-1)
		{
			for(;x<=n;x+=(x&-x)) c[x]+=y;
		}
		inline int ask(int x)
		{
			int re=0;
			for(;x;x-=(x&-x)) re+=c[x];
			return re;
		}
	}st;
	inline void Main()
	{
		pre(n);
		fd(i,2,n) st.add(i,1);
		if(q[1]==1)
		{
			fd(i,2,n)
			{
				(ans+=(st.ask(q[i])-1)*fac[n-i])%=mod;
				st.add(q[i]);
			}
			fd(i,1,n) cout<<q[i]<<' ';cout<<endl;
			cout<<ans;
		}
		else
		{
			cout<<"1 ";
			bd(i,n,2) cout<<i<<' ';
			cout<<endl;
			cout<<fac[n-1];
		}
	}
}

signed main()
{
#define FJ
#ifdef FJ
//    freopen(".in","r",stdin);
//    freopen(".out","w",stdout);
#else
    // freopen("A.in","r",stdin);
    // freopen("A.out","w",stdout);
#endif
    
    ios::sync_with_stdio(0);
    cin.tie(0); cout.tie(0);

    cin>>n;
	fd(i,2,n) cin>>fa[i],fais1&=fa[i];
	fd(i,1,n) cin>>q[i];
	
	if(n<=10) SubI::Main();
	else if(fais1) SubII::Main();

    return 0;
}

T4

没看

总结

没什么可以总结的

T4 的暴力没码……

posted @ 2024-11-04 19:30  whrwlx  阅读(6)  评论(0编辑  收藏  举报