首先

热烈庆祝“CSP-S 2020全国开放赛前冲刺模拟训练题1”圆满结束!!!

感谢大毒瘤周指导的题目。题目还是很不错的,部分分设置的也比较合理,各种神仙随便 \(\text{AK}\) ,蒟蒻只能大呼 \(\text{NB}\) 。

Problem A

这是一道数学题。

根据周指导的题解中说明,这是一道数竞题目,但是由于我们是信竞,所以直接打一个暴力然后大胆的猜想一下就可以了。

发现这个数只能是 \(130\) 。

具体证明贴一下:

Problem B

这是一道神笔题。

我在考场上写了一个暴搜就可以过了。正解是构造 \(2\) 和 \(3\) 进制的格雷码。

所以暴搜不香吗?

代码如下:

#include<bits/stdc++.h>
using namespace std;
const int N=15,MAXN=6e4+5;
int n,m,d,maxn;
struct Data{int loc[N];};
bool operator < (const Data a,const Data b)
{
for(int i=1;i<=n;++i)
if(a.loc[i]!=b.loc[i])
return a.loc[i]<b.loc[i];
return false;
}
map<Data,bool> mp;
Data way[MAXN];
bool dfs1(Data tmp,int now)
{
if(now>=maxn)
{
for(int i=1;i<=maxn;++i)
{
for(int j=1;j<=n;++j)
printf("%d ",way[i].loc[j]);
printf("\n");
}
return true;
}
Data smp;
for(int i=1;i<=n;++i)
{
smp=tmp,smp.loc[i]++;
if(smp.loc[i]<m&&!mp[smp])
{
mp[smp]=true,way[now+1]=smp;
if(dfs1(smp,now+1)) return true;
mp[smp]=false;
}
smp=tmp,smp.loc[i]--;
if(smp.loc[i]>=0&&!mp[smp])
{
mp[smp]=true,way[now+1]=smp;
if(dfs1(smp,now+1)) return true;
mp[smp]=false;
}
}
return false;
}
void subtask1()
{
Data tmp;
for(int i=1;i<=n;++i) tmp.loc[i]=0;
mp[tmp]=true,way[1]=tmp;
dfs1(tmp,1);
}
bool dfs2(Data tmp[],int l,int r,int now)
{
if(now>=maxn)
{
for(int i=1;i<=maxn;++i)
{
for(int j=1;j<=n;++j)
printf("%d ",way[i].loc[j]);
printf("\n");
}
return true;
}
Data smp[2];int L=l,R=r;
if(now%2) R--;
else L++;
smp[(now%2)^1]=tmp[(now%2)^1];
for(int i=1;i<=n;++i)
{
smp[now%2]=tmp[now%2],smp[now%2].loc[i]++;
if(smp[now%2].loc[i]<m&&!mp[smp[now%2]])
{
mp[smp[now%2]]=true;
if(now%2) way[R]=smp[now%2];
else way[L]=smp[now%2];
if(dfs2(smp,L,R,now+1)) return true;
mp[smp[now%2]]=false;
}
smp[now%2]=tmp[now%2],smp[now%2].loc[i]--;
if(smp[now%2].loc[i]>=0&&!mp[smp[now%2]])
{
mp[smp[now%2]]=true;
if(now%2) way[R]=smp[now%2];
else way[L]=smp[now%2];
if(dfs2(smp,L,R,now+1)) return true;
mp[smp[now%2]]=false;
}
}
return false;
}
void subtask2()
{
Data tmp[2];
for(int i=1;i<=n;++i) tmp[0].loc[i]=0;
mp[tmp[0]]=true,way[1]=tmp[0];
for(int i=1;i<=n;++i) tmp[1].loc[i]=m-1;
mp[tmp[1]]=true,way[maxn]=tmp[1];
dfs2(tmp,1,maxn,2);
}
int main()
{
// freopen("B.in","r",stdin);
// freopen("B.out","w",stdout);
cin>>n>>m>>d,maxn=pow(m,n);
if(n<=6||m==2) subtask1();
else subtask2();
return 0;
}

Problem C

这是一道结论题。

如果有度数小于等于3的点,就删掉这个点(和与它相关的边),先对于剩下的图构造一种方案,然后将这个点染成与他相邻的点中出现较少的颜色。

然后你发现用这个方法是可以直接过的,所以题目必定有解。

证明这个贪心周指导的题解里也很详细,贴一下:

