10月15日模拟赛题解

10月15日模拟赛题解

A 树

Description

给定一棵 \(n\) 个节点的树,每个节点有两个参数 \(a,~b\),对于每个节点,求子树中参数为 \(b\) 的所有节点的 \(a\) 之和

Limitations

\(100\%\) \(1 \leq b \leq n \leq 10^5,~a \leq 1000\)

\(60\%\) \(1 \leq b,n\leq 1000\)

\(30\%\) \(1 \leq b, n \leq 10\)

Solution

对于 \(30\%\) 的数据,我也不会做。

对于 \(60\%\) 的数据,考虑枚举一下 \(b\),然后 \(O(n)\) 在树上 dfs 即可。

考虑满分做法。

一个显而易见的想法是,对于一个 \(b_i\),我们遍历他子树中参数 \(b\) 与 \(b_i\) 不同的节点是没有意义的,因此我们考虑遍历完一个节点以后直接跳到它子树内最靠近它的 \(b\) 相同的节点,换句话说,对每个节点,寻找一个与它参数 \(b\) 相同的最近的祖先作为父节点。

考虑在 dfs 的时候,如果我们对每个 \(b\) 维护根到当且节点的链上参数为 \(b\) 的节点序列,则当前节点的同参数父节点就是对应序列的最后一个节点。考虑维护这个节点序列只需要开 \(n\) 个栈分别维护每个 \(b\) 的序列即可,即 dfs 到一个节点时将节点入栈,离开时弹出,这样显然可以保证栈内元素是有序的根到当前节点链上的节点序列。

然后我们相当于对于每个 \(b\) 都新建了一棵树,在这些树上做 dfs 即可。事实上在原来的树上做 dfs 的时候只要维护好每个节点在新树上的孩子就可以直接统计,不需要显式地建出新树。

时空复杂度 \(O(n)\),期望得分 \(100~pts\)

Code

#include <cstdio>
#include <stack>
#include <vector>

const int maxn = 100010;

struct Edge {
  int v;
  Edge *nxt;

  Edge(const int _v, Edge *h) : v(_v), nxt(h) {}
};
Edge *hd[maxn];

int n;
int b[maxn], ans[maxn];
bool vis[maxn];
std::stack<int>stk[maxn];
std::vector<int>son[maxn];

void dfs(const int u);

int main() {
  freopen("tree.in", "r", stdin);
  freopen("tree.out", "w", stdout);
  qr(n);
  for (int i = 1; i <= n; ++i) {
    qr(ans[i]); qr(b[i]);
  }
  for (int i = 1, u, v; i < n; ++i) {
    u = v = 0; qr(u); qr(v);
    hd[u] = new Edge(v, hd[u]);
    hd[v] = new Edge(u, hd[v]);
  }
  dfs(1);
  for (int i = 1; i <= n; ++i) {
    qw(ans[i], i == n ? '\n' : ' ', true);
  }
  return 0;
}

void dfs(const int u) {
  vis[u] = true;
  int k = b[u];
  if (stk[k].size()) {
    son[stk[k].top()].push_back(u);
  }
  stk[k].push(u);
  for (auto e = hd[u]; e; e = e->nxt) if (!vis[e->v]) {
    int v = e->v;
    dfs(v);
  }
  for (auto v : son[u]) {
    ans[u] += ans[v];
  }
  stk[k].pop();
}

B 小偷

Description

有一个长度不低于 \(4\) 的序列 \(A\),满足 \(\frac{A_i}{A_{i - 1}} = k\),其中 \(k\) 是一个正整常数,且序列的最大值不超过 \(n\)。

显然这样的合法序列有许多个,现在我们对序列的参数一无所知,只知道合法的序列有 \(m\) 个,求 \(n\) 最小是多少。无解输出 -1

Limitations

\(100\%\) \(3 \leq m \leq 10^{15}\)

\(60\%\) \(3 \leq m \leq 100000\)

\(30\%\) \(3 \leq m \leq 1000\)

Solution

对于前 \(30\%\) 的数据,爆搜一下序列即可。

对于前 \(60\%\) 的数据,枚举一下 \(k\) 即可,然后枚举序列长度即可。值得注意的是由于序列每次除以 \(k\),因此序列长度是 \(O(\log)\) 级别的,并且序列最大值大概是 \(O(m)\) 级别,最大值至少除 \(3\) 次 \(k\) 后的结果必须是正数,因此 \(k\) 也不会很大,大概在 \(10^2\) 数量级,因此枚举可过。时间复杂度 \(O(m \log m)\)

