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 ...
随机推荐
- tcp 客户端 发送syn
简介 sys_connect->inet_stream_connect->inet_stream_connect->tcp_v4_connect->tcp_connect对于t ...
- 字符串匹配算法之Sunday算法(转)
字符串匹配算法之Sunday算法 背景 我们第一次接触字符串匹配,想到的肯定是直接用2个循环来遍历,这样代码虽然简单,但时间复杂度却是Ω(m*n),也就是达到了字符串匹配效率的下限.于是后来人经过研究 ...
- 数据库Sharding的基本思想和切分策略(转)
一.基本思想 Sharding的基本思想就要把一个数据库切分成多个部分放到不同的数据库(server)上,从而缓解单一数据库的性能问题.不太严格的讲,对于海量数据的数据库,如果是因为表多而数据多,这时 ...
- WSL2:我在原生的Win10玩转Linux系统
原文地址:梁桂钊的博客 博客地址:http://blog.720ui.com 欢迎关注公众号:「服务端思维」.一群同频者,一起成长,一起精进,打破认知的局限性. WSL2:我在原生的Win10玩转Li ...
- 《GNU_Makefile》——第3章,Makefile总述
1.makefile的内容 一个完整的makefile包含5个东西: 显示规则,隐含规则,变量定义,指示符,注释 (1)显示规则 描述如何更新目标文件. (2)隐含规则 make程序内置的规则. ma ...
- JS 实现飞机大战
这是JS版本的飞机大战,和C#版本的思路相同,就是语言上有差别,用来巩固知识.可以将代码直接引入到HTML中就可以看到效果 //编写背景对象 function Background(width,hei ...
- 缩点Tarjan算法解析+[题解]受欢迎的牛
(注:我在网上找了一些图,希望原博主不要在意,谢谢,(。☉౪ ⊙。)) 首先来了解什么是强连通分量 有向图强连通分量:在有向图G中,如果两个顶点vi,vj间(vi>vj)有一条从vi到vj的有向 ...
- phpstorm换行符设置LF
git执行命令行 git config --global core.autocrlf true
- 如何利用 CleanMyMac X 进行系统清理
CleanMyMac X是一款颇受欢迎的专业清理软件,拥有十多项强大的功能,可以进行系统清理.清空废纸篓.清除大旧型文件.程序卸载.除恶意软件.系统维护等等,并且这款清理软件操作简易,非常好上手,特别 ...
- yii\web\Request::cookieValidationKey must be configured with a secret key.
yii\web\Request::cookieValidationKey must be configured with a secret key. 出现的错误表示没有设置 cookieValida ...