C Palindrome Mouse

E Androgynos

参考https://blog.csdn.net/birdmanqin/article/details/98479219这位大佬的。构造题也没什么好说的。。。

#include<bits/stdc++.h>
using namespace std;
const int N=2e3+;
int n,m,mp[N][N],ans[N]; int main()
{
int T,cas=; cin>>T;
while (T--) {
scanf("%d",&n);
printf("Case #%d: ",++cas);
if (n%== || n%==) { puts("No"); continue; }
puts("Yes");
m=n; n=n-n%;
memset(mp,,sizeof(mp));
for (int i=;i<=m/;i++)
for (int j=i+;j<=m/;j++)
mp[i][j]=mp[j][i]=;
for (int i=;i<=n/;i++)
for (int j=+n/;j<=n/+n/;j++)
mp[i][j]=mp[j][i]=;
for (int i=n/+;i<=n/;i++)
for (int j=n/+n/+;j<=n;j++)
mp[i][j]=mp[j][i]=; for (int i=;i<=n/;i++) ans[i]=(n+)-i;
for (int i=n/+;i<=n;i++) ans[i]=i-n/;
ans[n+]=n+; if (m%==) {
for (int i=;i<=n/;i++) mp[m][i]=mp[i][m]=;
} for (int i=;i<=m;i++) {
for (int j=;j<=m;j++) printf("%d",mp[i][j]);
puts("");
}
printf("%d",ans[]);
for (int i=;i<=m;i++) printf(" %d",ans[i]);
puts("");
}
return ;
}

G Is Today Friday?

题意:输入n个字符串表示的日期串,问是否存在一种0-9到A-J的映射使得n个日期串都是星期五。

解法:直接暴力0-9到A-J的全排列即可,加了剪枝复杂度也不知道怎么算了反正能过qwq。然后是关于日期的几个小知识点(判断y/m/d是否合法,蔡勒公式判断y/m/d是星期几 )。

然后注意输入之后日期去重减少计算量。然后要用C++14提交才能通过不知道为什么。

#include<bits/stdc++.h>
using namespace std;
const int N=1e5+;
int n,p[];
string st[N]; int getday(int y,int m,int d) { //蔡勒公式O(1)判断日期 星期几
if(m==||m==) m+=,y-=;
int c=y/;y=y%;
int week=(y+y/+c/-*c+*(m+)/+d-)%;
return (week+)%;
} int calc(int t,int &y,int &m,int &d) { //计算得到年月日
for (int i=;i<;i++) y=y*+p[st[t][i]-'A'+];
for (int i=;i<;i++) m=m*+p[st[t][i]-'A'+];
for (int i=;i<;i++) d=d*+p[st[t][i]-'A'+];
} int moth[]={,,,,,,,,,,,,};
int check(int y,int m,int d) { //判断日期的合法性
if((y%==&&y%!=)||y%==) moth[]=; else moth[]=;
if((<=y and y<= )&&(m>= and m<=)&&(d>= and d<=moth[m])) return ;
return ;
} int main()
{
ios::sync_with_stdio(false);
int T,cas=; cin>>T;
while (T--) {
cin>>n; for (int i=;i<=n;i++) cin>>st[i];
sort(st+,st+n+);
n=unique(st+,st+n+)-(st+); //去重
bool ans=;
for (int i=;i<=;i++) p[i]=i-;
do{
bool ok=;
for (int i=;i<=n;i++) {
int y=,m=,d=;
calc(i,y,m,d);
if (!check(y,m,d) || getday(y,m,d)!=) { ok=; break; }
}
if (ok) ans=;
if (ans) break; }while(next_permutation(p+,p++));
printf("Case #%d: ",++cas);
if (ans) for (int i=;i<=;i++) printf("%d",p[i]);
else printf("Impossible");
puts("");
}
return ;
}

H Train Driver

题意:给定无向图,第一个人在A集合选一个点,第二个人在B集合选一个点,第三个人在全集里选择一个点。 然后问“三人到某一点集合的最小距离”的期望。

解法:这道题有意思,学到了新姿势。

观察到AB点集大小很小,所以可以枚举A点和B点,然后分别以A/B点为起点求到全图的最短路d1,d2,那么d[i]=d1[i]+d2[i]就是AB两点到某个点集合的最短路,然后我们在这基础上考虑到第三个点集合最短,那么因为此时我们把AB两点的计算结果计算出来了,就相当于变成了求两点最短路,不过是起点有多个(全图都是起点)的最短路而已,直接bfs就行了。

