Codeforces_805
A.当l == r时,肯定输出这个数就可以了,当存在两个或两个以上连续的数时,2肯定是最多的数,或最多的数之一。
#include<bits/stdc++.h>
using namespace std; int l,r; int main()
{
ios::sync_with_stdio(false);
cin >> l >> r;
if(l == r) cout << l << endl;
else cout << << endl;
return ;
}
B.aabb这个顺序一定不会有3位的回文串,并且不出现c。
#include<bits/stdc++.h>
using namespace std; int n; int main()
{
ios::sync_with_stdio(false);
cin >> n;
int now = ,cnt = ;
for(int i = ;i <= n;i++)
{
if(now == ) cout << "a";
else cout << "b";
cnt++;
if(cnt == )
{
cnt = ;
now = -now;
}
}
cout << endl; return ;
}
C.1->n->2->n-1...这样的顺序。
#include<bits/stdc++.h>
using namespace std; int n; int main()
{
ios::sync_with_stdio(false);
cin >> n;
cout << (n-)/ << endl;
return ;
}
D.我们发现,每次变换,会把a往后挪动,并且a后面的b翻倍,跑到a前面来。我们从字符串右往左找到每一个a,将其挪到所有b之后。
#include<bits/stdc++.h>
#define MOD 1000000007
using namespace std; string s; int main()
{
ios::sync_with_stdio(false);
cin >> s;
long long ans = ,now = ;
for(int i = s.length()-;i >= ;i--)
{
if(s[i] == 'b') now = (now+)%MOD;
else
{
ans = (ans+now)%MOD;
now = (now+now)%MOD;
}
}
cout << ans << endl;
return ;
}
E.刚开始题意看的一脸懵逼,以为T树是没有用的,但题目中有个条件,含有相同种类的点在树上是连通的,我们用这个特性dfs给G图染色即可,注意未出现的点也要染色。
#include<bits/stdc++.h>
using namespace std; int n,m,cnt = ,color[],a[];
vector<int> v[],s[]; void dfs(int now,int pre)
{
map<int,int> mp;
for(int i = ;i < s[now].size();i++)
{
int t = s[now][i];
if(color[t]) mp[color[t]] = ;
}
int cntt = ;
for(int i = ;i < s[now].size();i++)
{
int t = s[now][i];
if(color[t]) continue;
while(mp.count(++cntt));
color[t] = cntt;
}
for(int i = ;i < v[now].size();i++)
{
int t = v[now][i];
if(t == pre) continue;
dfs(t,now);
}
} int main()
{
ios::sync_with_stdio(false);
cin >> n >> m;
int ans = ;
for(int i = ;i <= n;i++)
{
int x,y,now = ;
cin >> x;
ans = max(x,ans);
for(int j = ;j <= x;j++)
{
cin >> y;
s[i].push_back(y);
}
}
for(int i = ;i < n;i++)
{
int x,y;
cin >> x >> y;
v[x].push_back(y);
v[y].push_back(x);
}
dfs(,-);
cout << ans << endl;
for(int i = ;i <= m;i++)
{
if(color[i] == ) cout << << " ";
else cout << color[i] << " ";
}
cout << endl;
return ;
}
F.我们求出每个连通子图中每个点的到其他点的最长距离f,每个连通子图的直径d。
对于每一个询问,若两个点在同一个连通子图,则输出-1。
否则,我们考虑两个子图的任意两个点相连后的图的直径为max(fi + fj + 1, max(d1, d2))。
将每个联通子图中所有的d排序后,枚举第一个子图每个点,二分答案为max(d1, d2)的个数,之后就好处理了。
#include<bits/stdc++.h>
using namespace std; int n,m,q,d[] = {},dd[],D[],pre[];
vector<int> v[],vv[];
vector<long long> s[];
map<int,double> mp[]; int findd(int x)
{
return x == pre[x]?x:pre[x] = findd(pre[x]);
} void join(int x,int y)
{
int xx = findd(x),yy = findd(y);
if(xx != yy) pre[xx] = yy;
} void dfs1(int now,int pre)
{
for(int i = ;i < v[now].size();i++)
{
int t = v[now][i];
if(t == pre) continue;
dfs1(t,now);
d[now] = max(d[now],d[t]+);
}
}
void dfs2(int now,int pre)
{
int max1 = -,max2 = -;
dd[now] = d[now];
for(int i = ;i < v[now].size();i++)
{
int t = v[now][i];
if(d[t] > max1)
{
max2 = max1;
max1 = d[t];
}
else max2 = max(max2,d[t]);
}
for(int i = ;i < v[now].size();i++)
{
int t = v[now][i];
if(t == pre) continue;
int x = d[now],y = d[t];
if(d[t] == max1) d[now] = max2+;
else d[now] = max1+;
d[t] = max(d[t],d[now]+);
dfs2(t,now);
d[now] = x;
d[t] = y;
}
}
int main()
{
ios::sync_with_stdio(false);
cin >> n >> m >> q;
for(int i = ;i <= n;i++) pre[i] = i;
while(m--)
{
int x,y;
cin >> x >> y;
v[x].push_back(y);
v[y].push_back(x);
join(x,y);
}
for(int i = ;i <= n;i++)
{
if(findd(i) == i)
{
dfs1(i,-);
dfs2(i,-);
}
}
for(int i = ;i <= n;i++)
{
D[findd(i)] = max(D[findd(i)],dd[i]);
vv[findd(i)].push_back(dd[i]);
}
for(int i = ;i <= n;i++)
{
if(vv[i].size() == ) continue;
sort(vv[i].begin(),vv[i].end());
s[i].resize(vv[i].size());
s[i][] = vv[i][];
for(int j = ;j < s[i].size();j++)
{
s[i][j] = s[i][j-]+vv[i][j];
}
}
while(q--)
{
int xx,yy;
cin >> xx >> yy;
int x = findd(xx),y = findd(yy);
if(x == y)
{
cout << - << endl;
continue;
}
if(vv[x].size() > vv[y].size() || vv[x].size() == vv[y].size() && x > y) swap(x,y);
if(mp[x].count(y))
{
cout << fixed << setprecision() << mp[x][y] << endl;
continue;
}
double ans = ;
int maxx = max(D[x],D[y]);
for(int i = ;i < vv[x].size();i++)
{
int pos = upper_bound(vv[y].begin(),vv[y].end(),maxx-vv[x][i]-)-vv[y].begin();
ans += (long long)pos*maxx;
ans += (long long)(vv[y].size()-pos)*(vv[x][i]+);
ans += (long long)s[y][s[y].size()-];
if(pos > ) ans -= (long long)s[y][pos-];
}
ans = ans/vv[x].size()/vv[y].size();
mp[x][y] = ans;
cout << fixed << setprecision() << ans << endl;
}
return ;
}
Codeforces_805的更多相关文章
随机推荐
- vue-cli3 中 sockjs-node/info?t=报错 的解决方法
页面突然出现这种报错: 查看Network看到是info接口报错,我项目中没有调用过该项目,然后百度查询sockjs-node/info?t=1562204191563, 首先 sockjs-node ...
- 用python做推荐系统(一)
一.简介: 推荐系统是最常见的数据分析应用之一,包含淘宝.豆瓣.今日头条都是利用推荐系统来推荐用户内容.推荐算法的方式分为两种,一种是根据用户推荐,一种是根据商品推荐,根据用户推荐主要是找出和这个用户 ...
- Stripe支付对接
一.由于文档丢失原因,我就直接上代码了. 这个Stripe支付可以支持多个币种,我下面就采用"HDK"来参照支付先上一个支付效果图 提示:先上代码,在说明博主自己理解的流程. 一 ...
- 基于CentOS 7 部署MySQL 5.7的基本操作
关闭selinux # sed -i '/SELINUX/s/enforcing/disabled/' /etc/selinux/config重启后生效# sestatus 修改提示符配置# vi / ...
- 6年iOS开发被裁员,是行业的饱和还是经验根本不值钱?
前言: 最近看到很多iOS开发由于公司裁员而需要重新求职的.他们普遍具有4年甚至更长的工作经验.但求职结果往往都不太理想. 我在与部分iOS开发者交谈的过程中发现,很多人的工作思路不清晰,技能不扎实, ...
- Linux学习_菜鸟教程_3
我是在UBANTO上运行Linux的,开机启动时按下shift或者Esc都不能进入到grub,没有百度到可靠的教程. 暂时先这样吧.免得我把系统搞坏了,先学点实用的知识~~ Next Chapter
- hexo零基础搭建博客系列(一)
关于其他搭建 [hexo4快速搭建博客(二)更换主题](https://blog.csdn.net/weixin_41800884/article/details/103750634)[hexo4快速 ...
- Android学习进度二
在最新的Android开发中,Google已经使用了新的开发技术,即使用Jectpack来开发App.所以今天我主要学习了这方面的知识. Jetpack 是一套库.工具和指南,可帮助开发者更轻松地编写 ...
- DevOps is Hard、DevSecOps is Even Harder . --- Enterprise Holdings
Enterprise Holdings. 的IT团队超过2000人,在2018年的演讲中介绍了Enterprise Holdings的DevOps是如何转型的.我们通过打造一个不只包涵了pipelin ...
- docker学习1--dockerfile
记录docker学习过程 实践启动一个redis server 命令之前 要弄懂 dockfile 镜像 容器 三者概念以及三者之间的关系 dockerfile格式 # Comment 注释 INST ...