题目链接:

#411 (Div. 1)

差点翻船。

题解:

A.A. 这个推导一下,找一下规律就可以了。答案是:ans=(n+1)2−1ans=\frac{(n+1)}{2}-1。

B.B. 容易发现,无论我们要对字符串操作几遍,我们最后都是要把字符串变成bbbb...aaaabbbb...aaaa这种形式的。发现每个aa能把它后边的bb变成22个bb,而aa要变的次数一定是后面bb的个数,所以从后面开始遍历,统计bb的数量就可以了。

代码:

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
ll mod=1e9+7;
int main()
{string s;cin>>s;reverse(s.begin(),s.end());ll ans =0;int b=0;for(int i=0;i<s.length();i++){if (s[i] == 'b'){b++;} else{ans = (ans + b) % mod;b = b * 2 % mod;}}cout<<ans<<endl;return 0;
}

C.C. 这题花了我挺久时间的…还不如先做DD题啊…

这题题意: 给你nn个节点,这nn个节点构成一棵树。每个节点有sis_i个类型的ice−creamice-cream ,同一个节点的ice−creamice-cream互相连边构成完全图。对于有相同ice−creamice-cream的节点u,v,u,v,在树上一定相邻。求将ice−creamice-cream构成的图染色,相邻点不能同色的最小颜色数以及方案。

题解:首先dfsdfs一遍,将首个节点对应的ice−creamice-cream赋给不同的数字,同时记录一下ice−creamice-cream对应的颜色,再dfsdfs到下一个树节点,将已经染过色的ice−creamice-cream保存一下,然后再遍历一遍没被染过色的ice−creamice-cream,并赋给它一个符合条件的最小值。

我这个跑了1980ms,如果卡了,请加ios::sync_with_stdio(false);

代码:

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
ll mod=1e9+7;const int N=345678;
vector<int>g[N];
vector<int>a[N];
int ans[N];int dfs(int u,int fa,set<int>&s)
{set<int>s1;set<int>s2;vector<int>vv;for(auto x:a[u]){s1.insert(x);if(s.count(x)){s2.insert(ans[x]);}else{vv.push_back(x);}}int now=1;for(auto x:vv){s1.insert(x);while(s2.count(now)){now++;}ans[x]=now++;}for(auto v:g[u]){if(v!=fa){dfs(v,u,s1);}}}
int main()
{int n,m;cin>>n>>m;for(int i=1;i<=n;i++){int k;cin>>k;while(k--){int t;cin>>t;a[i].push_back(t);}}for(int i=1;i<n;i++){int u,v;cin>>u>>v;g[u].push_back(v);g[v].push_back(u);}set<int>s;dfs(1,-1,s);for(int i=1;i<=m;i++){if(ans[i]==0){ans[i]=1;}}int res=0;for(int i=1;i<=m;i++){res=max(res,ans[i]);}cout<<res<<endl;for(int i=1;i<=m;i++){cout<<ans[i]<<" ";}return 0;
}

D.D. :

题意:

给你一个森林,每次询问给出u,vu,v,问你从uu所在连通块中随机选出一个点与vv所在连通块中随机选出一个点相连,问你此时相连出的树的直径期望是多少?(不是树就输出-1)。

题解:首先,先预处理出各连通块的直径和各点到连通块内一点的最远距离d[x],通过树形dp+换根可以解决,询问时若在同一连通块内输出-1(并查集),否则若随机选出两点x,y,直径为max(d[x]+d[y]+1,max(d[x]+d[y]+1,x所在连通块的直径,所在连通块的直径,y所在连通块的直径)所在连通块的直径),我们把同一连通块内的dd从小到大排序一下,枚举小的连通块中的dd,到大的连通块中(lower_bound)二分d[x]+d[y]+1<=d[x]+d[y]+1max(xx所在连通块的直径,yy所在连通块的直径),,通过map<pair<int,int>,double>ansmap, double> ans记忆一下相同询问的答案,这样我们枚举小的次数最大就只有O(n1.5)O(n^{1.5})。(因为这题复杂度只跟小的有关,那么最差的情况是两个连通块是相同的时候,假设所有联通块大小均为kk,那么复杂度为O(k∗min(q,(nk)2))O(k∗min(q,(\frac{n}{k})^2)),所以复杂度为O(n1.5)O(n^{1.5})),(具体看代码~)