至于证明最大值是 \(O(m)\) 的……我是打个表看出来的(雾

对于全部的数据,考虑求最小值,并且显然不可能贪心,DP由于序列长度不确定也无法设计状态,因此考虑二分答案。

考虑固定一个 \(n\),当 \(n\) 变大时,合法的序列个数不会变小,因为 \(n\) 较小时合法的序列,当 \(n\) 变大后依然是合法的。可以据此二分答案。

二分答案后,考虑枚举首相 \(k\),然后枚举序列长度即可。同样由于 \(n\) 是 \(O(m)\) 的,得到 \(k \leq 10^\frac{15}{4} \leq 10^4\)。又因为序列长度是 \(O(\log m)\) 的,因此求方案数的总复杂度是 \(O(\log m 10^\frac{\log m}{4})\)。

因此总的时间复杂度是 \(O(10^{\frac{\log m}{4}} \log^2 m)\)。

#include <cstdio>

typedef long long int ll;

ll m, ans;

ll calc(const ll n);

int main() {
  freopen("thief.in", "r", stdin);
  freopen("thief.out", "w", stdout);
  qr(m);
  for (ll l = 1, r = 1000000000000000000ll, mid = 1000000000ll; l <= r; mid = (l + r) >> 1) {
    if (calc(mid) >= m) {
      ans = mid; r = mid - 1;
    } else {
      l = mid + 1;
    }
  }
  qw(calc(ans) == m ? ans : -1, '\n', true);
  return 0;
}

ll calc(const ll n) {
  ll _ret = 0;
  for (int k = 2; ; ++k) {
    ll cnt = 0;
    for (ll i = n; i; i /= k) {
      if ((++cnt) >= 4) { _ret += i; }
    }
    if (cnt < 4) break;
  }
  return _ret;
}

C 盘子

Description

给定 \(n\) 个圆,第 \(i\) 个圆的半径为 \(r_i\),又有 \(m\) 个间距为 \(1\) 且排成一排的点,要求以这些点作为这 \(n\) 个圆的圆心,且圆之间两两不相交但允许相切,求方案数对大质数取模的结果。

Limitations

\(100\%\) \(3 \leq n \leq 4000,~m \leq 10^9, r_i \leq 10^5\)

\(60\%\) \(3 \leq n \leq 100,~~m \leq 200\)

\(30\%\) \(2 \leq n \leq 5,~~m \leq 30\)

Solution

前 \(30\%\) 爆搜即可。时间复杂度 \(C_{m}^{n}\)。

对于 \(60\%\) 的数据,考虑只考虑圆心所在的直线,则问题转化为了给定一堆线段,求互不相交的安放方案数。

考虑把一段长度为 \(1\) 的空白也看做一个元素,则问题转化为了有重复元素的全排列数,套公式即可。

注意到最两边的线段是可以有至多一半露在外面的,考虑枚举这两端的元素,然后枚举他们有多少露在外面,暴力算每种情况的方案数公式,注意到露在外面的每向里 \(1\) 的长度时,这种情况的方案数可以 \(O(1)\) 维护,这样就得到了一个 \(O(n^3 + n^2 r)\) 的做法,然后注意到两侧线段向里移动的过程中,每个数字在公式中产生的贡献是可以 \(O(1)\) 计算的,因此得到了一个 \(O(n^3 + n^2 \times poly(\log))\) 的做法,但是没调出来。

原文地址:https://www.cnblogs.com/yifusuyi/p/11682102.html

时间: 2024-10-16 04:31:10

10月15日模拟赛题解的相关文章

8月15日模拟赛小结

今天的模拟赛是三道陈老师的题. 在 10:48 左右已经都能拿到了. 然后我觉得 T3 的蒙特卡洛算法不太稳, 于是调大参数. 本地不开 O2 需要 5s 左右, 开 O2 测需要 2s , 而时限是 3s . 我想着 XSY 也开了 O2 , 所以稳了. 结果比赛结束 T3 全部 TLE ..... 中途还犯了一次A题代码交到B题的错误. ZJT大爷说我从第 2 调到了倒数第 1 , QAQ . 得出结论: ① 很多评测机可能很辣鸡. 所以如果对于随机化算法之类的, 能开大迭代次数的标准是:

关于10月16日模拟赛的心得与感悟

终于写到今天了... 第一题:纯水题,送分.模拟即可 第二题:最短路径. 大概题意是给出两个点的编号和n个点的坐标.要求每个点经过一次,0点允许经过两次.其中有三个限制条件: 1.从A走到B时,只能由横坐标小的点走到大的点.2.由B回到A时,只能由横坐标大的点走到小的点.3.有两个特殊点b1和b2,b1在0到n-1的路上,b2在n-1到0的路上. 可以运用动规的思想,定义dp[i][j].表示了第一条线路最前端为i , 第二条线路最前端为j 的最小路径长度. 每次更新时,取出 k = max(

2015年10月15日项目经理中项作业(质量管理与人力资源管理)

2015年10月15日作业(10.11章) 10章.质量管理: 1.项目质量规划的方法/技术和工具,并简要描述: 效益/成本分析 基准比较 流程图 实验设计 质量成本分析 质量功能展开(QFD) 过程决策程序图法(PDPC) 2.项目质量保证的方法/技术和工具,并简要描述: 项目质量管理通用方法(     ) 过程分析 项目质量审计 3.项目质量控制的方法/技术和工具,并简要描述: 测试 检查 统计抽样 6σ 因果图 流程图 直方图 检查表 散点图 排列图 控制图 相互关系图 亲和图 树状图 矩

10月15日 | 云栖大会“淘宝移动技术实践&开放论坛”来了!

参会报名链接:http://click.aliyun.com/m/6251/ 顺应移动互联网消费升级趋势, 淘宝作为移动领域的大型航母, 业务上取得了突飞猛进的发展. 月活用户3亿+,平均每天打开7次, 不再限于购物,更是社交商业平台, 这,就是今天的淘宝. 在业务飞跃的背后, 淘宝移动技术经历了全面升级, 不断推动业界研发模式持续发展. 淘宝移动技术 三大容器,五大解决方案首次整体亮相! Atlas(动态部署).ACCS(网络) Weex.手淘直播等等这些技术 在淘宝的最佳实践.发展动向和未来

【每日圣经日历】2014年10月15日

注:移动用户(特别是苹果(Ipad))可以全选文字使用机器朗读 Mercredi le 15 Octobre 2014 礼拜三 2014年10月15日 Et à la neuvième heure, Jésus s'écria d'une voix forte: lo, lo, lama sabachthani? ce qui signifie: Mon Dieu, mon Dieu, pourquoi m'as-tu abandonné?                            

10月15日全球六大国际域名解析量变化情况统计报告

IDC评述网(idcps.com)10月19日报道:根据DailyChanges公布的实时数据显示,截止至2015年10月15日,全球六大国际域名总解析量保持上扬趋势,环比净增10月8日182,279个,升至155,134,087个.另外,域名解析量实现上涨有.COM..NET..ORG与.INFO,环比增加2个. (图1)全球六大国际域名解析量变化统计分布图 如图1所示,在10月15日,全球六大国际域名新增.减少.转移的解析量所分布区域,相比上期10月8日,无明显变化.其中,.COM相对突出,

20141015,微软10月15日发布8个安全补丁

大家好,我们是微软大中华区安全支持团队. 微软于北京时间2014年10月15日发布了8个新的安全公告,其中3个为严重等级,5个为重要等级,共修复Windows,Office. NET Framework. ASP.NET和Internet Explorer (IE)中的24个漏洞.与以往一样,我们推荐您安装所有更新,对于暂时只采用部分更新的用户,我们推荐您首先部署等级为"严重"的安全公告. 其中MS14-056可解决 Internet Explorer 中 14 个秘密报告的漏洞.最严

6月15日至10月15日ACM训练计划

暑期又要开始了,去年荒废了一个暑假,不仅玩得不爽,更重要的是毁了自己的ACM之路,今年并不能像去年那样毫无顾忌的刷题了,毕竟有考研这座大山在这儿,但是为了研一那一点点的希望之火,考研第一,但也要抽出时间ACM,每天我大概11点回寝室,那我就限定自己在回寝室之后每天用一个半小时时间刷题吧,虽然进步会很慢,但是坚持下去总是会有收获的,前些天,在刷一些基础的数据结构,虽然这些算法自己以前都学过,但是在刷一遍,肯定会有不同的收获,特别是从理解的深度和难度上来说,我觉得对自己都是很有好处的. 我的三本AC

邓垦同志10月15日在深圳逝世 享年106岁o4

前者的本质是扩大社会安全网覆盖面,后者的原因是美国公共债务急速增加,均说明其财政政策是以刺激需求为主.店内的FONDANTCAKES可根据客人喜欢的口味挑选糕体和夹心的口味.现在已上高三的宋禹鹏是于小虎最早带的一批学员.必须紧紧依靠人民推动改革,党的十八届三中全会的这一重要论述,开宗明义地回答了改革"为了谁,依靠谁"的根本问题.每日经济新闻记者 查道坤 发自南京编 者 按救还是不救,这是一个问题.张书宝说,他以前是个木工,妻子也有一份工作.记者了解到,原来问题的根子出在广场噪音上面.市