但是用优先队列的dfs会超时,我们要想办法优化。从每条边都是长度1考虑,我们熟知如果队列原本是有序的边长定长那么新加入的结点加入到队尾之后也是有序的,但是要注意到此题有多个起点,而起点并不是只相差一层的关系,所以队头拓展出来的结点有可能比队列中的元素小!怎么处理?这里用到一个比较奇妙的办法:用两个队列,一个队列拓展出来的放到另一个的队列尾,这样能保证有序。至于为什么只能感谢理解了。

#include<bits/stdc++.h>
using namespace std;
typedef long long LL;
const int N=1e5+;
int n,m,na,nb,A[N],B[N];
LL sum,ans;
vector<int> G[N]; int d1[][N],d2[][N],d[N];
queue<int> q;
void bfs(int s,int dis[]) {
dis[s]=; q.push(s);
while (!q.empty()) {
int x=q.front(); q.pop();
for (int i=;i<G[x].size();i++) {
int y=G[x][i];
if (dis[y]>dis[x]+) {
dis[y]=dis[x]+;
q.push(y);
}
}
}
} queue<int> q1,q2;
int c[N],rk[N];
void solve(int s1,int s2) {
int Max=;
for (int i=;i<=n;i++) d[i]=d1[s1][i]+d2[s2][i],Max=max(Max,d[i]);
for (int i=;i<=Max;i++) c[i]=;
for (int i=;i<=n;i++) c[d[i]]++;
for (int i=;i<=Max;i++) c[i]+=c[i-];
for (int i=;i<=n;i++) rk[c[d[i]]--]=i; for (int i=;i<=n;i++) q1.push(rk[i]);
while (!q1.empty() || !q2.empty()) {
int x;
if (q1.size()&&(q2.empty() || d[q1.front()]<=d[q2.front()])) {
x=q1.front(); q1.pop();
for (int i=;i<G[x].size();i++) {
int y=G[x][i];
if (d[y]>d[x]+) {
d[y]=d[x]+;
q2.push(y);
}
}
} else {
x=q2.front(); q2.pop();
for (int i=;i<G[x].size();i++) {
int y=G[x][i];
if (d[y]>d[x]+) {
d[y]=d[x]+;
q1.push(y);
}
}
}
}
for (int i=;i<=n;i++) ans+=d[i];
} int main()
{
int T,cas=; cin>>T;
while (T--) {
scanf("%d%d",&n,&m);
for (int i=;i<=n;i++) G[i].clear();
sum=ans=;
for (int i=;i<=m;i++) {
int x,y; scanf("%d%d",&x,&y);
G[x].push_back(y);
G[y].push_back(x);
}
scanf("%d",&na); for (int i=;i<=na;i++) scanf("%d",&A[i]);
scanf("%d",&nb); for (int i=;i<=nb;i++) scanf("%d",&B[i]); for (int i=;i<=na;i++) {
for (int k=;k<=n;k++) d1[i][k]=0x3f3f3f3f; bfs(A[i],d1[i]);
}
for (int j=;j<=nb;j++) {
for (int k=;k<=n;k++) d2[j][k]=0x3f3f3f3f; bfs(B[j],d2[j]);
}
for (int i=;i<=na;i++)
for (int j=;j<=nb;j++)
solve(i,j); sum=n*na*nb;
LL g=__gcd(ans,sum);
ans/=g; sum/=g;
if (sum==) printf("Case #%d: %lld\n",++cas,ans);
else printf("Case #%d: %lld/%lld\n",++cas,ans,sum);
}
return ;
}

