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 的暴力没码……
本文来自博客园,作者:whrwlx,转载请注明原文链接:https://www.cnblogs.com/whrwlx/p/18526026