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. Swoole 简单学习(2)

    Swoole 简单学习(2) swoole之tcp服务器: //创建tcp服务器new swoole_server(string $host,int $port,int $mode=SWOOLE_PR ...

  2. js代码检测设备问题:为什么在移动端检测设备的时候会出现pc的页面

    为了在手机上也能正常显示页面,所以为之前写的页面又重写了一遍,专门用来在移动端显示,用js代码检测设备,如果是pc就显示pc的页面,如果是移动就显示移动的页面,但遇到一个问题就是在移动端打开会有一个延 ...

  3. python 中 len()和range()

    https://blog.csdn.net/qq_36357820/article/details/77850841

  4. tomcat启动一闪而过解决办法报错The CATALINA_HOME environment variable is not defined correctly

    解决办法: Tomcat无论在windows上还是Linux上只需要吧安装包传上去解压就行,不需要配置环境变量,吧之前有可能别人别配置的环境变量统一删掉即可(网上一大堆说需要配置的都是胡说八道).把以 ...

  5. HTML5 绘制阴影

    代码: <!DOCTYPE html> <html lang="zh"> <head> <meta charset="UTF-8 ...

  6. js中给数组添加元素的方法有哪些

    unshift:将参数添加到原数组开头,并返回数组的长度 pop:删除原数组最后一项,并返回删除元素的值:如果数组为空则返回undefined push:将参数添加到原数组末尾,并返回数组的长度 co ...

  7. Halo(十二)

    @RequestBody @ResponseBody @RequestBody 1) 该注解用于读取 Request 请求的 body 部分数据,使用系统默认配置的 HttpMessageConver ...

  8. HttpClient之EntityUtils工具类

    今天看到tttpclient-tutorial上面有这样一句话-----非常的不推荐使用EntityUtils,除非知道Entity是来自可信任的Http Server 而且还需要知道它的最大长度.文 ...

  9. commons-fileupload-1.2.1.jar 插件上传与下载

    1:首先在页面上写个文本域: <%@ page language="java" import="java.util.*" pageEncoding=&qu ...

  10. 【Linux】ssh执行远程命令awk 参数报错问题

    ssh  ip    sudo docker ps -a | grep none | awk '{print \$1}'| sed 's/%//g' $1前面加上转移符就好