吉姆的奇思妙想

题目描述

吉姆是个热爱算法竞赛的小朋友,平常的休闲活动就是刷 牛客网 的题目。
当吉姆刷到  wannafly挑战赛12 F.小H和圣诞树  这题时,颇为震惊,因为这是他第一次在wannafly挑战赛上看到作者提供的解答的时间复杂度的式子里含有根号的题目,于是吉姆就开始在网络上搜寻拥有类似时间复杂度解法的问题,并且看到了以下这题:

给你一个有 N 个点 M 条边的无向简单图,请算算此图中有几个三角形。我们称无序的三个点 x,y,z 为三角形,若且唯若 (x,y)、(y,z)、(x,z) 都是此图上的边。

吉姆 想了这个问题七天七夜后,他发现了一件事情:
(1) 对于任一个度数为 d 的点,我们可以用 O(d 2) 的时间复杂度来计算有多少三角形包含这该点。
吉姆 又想了这个问题七天七夜后,他又发现了一件事情:
(2) 对于任一个点,我们可以用 O(M) 的时间复杂度来计算有多少三角形包含该点。
吉姆又再想了这个问题十四天十四夜后,他忽然想到:
(3) 不如就把 (1) 和 (2) 的算法结合在一起!找一个恰当的整数s 若一个点度数小于等于s,就使用(1),否则就使用(2),经过缜密的时间复杂度分析,发现这么做的时间复杂度会是 ,取  ,时间复杂度就会是 。最后再把包含各个点的三角形数全部加起来再除以 3 就是答案了! (因为每个三角形会被算到三次。) (此时间复杂度的详细证明会在今天的题解中解说唷~)
但这个 s 的值究竟要设为多少呢?这就和 (1) 与 (2) 两种方法的执行时间的常系数有关了。
于是,吉姆为了透彻了解这个问题,就假定(1) 和(2) 的常系数分别是a 与b,这意思是:对于一个度数为d 的点,若使用(1),程式的执行时间和a×d 2 成正比;若使用(2),程式的执行时间则和b×M 成正比。
对于一个给定的图,吉姆想要知道对于不同的 a,b,s 的值要取多少比较好,并且求出 s 为该值时程式所需的执行时间!

在这个问题里,我们不会真的给你一个图,只会告诉你边数 M。并对于所有正整数 d,告诉你度数为 d 的点有几个。甚至,题目里给你的图不一定实际上存在的简单图(意即输入可能不是一个合法的简单图的度序列)。
大家好,以上是题目背景。(哈哈哈哈哈嚯嚯嚯嚯~)
给你两个正整数 M, L, 以及两个长度为 L 个正整数序列 deg 1,deg 2,..., deg L 和 freq 1, freq 2,..., freq L。
(deg i 和 freq i 对应到 Background 里提到的问题的意思就是:度数为 deg i 的点 有 freq i 个。)
你要回答 Q 个问题,第 i 个问题会给你 2 个正整数 a i, b i,请找到一个整数 s 使得以下式子(E i) 的值最小:
(此式就是 Background 里提到的程式执行时间的估计函数)

输入描述:

输入共有 1+L+1+Q 行。 第一行有有两个正整数 M,L。 接下来的 L 行中的第 i 行有两个正整数 degi 和 freqi。 下一行有一个正整数 Q。 最后 Q 行中的第 i 行有两个正整数 ai, bi。

输出描述:

对于每个询问都输出一行包含一个整数,代表式子 Ei 的最小值。
示例1

输入

5 4
1 1
2 1
3 1
4 1
5
1 1
3 2
2000 1
1 2000
2000 2000

输出

15
33
20
30
30000

说明

取 s=2 将會有 E1 的最小值:12×1+22×1+5×1+5×1=15。

备注:

1≤M≤1010,1≤L≤2×105,1≤degi,freqi≤1010,1≤Q≤5×104,1≤ai,bi≤2×103,对于所有 1≤i<L,都有 degi<degi+1
对于所有可能测试数据的答案都能使用 64 bit 有符号整数表示。

思路:可以用三分搜索解;

能用三分搜求极小值的充分条件是:该函数在我们会询问的定义域下,是先严格递减再严格递增。

于是我们来观察看看s = deg[ j ]和 s = deg[ j + 1 ]时,E[ i ]是如何变化的。

结果发现,它的变化量Δj是freg[ j ]*(a[ i ] * deg[ j ]*deg[ j ] - b[ i ]*M),而deg[ j ]是随着j增加而严格递增的序列,故Δj确实是先严格递减再严格递增。

代码:

