XJOI contest 1590
首先
热烈庆祝“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的更多相关文章
- XJOI contest 1592
首先 热烈庆祝"CSP-S 2020全国开放赛前冲刺模拟训练题2"圆满结束!!! 感谢大毒瘤颗粒囊的题目.题目还是很不错的,部分分设置的不合理,各种神仙随便 AK ,蒟蒻只能爆零. ...
- XJOI 3578 排列交换/AtCoder beginner contest 097D equal (并查集)
题目描述: 你有一个1到N的排列P1,P2,P3...PN,还有M对数(x1,y1),(x2,y2),....,(xM,yM),现在你可以选取任意对数,每对数可以选取任意次,然后对选择的某对数(xi, ...
- [contest 781] 9.6
[contest 781] 9.6 - XJOI czx的温暖题... T1 军训
- [contest 782] 9.7
[contest 782] 9.7 - XJOI 个人觉得温暖题啊,,,可是卡毛空间呀!!! T1 传送
- Programming Contest Problem Types
Programming Contest Problem Types Hal Burch conducted an analysis over spring break of 1999 and ...
- 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) ...
- 2016 Multi-University Training Contest 2 D. Differencia
Differencia Time Limit: 10000/10000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others)Tot ...
- 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) ...
- hdu-5988 Coding Contest(费用流)
题目链接: Coding Contest Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Ot ...
随机推荐
- Golang调度器GMP原理与调度全分析(转 侵 删)
该文章主要详细具体的介绍Goroutine调度器过程及原理,包括如下几个章节. 第一章 Golang调度器的由来 第二章 Goroutine调度器的GMP模型及设计思想 第三章 Goroutine调度 ...
- linux命令查看日志
首先介绍几个日志查看种常用的简单命令: 1.tail tail 命令可用于查看文件的内容,有一个常用的参数 -f 常用于查阅正在改变的日志文件. tail -f filename 会把 filenam ...
- socket套接字(字节序、地址转换)
什么是socket: socket可以看成是用户进程与内核网络协议栈的编程接口. socket不仅可以用于本机的进程间通信,还可以用于网络上 不同主机之间的进程通信.IPv4套接口地址结构 struc ...
- 【翻译】指示器(indicator)的分类
参考 David Bianco在2015年发布的博文: http://detect-respond.blogspot.com/2013/07/on-misuse-of-indicators.html ...
- HttpClient4.5X使用-集成微服务
HttpClient4.5X使用-集成微服务 1.什么是HttpClient HTTP 协议可能是现在 Internet 上使用得最多.最重要的协议了,越来越多的 Java 应用程序需要直 ...
- DockerInstall
1.安装Tomcat 2.安装mysql [1].pull [root@pluto tomcat7logs]# docker pull mysql:5.6 [root@pluto tomcat7log ...
- 小程序后端获取openid (php实例)
小程序获取openid 首先,小程序授权登录的时候,前端就会获取到code 而后端接收到了code之后,就可以向微信发起请求,获取用户的openid代码如下: <?php $code = $_R ...
- mysql 重要日志文件总结
作者:丁仪 来源:https://chengxuzhixin.com/blog/post/mysql_zhong_yao_ri_zhi_wen_jian_zong_jie.html 日志是所有应用的重 ...
- 苹果电脑不安装flash的话怎么看直播
直播这种娱乐方式的兴起,让很多游戏玩家.脱口秀演员.歌手等拥有了一个更加宽广的舞台,可以更好地展现自己的才能.大部分的直播都是采取视频影像的方式直播,只有少部分才会采用纯音频的方式. 由于很多直播网站 ...
- 微课制作软件Camtasia中如何添加并编辑字幕?
除了能录制视频以外,Camtasia还能直接把录制下来的视频进行剪辑,并添加视频字幕等等一些后期效果.今天我们就来看一看字幕的添加方法. 导入视频 微课制作软件Camtasia录制的视频,默认在软件& ...