然后在考场上有各种神仙用奇怪的随机化贪心过去了,还有什么先 \(\text{DFS}\) 再 \(\text{BFS}\) 的神仙。我乱搞能力还是太弱……

代码如下:

#include<bits/stdc++.h>
using namespace std;
const int N=1e5+5,M=2e5+5;
int n,m;
//map<pair<int,int>,bool> mp;
struct Edge{int nxt,to;}e[M<<1];int fir[N];
void add(int u,int v,int i){e[i]=(Edge){fir[u],v},fir[u]=i;}
int deg[N],clr[N];
bool tag[N];
queue<int> q;
vector<int> ord;
int main()
{
cin>>n>>m;
for(int i=1,u,v;i<=m;++i)
{
scanf("%d%d",&u,&v);
// if(mp[make_pair(u,v)]) continue;
// mp[make_pair(u,v)]=mp[make_pair(v,u)]=true;
add(u,v,i<<1),add(v,u,i<<1|1);
deg[u]++,deg[v]++;
}
for(int i=1;i<=n;++i)
if(deg[i]<=3) q.push(i),tag[i]=true;
while(!q.empty())
{
int tmp=q.front();q.pop();
ord.push_back(tmp);//updata
for(int i=fir[tmp];i;i=e[i].nxt)
{
deg[e[i].to]--;
if(deg[e[i].to]<=3&&!tag[e[i].to])
q.push(e[i].to),tag[e[i].to]=true;
}
}
for(int i=ord.size()-1;i>=0;--i)
{
int cnt1=0,cnt2=0;
for(int j=fir[ord[i]];j;j=e[j].nxt)
cnt1+=(clr[e[j].to]==1),cnt2+=(clr[e[j].to]==2);
if(cnt1<cnt2) clr[ord[i]]=1;
else clr[ord[i]]=2;
}
for(int i=1;i<=n;++i) printf("%d ",clr[i]);
printf("\n");
return 0;
}

Problem D

这是一道套路题。

我考场上的思路是这样的,考虑我们对于一个合法的序列,如果我们交换其中两行或者两列的位置,他肯定是依旧合法的。

然后我大胆的猜测,所有的合法序列最终都一定可以变成左上方都是黑色,右下方都是白色的方案。然后我举了几个合法序列发现都对了……

然后题目就变成了问你对于所有用一条路径分割开整个矩形的方案数同时去除其中的可交换项的重复计数后的总方案数。

然后写了一个 \(O(n^3)\) 的 \(\text{DP}\) 。但是由于忘记预处理逆元了,挂了 \(20pts\) 。

考完发现自己结论是猜对的,证明贴一下:

然后发现这个东西就是斯特林数乘上一个阶乘,是可以 \(O(n^2)\) 求的(虽然我现在还不是很会)。然后用一个多项式乘法就可以满分了(我不会)。

\(70pts\) 代码如下;

#include<bits/stdc++.h>
using namespace std;
#define Lint long long
const int N=2005;
const Lint MOD=998244353;
int n,m;
Lint fac[N];
Lint f[N][N][2];
Lint sum[N][N][2];
inline int ksm(Lint x,int k)
{
Lint res=1;
for(;k;k>>=1,x=x*x%MOD)
if(k&1)res=res*x%MOD;
return res;
}
int main()
{
cin>>n>>m,fac[0]=1;
for(int i=1;i<=max(n,m);++i) fac[i]=fac[i-1]*i%MOD;
f[0][0][0]=f[0][0][1]=fac[n]*fac[m]%MOD;
for(int i=1;i<=max(n,m);++i) fac[i]=ksm(fac[i],MOD-2);
for(int i=0;i<=n;++i)
{
for(int j=0;j<=m;++j)
{
for(int k=0;k<i;++k)
f[i][j][0]+=f[k][j][1]*fac[i-k]%MOD,f[i][j][0]%=MOD;
for(int k=0;k<j;++k)
f[i][j][1]+=f[i][k][0]*fac[j-k]%MOD,f[i][j][1]%=MOD;
// printf("%d %d %lld %lld\n",i,j,f[i][j][0],f[i][j][1]);
}
}
printf("%lld\n",(f[n][m][0]+f[n][m][1])%MOD);
return 0;
}

