2019牛客暑期多校训练营(第六场)C E H G
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的更多相关文章
- 2019牛客暑期多校训练营(第六场)C - Palindrome Mouse (回文自动机)
https://ac.nowcoder.com/acm/contest/886/C 题意: 给出一个串A , 集合S里面为A串的回文字串 , 现在在集合S里面找出多少对(a,b),b为a的字串 分析: ...
- 2019牛客暑期多校训练营(第六场)J Upgrading Technology
传送门 题意: 就是给你n个技能,每个技能最高升到m级,每升一级就是耗费Cij钱,这个Cij可能是负的,如果所有技能都升到或者说超过j等级,就会获得Dj钱,这个Dj也有可能是负值,让你求你最多得到多少 ...
- 2019牛客暑期多校训练营(第九场)A:Power of Fibonacci(斐波拉契幂次和)
题意:求Σfi^m%p. zoj上p是1e9+7,牛客是1e9: 对于这两个,分别有不同的做法. 前者利用公式,公式里面有sqrt(5),我们只需要二次剩余求即可. 后者mod=1e9,5才 ...
- 2019牛客暑期多校训练营(第一场)A题【单调栈】(补题)
链接:https://ac.nowcoder.com/acm/contest/881/A来源:牛客网 题目描述 Two arrays u and v each with m distinct elem ...
- 2019牛客暑期多校训练营(第一场) B Integration (数学)
链接:https://ac.nowcoder.com/acm/contest/881/B 来源:牛客网 Integration 时间限制:C/C++ 2秒,其他语言4秒 空间限制:C/C++ 5242 ...
- 2019牛客暑期多校训练营(第一场) A Equivalent Prefixes ( st 表 + 二分+分治)
链接:https://ac.nowcoder.com/acm/contest/881/A 来源:牛客网 Equivalent Prefixes 时间限制:C/C++ 2秒,其他语言4秒 空间限制:C/ ...
- 2019牛客暑期多校训练营(第二场)F.Partition problem
链接:https://ac.nowcoder.com/acm/contest/882/F来源:牛客网 Given 2N people, you need to assign each of them ...
- 2019牛客暑期多校训练营(第一场)A Equivalent Prefixes(单调栈/二分+分治)
链接:https://ac.nowcoder.com/acm/contest/881/A来源:牛客网 Two arrays u and v each with m distinct elements ...
- [状态压缩,折半搜索] 2019牛客暑期多校训练营(第九场)Knapsack Cryptosystem
链接:https://ac.nowcoder.com/acm/contest/889/D来源:牛客网 时间限制:C/C++ 2秒,其他语言4秒 空间限制:C/C++ 262144K,其他语言52428 ...
- 2019牛客暑期多校训练营(第二场)J-Subarray(思维)
>传送门< 前言 这题我前前后后看了三遍,每次都是把网上相关的博客和通过代码认真看了再思考,然并卵,最后终于第三遍也就是现在终于看懂了,其实懂了之后发现其实没有那么难,但是的的确确需要思维 ...
随机推荐
- Tomcat 9 安装
1.下载 官网:https://tomcat.apache.org/ 在浏览器地址栏输入地址,进入下图页面. 点击下图红色标记处(笔者选择的Tomcat 9下载,读者可根据需要自行选择) 下图蓝色标记 ...
- TLSv网络安全标准,会话加密协议展望未来
本文是关于TLSv1.3采用的三部分系列的第三部分也是最后一部分.它解决了网络加密和监控的选项,包括备用会话加密协议. 通过TLSv1.3的批准,并在IETF出版物队列中,是时候考虑部署选项和障碍,并 ...
- Erlang/Elixir精选-第4期(20191223)
精选文章 A digital symphony - The architecture of API Fortress. 使用Actor模型来支持基于微服务的大规模分布式软件架构.用实例解释了Actor ...
- 51nod 1714:B君的游戏(博弈 sg打表)
题目链接:https://www.51nod.com/onlineJudge/questionCode.html#!problemId=1714 nim游戏的一个变形,需要打出sg函数的表 #incl ...
- 【leetcode】722. Remove Comments
题目如下: Given a C++ program, remove comments from it. The program source is an array where source[i] i ...
- Java Web学习总结(13)Listener监听器
一,监听器介绍 监听器是一个专门用于对其他对象身上发生的事件或状态改变进行监听和相应处理的对象,当被监视的对象发生情况时,立即采取相应的行动.监听器其实就是一个实现特定接口的普通java程序,这个程序 ...
- 四轴PID思路整理
参考资料: https://blog.csdn.net/nemol1990/article/details/45131603 https://blog.csdn.net/qq_27114397/art ...
- 前端每日实战:18# 视频演示如何用纯 CSS 创作 404 文字变形为 NON 文字的交互特效
效果预览 按下右侧的"点击预览"按钮可以在当前页面预览,点击链接可以全屏预览. https://codepen.io/comehope/pen/ZoxjXm 可交互视频教程 此视频 ...
- spark sql correlated scalar subqueries must be aggregated 错误解决
最近在客户中使用spark sql 做一些表报处理,但是在做数据关联时,老是遇到 “correlated scalar subqueries must be aggregated” 错误 举一个例子, ...
- About Intel® Processor Numbers
http://www.intel.com/content/www/us/en/processors/processor-numbers.html About Intel® Processor Numb ...