2019牛客暑期多校训练营(第六场)C E H G的更多相关文章

  1. 2019牛客暑期多校训练营(第六场)C - Palindrome Mouse (回文自动机)

    https://ac.nowcoder.com/acm/contest/886/C 题意: 给出一个串A , 集合S里面为A串的回文字串 , 现在在集合S里面找出多少对(a,b),b为a的字串 分析: ...

  2. 2019牛客暑期多校训练营(第六场)J Upgrading Technology

    传送门 题意: 就是给你n个技能,每个技能最高升到m级,每升一级就是耗费Cij钱,这个Cij可能是负的,如果所有技能都升到或者说超过j等级,就会获得Dj钱,这个Dj也有可能是负值,让你求你最多得到多少 ...

  3. 2019牛客暑期多校训练营(第九场)A:Power of Fibonacci(斐波拉契幂次和)

    题意:求Σfi^m%p. zoj上p是1e9+7,牛客是1e9:  对于这两个,分别有不同的做法. 前者利用公式,公式里面有sqrt(5),我们只需要二次剩余求即可.     后者mod=1e9,5才 ...

  4. 2019牛客暑期多校训练营(第一场)A题【单调栈】(补题)

    链接:https://ac.nowcoder.com/acm/contest/881/A来源:牛客网 题目描述 Two arrays u and v each with m distinct elem ...

  5. 2019牛客暑期多校训练营(第一场) B Integration (数学)

    链接:https://ac.nowcoder.com/acm/contest/881/B 来源:牛客网 Integration 时间限制:C/C++ 2秒,其他语言4秒 空间限制:C/C++ 5242 ...

  6. 2019牛客暑期多校训练营(第一场) A Equivalent Prefixes ( st 表 + 二分+分治)

    链接:https://ac.nowcoder.com/acm/contest/881/A 来源:牛客网 Equivalent Prefixes 时间限制:C/C++ 2秒,其他语言4秒 空间限制:C/ ...

  7. 2019牛客暑期多校训练营(第二场)F.Partition problem

    链接:https://ac.nowcoder.com/acm/contest/882/F来源:牛客网 Given 2N people, you need to assign each of them ...

  8. 2019牛客暑期多校训练营(第一场)A Equivalent Prefixes(单调栈/二分+分治)

    链接:https://ac.nowcoder.com/acm/contest/881/A来源:牛客网 Two arrays u and v each with m distinct elements ...

  9. [状态压缩,折半搜索] 2019牛客暑期多校训练营(第九场)Knapsack Cryptosystem

    链接:https://ac.nowcoder.com/acm/contest/889/D来源:牛客网 时间限制:C/C++ 2秒,其他语言4秒 空间限制:C/C++ 262144K,其他语言52428 ...

  10. 2019牛客暑期多校训练营(第二场)J-Subarray(思维)

    >传送门< 前言 这题我前前后后看了三遍,每次都是把网上相关的博客和通过代码认真看了再思考,然并卵,最后终于第三遍也就是现在终于看懂了,其实懂了之后发现其实没有那么难,但是的的确确需要思维 ...

随机推荐

  1. 创建 OpenStack云主机

    创建过程 创建虚拟网络 创建m1.nano规格的主机(相等于定义虚拟机的硬件配置) 生成一个密钥对(openstack的原理是不使用密码连接,而是使用密钥对进行连接) 增加安全组规则(用iptable ...

  2. mongdb 副本集的原理、搭建、应用

    在了解了这篇文章之后,可以进行该篇文章的说明和测试.MongoDB 副本集(Replica Set)是有自动故障恢复功能的主从集群,有一个Primary节点和一个或多个Secondary节点组成.类似 ...

  3. phpstrom 安装

    环境: ubuntu18.4 一. 安装 1. 下载安装包.tar.gz 下载地址:https://www.jetbrains.com/phpstorm/download/#section=linux ...

  4. Struts第一个程序。

    1:创建完程序后.先写web.xml <?xml version="1.0" encoding="UTF-8"?> <web-app xmln ...

  5. php fmod()函数 语法

    php fmod()函数 语法 作用:fmod()函数的作用是两个数值做除法运算后的余数 语法:fmod(X,Y).大理石平台哪家好 参数: 参数 描述 X 必须,X为除数 Y 必须,被除数,如果Y为 ...

  6. linux 文件及目录结构体系

    linux 目录的特点: 1). /是所有目录的顶点 2).目录结构像一颗倒挂的树 3).目录和磁盘分区是没有关联的 4)./下不同的目录可能对应不同的分区或磁盘 5).所有的目录都是按照一定的类别有 ...

  7. LINUX为什么要进行内核移植 内核移植的作用

    LINUX为什么要进行内核移植 内核移植的作用,不移植能用么?   LZ的问题应该是为什么要重新编译内核吧.既然你已经可以跑了,证明你现在用的内核已经移植到你用的硬件上,自然你也不需要做什么移植.通常 ...

  8. 左手Mongodb右手Redis 第一章,进入Mongodb和Redis的世界

    ---恢复内容开始--- 1,为什么要使用非关系型数据库,关系型数据库咋滴,不能用嘛? 存在即合理,非关系型数据库的出现,那说明关系型数据库不适用了. 非关系型数据库(NOSQL)-->Not ...

  9. 基础复习之HTML (doctype、标签语义化)

    这段时间找实习看的眼花缭乱的,然后也被拒得落花流水,啊哈哈-还是写博客好玩儿-嘿嘿,下面正题 一.doctype 标准模式 (Full Standards Mode) 接近标准模式 (Almost S ...

  10. leetcode-解题记录 771. 宝石与石头

    题目: 给定字符串J 代表石头中宝石的类型,和字符串 S代表你拥有的石头. S 中每个字符代表了一种你拥有的石头的类型,你想知道你拥有的石头中有多少是宝石. J 中的字母不重复,J 和 S中的所有字符 ...