代码:

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N=123456;int fa[N], sz[N];
vector<int> g[N];int n, m, q;int find(int x)
{return fa[x]=x?fa[x]:fa[x]=find(fa[x]);}
int dp[N][3], G[N], mx[N];
vector<int> d[N];
vector<ll> sum[N];
bool cmp(int i, int j)
{return i > j;
}
void dfs(int u, int p)
{for(auto v: g[u]){if(v == p) continue;dfs(v, u);dp[u][2] = dp[v][0] + 1;sort(dp[u], dp[u] + 3, cmp);}
}
void dfs2(int u, int p)
{for(auto v: g[u]){if(v == p) continue;int t;if(dp[u][0] == dp[v][0] + 1) t = dp[u][1];else t = dp[u][0];G[v] = max(G[u] + 1, t + 1);dfs2(v, u);}
}
int main()
{cin>>n>>m>>q;for(int i = 1; i <= n; i++){fa[i] = i;sz[i] = 1;}for(int i = 1; i <= m; i++){int u, v;cin>>u>>v;g[u].push_back(v);g[v].push_back(u);sz[find(v)] += sz[find(u)];fa[find(u)] = find(v);}for(int i = 1; i <= n; i++){if(fa[i] == i){dfs(i, 0);}}for(int i = 1; i <= n; i++){if(fa[i] == i){dfs2(i, 0);}}for(int i = 1; i <= n; i++){d[i].push_back(0);sum[i].push_back(0);}for(int i = 1; i <= n; i++){int x = find(i);mx[x] = max(mx[x], max(dp[i][0], G[i]));int t = max(dp[i][0], G[i]);d[x].push_back(t);sum[x].push_back(0);}for(int i = 1; i <= n; i++){sort(d[i].begin(), d[i].end());if(fa[i] == i) {for(int j = 1; j < sum[i].size(); j++){sum[i][j] = sum[i][j - 1] + d[i][j];}}}map<pair<int,int>, double> ans;while(q--){int x, y;cin>>x>>y;x = find(x);y = find(y);if(x == y) //同一连通块{puts("-1");continue;}if(sz[x] > sz[y]) swap(x, y);if(ans.count(make_pair(x, y))){printf("%.10lf\n", ans[make_pair(x, y)]);continue;}ll res = 0;int k = max(mx[x], mx[y]);bool fst = 1;for(auto v: d[x]){if(fst){fst = 0;continue;}int p = lower_bound(d[y].begin(), d[y].end(), k - 1 - v) - d[y].begin();p = max(p, 1);res += sum[y][sum[y].size() - 1] - sum[y][p - 1] + 1LL * (v + 1) * (sum[y].size() - p);res += 1LL * (p - 1) * k;}double res2 = res * 1.0 / sz[x] / sz[y];ans[make_pair(x, y)] = res2;printf("%.12lf\n", res2);}return 0;
}

Codeforces Round #411 (Div. 1)(A~D)题解相关推荐

  1. Codeforces Round #198 (Div. 2)A,B题解

    Codeforces Round #198 (Div. 2) 昨天看到奋斗群的群赛,好奇的去做了一下, 大概花了3个小时Ak,我大概可以退役了吧 那下面来稍微总结一下 A. The Wall Iahu ...

  2. Codeforces Round #774 (Div. 2)E题题解

    Codeforces Round #774 (Div. 2) E. Power Board 题目陈述 有一个n×m(1≤n,m≤106)n\times m(1\le n,m\le10^6)n×m(1≤ ...

  3. Codeforces Round #640 (Div. 4)(ABCDEG题解)

    文章目录 A. Sum of Round Numbers B - Same Parity Summands C - K-th Not Divisible by n D - Alice, Bob and ...

  4. Codeforces Round #635 (Div. 2)(A~D)题解

    Codeforces #635 A~D A.Ichihime and Triangle B.Kana and Dragon Quest game C.Linova and Kingdom D.Xeni ...

  5. 【记录CF】Codeforces Round #777 (Div. 2) A~C 题解

    目录 杂谈 A. Madoka and Math Dad B. Madoka and the Elegant Gift C. Madoka and Childish Pranks 杂谈 又是一场离谱掉 ...

  6. Educational Codeforces Round 110 div.2 A~F题解

    视频讲解:BV1254y137Rn A. Fair Playoff 题目大意 有 444 位选手参加比赛,第 iii 位选手的水平为 si(1≤si≤100)s_i(1 \leq s_i \leq 1 ...

  7. Codeforces Round #636 (Div. 3) ——A. Candies 题解

    题目链接:https://codeforces.com/contest/1343/problem/A 签到题,for循环暴力枚举即可. 代码如下: #include <bits/stdc++.h ...

  8. Codeforces Round #641 (Div. 2)A~E题解(数论场)

    题目大意就是给你一个数执行k次操作,每次加上这个数的最小质因子(除了一以外)变成一个新的数,问最后的数是多少 解题思路:很明显如果一开始是偶数的话就会一直加2加2,如果是奇数的话先找到这个数的质因子一 ...

  9. Codeforces Round #784 (Div. 4)#蒻枸题解

    A B 输出出现次数大于3的 数 else -1 C 每次操作 奇数位+1 or 偶数位 +1 使得最后 只有 偶数 或 只有奇数 所以 只要 奇数位 有奇数&& 有偶数 or 偶数位 ...

最新文章

  1. aes加密内容不定长_浅谈加密技术
  2. C# 指定字符串截取方法
  3. 7-21 求前缀表达式的值
  4. 计算机会考补考时间安排,2019-2020学年第二学期初补考考试安排(实时更新)
  5. MySQL(10)-----多表创建及描述表关系(一对多的分析和实现)
  6. 前端项目:基于Nodejs+vue开发实现酒店管理系统
  7. 智慧校园大数据平台建设和运营整体解决方案
  8. java图书商城项目_JavaWeb网上图书商城完整项目--23.注册页面之html实现
  9. Arcgis10.0安装遇到错误1935
  10. 条码和自动识别的基础知识
  11. 红警职教智能硬件电子电路基础版教材与配套视频资源即将开发完毕
  12. AI行为识别:安防主动预警
  13. python matplotlib笔记:饼状图
  14. 网站日志流量分析系统之(日志收集)
  15. 真是太开心了居然看见google yahoo收录的身影-原创天地
  16. 阿里云消息队列MQ学习—阿里云大学视频课
  17. libreoffice calc 插入多行
  18. 带nfc 的 android 华为,目前支持NFC的手机这么多,为什么只有小米华为能覆盖这么多城市...
  19. 把word文档转化成pdf文档
  20. 基于N32G457的工厂车间环境及传送带计数系统设计

热门文章

  1. gpio引脚编号计算 GPIO1_20,那么引脚编号就可能等于 1 x 32 + 20 = 54。
  2. Sentinel的初步学习和探索
  3. MyBatis Plus基础理论以及实战
  4. 4-20mA电流两线制温湿度变送器工作原理
  5. 【作业】{r} :Shiny app 中使用 isolate 函数,达到 app 作图变换时的不实时反馈效果
  6. OpenCV大津法二值化
  7. matplotlib之绘制三维图像
  8. 2021年资料员-通用基础(资料员)报名考试及资料员-通用基础(资料员)新版试题
  9. 通达OAV11.10版本,表单js开发
  10. Chap.7 总结《CL: An Introduction》 (Vyvyan Evans)