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的更多相关文章

随机推荐

  1. my_mysql

    ###一键偷懒YUM安装MySQbL### 1.安装mysql数据库 #yum install -y mariadb-server  mariadb 2.登录mysql数据库常用选项 -h:指定服务端 ...

  2. 配置ca服务器和http,mail加密

    一·CA介绍 certificate authority   数字证书授权中心 被通信双方信任的.独立的第三方机构 负责证书颁发.验证.撤销等管理 数字证书 经证书授权中心数字签名的包含公开密钥拥有者 ...

  3. KafkaProducer Sender 线程详解(含详细的执行流程图)

    目录 1.Sender 线程详解 2.RecordAccumulator 核心方法详解 温馨提示:本文基于 Kafka 2.2.1 版本. 上文 <源码分析 Kafka 消息发送流程> 已 ...

  4. 端口扫描器--利用socket协议

    #!/usr/bin/env python # -*- coding:UTF-8 -*- import optparse import socket import threading # 用法 pyt ...

  5. EFCore Database-first深入研究

    EFCore Database-first深入研究 使用Scaffold-DbContext从数据库生成实体 说明文档: 关于 Scaffold-DbContext 微软有官方说明文档 https:/ ...

  6. 【Java基础总结】总结

    总想着把学习的过程全都记录下来 以便某一时刻回头的时候,还能看见走过的路 对于基础来说,即使不回头看,也知道这条路是什么样子的 记录不记录,都无所谓 况且我不是专业的记录者,不记录比记录好 实在想不起 ...

  7. txLive模块(直播类)试用分享

    本文出自APICloud官方论坛, 感谢论坛版主uoaccw的分享. txLive 模块封装了腾讯云直播服务 https://docs.apicloud.com/Client-API/Open-SDK ...

  8. cogs 3. 服务点设置 dijkstra

    3. 服务点设置 ★   输入文件:djsa.in   输出文件:djsa.out   简单对比时间限制:1 s   内存限制:128 MB [问题描述] 为了进一步普及九年义务教育,政府要在某乡镇建 ...

  9. 关于爬虫的日常复习(10)—— 实战:使用selenium模拟浏览器爬取淘宝美食

  10. 安装Jupyter Notebook

    1.安装Ipython pip3 install -i https://pypi.douban.com/simple ipython 2.安装jupyter pip3 install -i https ...