Atcoder ABC364 D-F
Atcoder ABC364 D-F
D - K-th Nearest
链接:
简要题意:
问题陈述
在一条数线上有 \(N+Q\) 个点 \(A_1,\dots,A_N,B_1,\dots,B_Q\) ,其中点 \(A_i\) 的坐标为 \(a_i\) ,点 \(B_j\) 的坐标为 \(b_j\) 。
请就每个点 \(j=1,2,\dots,Q\) 回答下面的问题:
- 设 \(X\) 是 \(A_1,A_2,\dots,A_N\) 中最靠近点 \(B_j\) 的 \(k_j\) 点。求点 \(X\) 与 \(B_j\) 之间的距离。更正式地说,设 \(d_i\) 是点 \(A_i\) 与 \(B_j\) 之间的距离。将 \((d_1,d_2,\dots,d_N)\) 按升序排序,得到序列 \((d_1',d_2',\dots,d_N')\) 。求 \(d_{k_j}'\) .
思路:
- 找一个第k大的a中某个点与b的距离 d, 我们会发现一个性质:
- d越大,我们就会包含更多a中的数字 满足单调性
- 我们保证包含的数字>=k
- 然后最小化d
- 这即是二分
代码:
const int N = 200005;
int a[N];
void solve(){
int n,q;
cin >> n >> q;
for(int i = 1; i <= n;i++){
cin >> a[i];
}
sort(a+1,a+1+n);
while(q--){
int d,k;
cin >> d>>k;
int l = 0,r = 1e12,ans= 0;
while(l<=r){
int mid = (l + r) >> 1;
int ls = d - mid,rs = d + mid;
int qs = upper_bound(a+1,a+1+n,rs) - lower_bound(a+1,a+1+n,ls);
if(qs >= k){
r = mid - 1;
ans = mid;
}else{
l = mid + 1;
}
}
cout << ans << endl;
}
}
E - Maximum Glutton
链接:
E - Maximum Glutton (atcoder.jp)
简要题意:
\(N\) 道菜。这些菜肴的编号从 \(1\) 到 \(N\) ,菜肴 \(i\) 的甜度为 $$A_i$$ ,咸度为 \(B_i\) 。
你可以选择吃任意菜肴,吃过的菜肴的总甜度超过 \(X\) 或总咸度超过 \(Y\) ,他就不会再吃任何菜肴。
问最多吃多少道菜?
思路:
- 很明显想到dp
- 怎么dp? 设$$dp[i][j][k]$$为前i个菜肴不超过x并且不超过y的能获得的最大奖牌数?? ,根据数据量,这样定义显然不行
- 我们可以把奖牌数开一个维度,然后x开一个维度,记录消耗的y
- 转移方程即: $$dp[i][j][k] = min(dp[i][j][k],dp[i - 1][j - 1][k - a[i]] +b[i])$$
- 表示前i个数获得j个菜肴并且用了k个甜值所消耗的最小咸值
- 明显是个背包,所以倒序枚举,优化一维;
代码:
const int N = 200005;
int a[N],b[N];
void solve(){
int n,x,y;
cin >> n >> x >>y;
for(int i = 1;i<=n;i++){
cin >> a[i] >>b[i];
}
int dp[n + 1][x + 2];
for(int i = 0;i<=n;i++){
for(int j = 0;j<=x;j++){
dp[i][j] = inf;
}
}
dp[0][0] = 0;
for(int i = 1;i<=n;i++){
for(int c = i;c>=1;c--){
for(int k = x;k>=a[i];k--){
dp[c][k] = min(dp[c][k],dp[c-1][k-a[i]]+b[i]);
}
}
}
int ans = 0;
for(int i = 0;i<=n;i++){
for(int j = 0;j<=x;j++){
if(dp[i][j] <= y){
ans = max(ans,i);
}
}
}
cout << min(ans+1,n) <<endl;
}
F - Range Connect MST
链接:
[F - Range Connect MST (atcoder.jp)](https://atcoder.jp/contests/abc364/tasks/abc364_e)
简要题意:
有一个图,其顶点有 \(N + Q\)个 ,编号为 \(1, 2, \ldots, N + Q\) 。最初,该图没有边。
对于这个图,请依次对 \(i = 1, 2, \ldots, Q\) 执行以下操作:
- 对于每个满足 \(L_i \leq j \leq R_i\) 的整数 \(j\) ,在顶点 \(N + i\) 和 \(j\) 之间添加一条代价为 \(C_i\),的无向边。
完成所有操作后,确定图形是否相连。如果相连,求该图的最小生成树的代价。
思路:
- 首先数据量大,不能真正建边
- 集合分为两部分,第一部分是 $ 1, 2, \ldots, N$ 第二部分是 \(N+1,N+2, \ldots, N+Q\)
- 第二部分要想和第一部分连边 必定会用一次C的价值去连边 所以答案必定 有 \(\sum c\)
- 然后怎么让第一部分内部自己去连边呢,得靠第二部分去中转,我们可能会有多个l,r覆盖同一个区间,那么我们取最小值去连 l,l+1 等边,即是最小的生成树
- 此部分可用并查集实现
- 因为每个区间建完边后不会再访问
- 时间复杂度\(O(NlogN + QlogQ)\)
代码:
const int N = 2e5+5;
struct quarys{
int l,r,c;
bool operator<(const quarys &q)const{
return c < q.c;
}
}q1[N];
struct DSU {
vector<int> f, siz;
DSU() {}
DSU(int n) {
init(n);
}
void init(int n) {
f.resize(n);
iota(f.begin(), f.end(), 0);
siz.assign(n, 1);
}
int find(int x) {
while (x != f[x]) {
x = f[x] = f[f[x]];
}
return x;
}
bool same(int x, int y) {
return find(x) == find(y);
}
bool merge(int x, int y) {
x = find(x);
y = find(y);
if (x == y) {
return false;
}
siz[x] += siz[y];
f[y] = x;
return true;
}
int size(int x) {
return siz[find(x)];
}
};
int n,q;
void solve(){
cin >> n >> q;
ll ans = 0;
DSU dsu(n + 1);
for(int i = 0 ;i < q;i++){
int l,r,c;
cin >> l >> r >> c;
q1[i].l=l;
q1[i].r=r;
q1[i].c=c;
}
sort(q1,q1+q);
for(int i = 0;i < q;i++){
int l = q1[i].l,r=q1[i].r,c=q1[i].c;
ans+=c;
for(int x = dsu.find(l);x<r;x=dsu.find(x)){
ans+=c;
dsu.merge(x + 1,x);
}
}
if(dsu.find(1) != n){
cout << -1;
return;
}
cout << ans <<endl;
}
Atcoder ABC364 D-F的更多相关文章
- [atcoder contest 010] F - Tree Game
[atcoder contest 010] F - Tree Game Time limit : 2sec / Memory limit : 256MB Score : 1600 points Pro ...
- 【AtCoder】AGC022 F - Leftmost Ball 计数DP
[题目]F - Leftmost Ball [题意]给定n种颜色的球各k个,每次以任意顺序排列所有球并将每种颜色最左端的球染成颜色0,求有多少种不同的颜色排列.n,k<=2000. [算法]计数 ...
- 【AtCoder】AGC005 F - Many Easy Problems 排列组合+NTT
[题目]F - Many Easy Problems [题意]给定n个点的树,定义S为大小为k的点集,则f(S)为最小的包含点集S的连通块大小,求k=1~n时的所有点集f(S)的和取模92484403 ...
- 【AtCoder】ARC067 F - Yakiniku Restaurants 单调栈+矩阵差分
[题目]F - Yakiniku Restaurants [题意]给定n和m,有n个饭店和m张票,给出Ai表示从饭店i到i+1的距离,给出矩阵B(i,j)表示在第i家饭店使用票j的收益,求任选起点和终 ...
- 【AtCoder】ARC082 F - Sandglass
[链接]F - Sandglass [题意]给定沙漏A和B,分别装着a和X-a的沙子,开始时A在上B在下,每秒漏1,漏完不再漏.给定n,有n个时刻ai沙漏倒转.给定m个询问,每次询问给定初值a和时刻t ...
- atcoder square869120Contest#3 F 寿司
省选round1的时候dalao的推荐——atcoder的题目码量不大,但很巧妙,题目比较难找,挂个链冷静一下:http://s8pc-3.contest.atcoder.jp/tasks/s8pc_ ...
- 【题解】 AtCoder ARC 076 F - Exhausted? (霍尔定理+线段树)
题面 题目大意: 给你\(m\)张椅子,排成一行,告诉你\(n\)个人,每个人可以坐的座位为\([1,l]\bigcup[r,m]\),为了让所有人坐下,问至少还要加多少张椅子. Solution: ...
- 【AtCoder ARC076】F Exhausted? 霍尔定理+线段树
题意 N个人抢M个椅子,M个椅子排成一排 ,第i个人只能坐[1,Li]∪[Ri,M],问最多能坐多少人 $i$人连边向可以坐的椅子构成二分图,题意即是求二分图最大完美匹配,由霍尔定理,答案为$max( ...
- AtCoder abc 141 F - Xor Sum 3(线性基)
传送门 题意: 给出\(n\)个数\(a_i\),现在要将其分为两堆,使得这两堆数的异或和相加最大. 思路: 考虑线性基贪心求解. 但直接上线性基求出一组的答案是行不通的,原因之后会说. 注意到如果二 ...
- [题解] Atcoder AGC 005 F Many Easy Problems NTT,组合数学
题目 观察当k固定时答案是什么.先假设每个节点对答案的贡献都是\(\binom{n}{k}\),然后再减掉某个点没有贡献的选点方案数.对于一个节点i,它没有贡献的方案数显然就是所有k个节点都选在i连出 ...
随机推荐
- Java常用的十大开源工具类库总结
以下是个人总结的Java常用的十大开源工具类库,根据具体需求和项目,可以选择合适的工具类库来提高开发效率.1. Apache Commons:Apache Commons是一个开源的工具类库,提供了大 ...
- vue - ES6模块化、promise、webpack打包(所在在学的朋友们先看这篇,看了不吃亏)
首先我要说明一下,没错,还是没有进入vue,刘备请诸葛亮三次都可以了吧,我这也是第三次了,也绝对是最后一次了,我应经摸透了因为,最后的webpack打包加上一个git学了过后我就去vue了. 为什么要 ...
- 福利来了!MoneyPrinterPlus可以自动配置环境和自动运行了
之前开源了MoneyPrinterPlus,可以实现批量混剪视频,一键生成视频和自动发布视频的功能. 但是经常会看到小伙伴在安装过程中遇到很多问题.所以这篇文章的目的就是告诉大家怎么使用MoneyPr ...
- Quarkus初体验:动态加载和原生部署
在前面的文章<尝试官方的第一个SpringNative 0.11程序>中提到过Quarkus这门技术.这里就简单演示一下它的两个主要功能:Live Coding和Native Build. ...
- rgba和opacity的透明效果有什么不同?
rgba()和opacity都能实现透明效果,但最大的不同是opacity作用于元素,以及元素内的所有内容的透明度, 而rgba()只作用于元素的颜色或其背景色.(设置rgba透明的元素的子元素不会继 ...
- Docker下安装Nginx代理服务器【工作实操版】
一.Nginx下载 使用命令拉取nginx镜像到本地,此处我们获取排名第一的是官方最新镜像,其它版本可以去DockerHub查询 docker pull nginx 二.先启动一个nginx容器用于c ...
- 解决方案 | Windows 验证账号出现 0x80190001错误解决
一.问题描述 点击windows开始→账户→更改账户设置→验证,出现下面的错误. 二.解决方法 网上流行的是这个方法,https://blog.csdn.net/qq_36393978/article ...
- BootstrapTable 行内编辑解决方案:bootstrap-table-editor
最近开发的一个业务平台,是一个低代码业务平台.其中用到的了bootstrap-table组件.但是bootstrap-table自身不带编辑功能. 通过搜索发现,网上大部分的解决方案都是使用x-edi ...
- Linux安全启动及Machine Owner Key(UEFI BIOS MBR GPT GRUB)
PS:要转载请注明出处,本人版权所有. PS: 这个只是基于<我自己>的理解, 如果和你的原则及想法相冲突,请谅解,勿喷. 环境说明 无 前言 只要装过各种系统的人都或多或少会接触 ...
- Fiddler 使用fiddler无法抓取苹果手机https请求问题解决方案
使用fiddler无法抓取苹果手机https请求问题解决方案 by:授客 QQ:1033553122 测试环境 Win10 Fiddle4 IPhone6s 问题描述 使用fiddler抓取IPh ...