CF2063D Game With Triangles

小清新三分,有几个细节赛时没有调完,遗憾离场,破防了。

注意到如果我们可以求 \(f(k)\),那么 \(k_{\text{max}}\) 只需要一直枚举 \(k\) 直到 \(f(k)\) 求不出来为止,因此我们直接考虑求 \(f(k)\)。

我们考虑枚举在 \(y=0\) 选择三角形的底边数量 \(x\),注意到答案关于 \(x\) 是单峰的。因为如果 \(x\) 不够多,可能 \(y=0\) 上一些距离较远的点无法被利用,如果 \(x\) 太多了,可能 \(y=2\) 上一些距离较远的点无法被利用。如果赛时不敢确定可以打个表看看。

考虑如何快速计算。我们可以预处理出来 \(y=0\) 和 \(y=2\) 上距离前 \(i\) 大的点两两匹配后得到的贡献,因为我们可以贪心地取这些点对使答案最大。然后取三角形需要另一条线段也贡献一个点,我们判断一下 \(y=0\) 和 \(y=2\) 两条线段上用的总点数,如果有一个超了,直接返回负无穷表示不成立。

现在唯一的问题是答案左右两边有一些不成立的位置,如果全部返回负无穷,我们无法确定该舍去哪一段。也就是说,这个函数并不是严格单峰。因此,我们在负无穷上面加上一些东西,使得答案变成严格单峰。具体的,我们可以通过使其不成立的条件判断出来是左边的不成立还是右边的不成立,如果是左边的不成立,那么返回负无穷加上 \(x\),否则返回负无穷加上 \(k-x\)。

还有一些坑点,重复地元素需要特判,以及三分遇到相等的点应该舍左边而不是舍右边。

#include <bits/stdc++.h>
using namespace std;
long long t,n,m,a[300000],b[300000],pa[300000],pb[300000],ou[300000];
long long check(long long x,long long k)
{
if((x*2+k-x)>n||pa[x]==-1e18)return -(long long)1e18+k-x;
if((x+(k-x)*2)>m||pb[k-x]==-1e18)return -(long long)1e18+x;
return pa[x]+pb[k-x];
} int main()
{
scanf("%lld",&t);
while(t--)
{
scanf("%lld%lld",&n,&m);
for(int i=1;i<=n;i++)scanf("%lld",&a[i]);
for(int i=1;i<=m;i++)scanf("%lld",&b[i]);
sort(a+1,a+n+1),sort(b+1,b+m+1);
for(int i=1;i<=max(m,n);i++)pa[i]=pb[i]=-1e18;
for(int i=1;i<n-i+1;i++)
if(a[n-i+1]!=a[i])pa[i]=pa[i-1]+a[n-i+1]-a[i];
else break;
for(int i=1;i<m-i+1;i++)
if(b[m-i+1]!=b[i])pb[i]=pb[i-1]+b[m-i+1]-b[i];
else break;
long long flag=0;
for(int i=1;i<=max(m,n);i++)
{
long long l=0,r=i,ans=-1e18;
while(l<=r)
{
long long lmid=(l*2+r)/3,rmid=(l+r*2)/3;
if(check(lmid,i)>check(rmid,i))ans=max(ans,check(lmid,i)),r=rmid-1;
else ans=max(ans,check(rmid,i)),l=lmid+1;
}
ou[i]=ans;
if(ou[i]<0)
{
printf("%d\n",i-1),flag=i-1;
for(int j=1;j<=i-1;j++)printf("%lld ",ou[j]);
break;
}
}
if(flag)printf("\n");
}
return 0;
}