#include<bits/stdc++.h>
#include<iostream>
#include<cstdio>
#include<string>
#include<algorithm>
#include<cmath>
#define ll long long
using namespace std;
const int maxn = 2*1e5+7;
ll M;
int L, Q;
ll deg[maxn], freq[maxn];
ll dp_front[maxn], dp_back[maxn];int main()
{memset(dp_front, 0, sizeof(dp_front));memset(dp_back, 0, sizeof(dp_back));scanf("%lld%d", &M, &L);for(int i = 1; i <= L; i++) scanf("%lld%lld", °[i], &freq[i]);for(int i = 1; i <= L; i++) dp_front[i] = dp_front[i - 1] + deg[i] * deg[i] * freq[i];for(int i = L; i > 0; i--) dp_back[i] = dp_back[i + 1] + M * freq[i];scanf("%d", &Q);while(Q--) {int a, b;scanf("%d%d", &a, &b);int it = upper_bound(deg + 1, deg + L + 1, (ll)sqrt(b*M/a)) - deg;printf("%lld\n", a*dp_front[it - 1] + b*dp_back[it]);}return 0;
}

牛客网练习赛15__吉姆的奇思妙想相关推荐

  1. 牛客网练习赛26B(简单的dp)

    题目链接:https://www.nowcoder.com/acm/contest/180/B 链接:https://www.nowcoder.com/acm/contest/180/B 来源:牛客网 ...

  2. 牛客网练习赛34-A题

    题目https://ac.nowcoder.com/acm/contest/297/A链接 链接:https://ac.nowcoder.com/acm/contest/297/A 来源:牛客网 不知 ...

  3. 牛客网练习赛34-b题

    题目链接https://ac.nowcoder.com/acm/contest/297/B 链接:https://ac.nowcoder.com/acm/contest/297/A?&head ...

  4. 牛客网练习赛44-B(快速幂+模拟)

    题目链接:https://ac.nowcoder.com/acm/contest/548/B 题意:计算m/n小数点后k1位到k2位,1≤m≤n≤109,1<=k1<=k2<=109 ...

  5. 牛客网练习赛7--购物 动态规划

    题意: 在遥远的东方,有一家糖果专卖店. 这家糖果店将会在每天出售一些糖果,它每天都会生产出m个糖果,第i天的第j个糖果价格为C[i][j]元. 现在的你想要在接下来的n天去糖果店进行选购,你每天可以 ...

  6. 三角形周长和【牛客网】牛客网练习赛60

    题目传送 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 262144K,其他语言524288K 64bit IO Format:%lld 题目描述 输入描述: 输入描述 第一行一个整 ...

  7. 牛客网练习赛24B 凤凰

    题目链接 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 262144K,其他语言524288K 64bit IO Format: %lld 题目描述 凤凰于飞,翙翙其羽,亦集爰止.凤 ...

  8. 牛客网练习赛36 Ribbit的数列 分块

    题目描述 Rabbit得到了一个长度为N的数列(数列编号从0到N−1).数列中每个数vali满足1<=vali<=C. 初始时数列中每个数均为1,现在Rabbit要对这个数列进行Q次操作, ...

  9. 牛客网 牛客练习赛13 A.幸运数字Ⅰ

    A.幸运数字Ⅰ 链接:https://www.nowcoder.com/acm/contest/70/A 来源:牛客网 水题. 代码: 1 #include<iostream> 2 #in ...

最新文章

  1. PAT 1041. 考试座位号(15)
  2. python在线-python+在线
  3. 使用FIR.im发布自己的移动端APP
  4. 语言专升本必背代码_2020年【山西省专升本】,专升本专业与考试科目,专升本招生院校,专升本报名流程大全!...
  5. Laravel源码解析之从入口开始
  6. c# socket接收字符串_socket通信很难?这一文让你轻松搞定!
  7. Linux批量部署 EXPECT 使用
  8. 正则表达式入门之字符匹配
  9. 大学计算机一级word,大学计算机基础一级考试复习资料
  10. Java 并发编程之同步工具类闭锁 CountDownLatch
  11. Cortex-M0(3)---ARM Cortex-M0 异常与中断
  12. 华为Mate 50系列明年亮相:或首发高通骁龙898 4G芯片
  13. ROS学习笔记10(创建一个ROS消息和服务)
  14. python数据挖掘学习路线
  15. 百旺如何看是否清卡_清卡失败增值税未申报或未对比怎么办
  16. 怎么关闭服务器管理器自动启动,用 systemctl 管理服务:查看状态、启动/停止服务、开启/取消开机自启动...
  17. Python pip时遇到的no moudle问题
  18. 加盟连锁如何降低风险?
  19. termux 安装 kali
  20. list中移除元素:用remove(i)方法遇到的坑以及替代方法

热门文章

  1. Oculus Rift S丨(五)实现将UI放在眼前、与UI交互
  2. SQL Server Management Studio中访问EXCEL 2007(XLSX)文件的方法
  3. D3二面体群的本原中心幂等元
  4. struct ifreq 学习,现实ifconfig 功能
  5. WebStorm破解版安装教程
  6. javascript获得元素的尺寸和位置一 : offsetTop/Left、offsetWidth/Height、offsetParent
  7. Halcon之畸变标定Grid-Rectification
  8. 全球及中国汽车用热固性复合材料行业发展趋势分析及十四五规模预测报告2021年版
  9. #CSDN21天学习挑战赛#Python入门之pdfplumber模块——自动化操作PDF文件详细教程(2)
  10. 一款根据图片内的文字,把图片分类的软件