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. 前端学习(三十八)vue(笔记)

    Angular+Vue+React    Vue性能最好,Vue最轻=======================================================Angular     ...

  2. HTML5:新元素来实现一下网页布局

    <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title> ...

  3. Java调用MySql数据库函数

    Java调用MySql数据库函数 /** * 调用mysql的自定义函数 * */ private void test() { logger.info("show task start &q ...

  4. C++ KMP文本匹配

    代码如下: 环境为VC #include <iostream> #include <algorithm> #include <string> #include &l ...

  5. 洛谷4843 BZOJ2502 清理雪道

    有源汇有上下界的最小可行流. YY一下建图应该很好搞吧(? 就是对于每个雪道都是[1,inf]然后源点到所有点都是[0,inf]所有点到汇点都是[0,inf] 这样的话跑一个有源汇上下界最小可行流就可 ...

  6. tensorflow的boolean_mask函数

    在mask中定义true,保留与其进行运算的tensor里的部分内容,相当于投影的功能. mask与tensor的维度可以不相同的,但是对应的长度一定要相同,也就是要有一一对应的部分: 结果的维度 = ...

  7. null,blank,default

    null 是针对数据库而言,如果 null=True, 表示数据库的该字段可以为空. blank 是针对表单的,如果 blank=True,表示你的表单填写该字段的时候可以不填,比如 admin 界面 ...

  8. Gene Ontology (GO) 注释

    Gene Ontology (GO) 注释  Posted on 2017-06-11 |  In 生信 相似的基因在不同物种中,其功能往往保守的.显然,需要一个统一的术语用于描述这些跨物种的同源基因 ...

  9. 2.Javascript 函数(主要)

    定义函数 在JavaScript中,定义函数的方式如下: function abs(x) { if (x >= 0) { return x; } else { return -x; } } 上述 ...

  10. 微信小程序中显示html富文本的方法

    微信小程序中显示html富文本的方法 使用方法:git地址:https://github.com/icindy/wxParse 一.下载wxParse文件 二.在要引入的页面的js文件中,引入文件 j ...