CF2063D Game With Triangles 题解的更多相关文章

  1. codechef Chef and The Right Triangles 题解

    Chef and The Right Triangles The Chef is given a list of N triangles. Each triangle is identfied by ...

  2. [USACO20FEB]Equilateral Triangles P 题解

    优雅的暴力. 设三个点为 \((i,j,k)\),则有 \(6\) 个未知数即 \(x_i,x_j,x_k,y_i,y_j,y_k\).又因为有 \(2\) 条关于这 \(6\) 个未知数的方程 \( ...

  3. Codeforces Gym 100015F Fighting for Triangles 状压DP

    Fighting for Triangles 题目连接: http://codeforces.com/gym/100015/attachments Description Andy and Ralph ...

  4. Codeforces Round #309 (Div. 1) C. Love Triangles dfs

    C. Love Triangles Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://codeforces.com/contest/553/pro ...

  5. Codeforces Round #308 (Div. 2) D. Vanya and Triangles 水题

    D. Vanya and Triangles Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://codeforces.com/contest/55 ...

  6. Project Euler 91:Right triangles with integer coordinates 格点直角三角形

    Right triangles with integer coordinates The points P (x1, y1) and Q (x2, y2) are plotted at integer ...

  7. CodeForces 682E Alyona and Triangles (计算几何)

    Alyona and Triangles 题目连接: http://acm.hust.edu.cn/vjudge/contest/121333#problem/J Description You ar ...

  8. Little Zu Chongzhi's Triangles

    Little Zu Chongzhi's Triangles Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 512000/512000 ...

  9. POJ1569 Myacm Triangles

    Description There has been considerable archeological work on the ancient Myacm culture. Many artifa ...

  10. hdu 5784 How Many Triangles 计算几何,平面有多少个锐角三角形

    How Many Triangles 题目连接: http://acm.hdu.edu.cn/showproblem.php?pid=5784 Description Alice has n poin ...

随机推荐

  1. JAVA基础之多线程一期

    一.并发与并行的区别 并发:指同一时间段,两个或多个事件交替进行 并行:指同一时间段,两个或多个事件同时进行 二.进程与线程的区别 进程:正在内存中运行的程序就是进程 线程:线程归属于进程,它是进程中 ...

  2. python,设置windows系统时间

    老笔记本纽扣电池没电了,每次拔掉电源再重新开机时间就对不上了,然后写个python脚本开机后执行对时吧 脚本直接网上复制的,比较简单,貌似时访问www.baidu.com获取头信息里的时间,然后设置为 ...

  3. vscode配置xdebug断点调试thinkphp

    vscode配置xdebug断点调试thinkphp其实和配置其他php框架的断点调试一样,步骤如下: 下载xdebug,重命名为php_xdebug.dll并移动到php.ini目录: (不知道下载 ...

  4. hadoop集群搭建(亲测笔记)

    ------步骤: 准备3台机器 同步时间 配置主机名 配置主机名ip映射 免密登录 关闭防火墙 搭建zookeeper集群 搭建hadoop 准备3台机器 我通过VMware workstation ...

  5. coreJava笔记——1

    一.数组 对于数组的操作: 1.System.arrayopy(旧数组,下表,新数组,下表,长度) 2.新对象 = Arrays.copyOf(旧数组,长度): \如果要删除数组中的一个元素,先用1. ...

  6. Vue(10)——Vue组件二(data选项、局部组件、组件通信)

    Vue组件二--data选项.局部组件.组件通信 data选项 data选项用于储存组件数据 与实例data差别 必须存储在有返回值的函数当中 数据设置在返回值对象里 1.方式一 data:funct ...

  7. 在 Spring Boot 2 中集成 JCasbin 并实现 ClassPath 模型文件加载

    在 Spring Boot 2 中集成 JCasbin 并实现 ClassPath 模型文件加载 概述 在现代Web应用开发中,权限管理和认证是不可或缺的一部分.JCasbin 是一个强大的.高效的开 ...

  8. CentOS 7怎么开放端口

    转自:https://www.jb51.net/os/Ubuntu/617627.html 以开放8080端口为例,其他类似 centos7已经开始使用firewall作为防火墙,而不是iptable ...

  9. React错误边界:原理、实现与应用

    @charset "UTF-8"; .markdown-body { line-height: 1.75; font-weight: 400; font-size: 15px; o ...

  10. 传统的可扩展架构模式:分层架构和SOA

    极客时间:<从 0 开始学架构>:传统的可扩展架构模式:分层架构和SOA 分层架构 分层架构是很常见的架构模式,它也叫 N 层架构,通常情况下,N 至少是 2 层.例如,C/S 架构.B/ ...