XJOI contest 1590的更多相关文章

  1. XJOI contest 1592

    首先 热烈庆祝"CSP-S 2020全国开放赛前冲刺模拟训练题2"圆满结束!!! 感谢大毒瘤颗粒囊的题目.题目还是很不错的,部分分设置的不合理,各种神仙随便 AK ,蒟蒻只能爆零. ...

  2. XJOI 3578 排列交换/AtCoder beginner contest 097D equal (并查集)

    题目描述: 你有一个1到N的排列P1,P2,P3...PN,还有M对数(x1,y1),(x2,y2),....,(xM,yM),现在你可以选取任意对数,每对数可以选取任意次,然后对选择的某对数(xi, ...

  3. [contest 781] 9.6

    [contest 781] 9.6 - XJOI czx的温暖题... T1 军训

  4. [contest 782] 9.7

    [contest 782] 9.7 - XJOI 个人觉得温暖题啊,,,可是卡毛空间呀!!! T1 传送

  5. Programming Contest Problem Types

        Programming Contest Problem Types Hal Burch conducted an analysis over spring break of 1999 and ...

  6. hdu 4946 2014 Multi-University Training Contest 8

    Area of Mushroom Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others) ...

  7. 2016 Multi-University Training Contest 2 D. Differencia

    Differencia Time Limit: 10000/10000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)Tot ...

  8. 2016 Multi-University Training Contest 1 G. Rigid Frameworks

    Rigid Frameworks Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others) ...

  9. hdu-5988 Coding Contest(费用流)

    题目链接: Coding Contest Time Limit: 2000/1000 MS (Java/Others)     Memory Limit: 65536/65536 K (Java/Ot ...

随机推荐

  1. spring mvc 基础知识

    spring mvc 在web.xml中的配置: 例子: <?xml version="1.0" encoding="UTF-8"?> <we ...

  2. cephfs元数据池故障的恢复

    前言 cephfs 在L版本已经比较稳定了,这个稳定的意义个人觉得是在其故障恢复方面的成熟,一个文件系统可恢复是其稳定必须具备的属性,本篇就是根据官网的文档来实践下这个恢复的过程 实践过程 部署一个c ...

  3. ceph使用memdisk做journal

    记得在很久很久以前,ceph当时的版本是有提供使用内存做journal的配置的,当时是使用的tmpfs,但是现在的版本在搜资料的时候,发现关于这个的没怎么找到资料,邮件列表里面有人有提到怎么做,看了下 ...

  4. SpringSecurity之授权

    SpringSecurity之授权 目录 SpringSecurity之授权 1. 写在前面的话 2. web授权 1. 建库 2. 添加查询权限的接口 3. 前端页面的编写 4. SpringSec ...

  5. Hadoop大数据平台之Zookeeper搭建

    环境:CentOS 7.4 (1708  DVD) 工具:MobaXterm 1. 使用xftp将hadoop上传到/usr/local目录下,将其解压并重命名. 2. 修改环境变量并source. ...

  6. 新鲜出炉!面试90%会被问到的Java多线程面试题,史上最全系列!

    前言 最近很多粉丝朋友私聊我说能不能给整理出一份多线程面试题出来,说自己在最近的面试中老是被问到这一块的问题被问的很烦躁,前一段时间比较忙没时间回私信,前两天看到私信我也是赶紧花了两天给大家整理出这一 ...

  7. CA证书与https讲解

    最近面试问到这个问题,之前了解过但答的不是很好,再补充补充一下https方面的知识. 备注:以下非原创文章. CA证书与https讲解 1.什么是CA证书. ◇ 普通的介绍信 想必大伙儿都听说过介绍信 ...

  8. 使用Beyond Compare对比大篇幅文件的小技巧

    我们在编辑较大篇幅的文章时,无可避免地要经过多次的修改.有时候修改的版本过多时,我们很可能就会记不清最新版的文章对比上一版的文章,究竟修改了哪些地方.但有了Beyond Compare(Windows ...

  9. JUC并发工具包之CountDownLatch

    1.介绍 本文将介绍CountDownLatch并给出实践中的几个例子,通过使用CountDownLatch我们可以让一个线程阻塞直到其他一个或多个线程执行完成. A synchronization ...

  10. 聊聊 elasticsearch 之分词器配置 (IK+pinyin)

    系统:windows 10 elasticsearch版本:5.6.9 es分词的选择 使用es是考虑服务的性能调优,通过读写分离的方式降低频繁访问数据库的压力,至于分词的选择考虑主要是根据目前比较流 ...