首页 > 其他分享 >[每日 B] Kevin and Geometry

[每日 B] Kevin and Geometry

时间:2025-01-21 10:12:09浏览次数:1  
标签:suf val Geometry 每日 int flag MAXN Kevin lld

前言

想着能做的题也不多, 直接当每日一练的形式写就好了

心态放平, 冷静利用时间

思路

转化题意

考虑一个等腰梯形的性质
pEA9NhF.png

朴素的想法是, 枚举 \(b\) , 枚举 \(c < b\) , 然后计算是否有对应的 \(a\) 满足 \(\exists a, \exists a + 2c\) , 特判 \(c = 0\)

这样直接爆炸, 考虑优化

考虑预处理出每个数作为 \(c\) 时的合法性, 也就是差值为 \(2c\) 的存在性问题
发现可以用差分数组的前后缀 \(\min\) 解决

具体一点, 如果存在 \(a + 2c - a < 2b\) 即可满足要求
考虑枚举 \(b\) , 然后判断是否存在差值 \(2c\) , 满足 \(c < b\)

需要注意的是跨过了两个 \(b\) 的处理, 即前后缀合并

实现

#include <bits/stdc++.h>
#define int long long
const int MAXN = 2e5 + 20;

int n;
int val[MAXN];
int dif[MAXN], pre[MAXN], suf[MAXN];


signed main()
{
    int t; scanf("%lld", &t);
    while (t--) {
        scanf("%lld", &n);
        for (int i = 1; i <= n; i++) scanf("%lld", &val[i]); std::sort(val + 1, val + n + 1);
        for (int i = 1; i < n; i++) dif[i] = val[i + 1] - val[i], pre[i] = suf[i] = 0;
        pre[0] = 0x3f3f3f3f; for (int i = 1; i < n; i++) pre[i] = std::min(pre[i - 1], dif[i]);
        suf[n] = 0x3f3f3f3f; for (int i = n - 1; i >= 1; i--) suf[i] = std::min(suf[i + 1], dif[i]);
        bool flag = false;
        for (int i = 1; i < n; i++) {
            if (val[i] != val[i + 1] || flag) continue;
            /*判断前缀*/
            if (i > 2) {
                /*出现答案*/
                if (pre[i - 2] < val[i] * 2) {
                    flag = true;
                    for (int j = 1; j < i - 1; j++) if (dif[j] == pre[i - 2]) { printf("%lld %lld %lld %lld\n", val[i], val[i + 1], val[j], val[j + 1]); break; }
                }
            }
            if (flag) continue;
            /*判断后缀*/
            if (i < n - 2) {
                /*出现答案*/
                if (suf[i + 2] < val[i] * 2) {
                    flag = true;
                    for (int j = i + 2; j < n; j++) if (dif[j] == suf[i + 2]) { printf("%lld %lld %lld %lld\n", val[i], val[i + 1], val[j], val[j + 1]); break; }
                }
            }
            if (flag) continue;
            /*判断前后缀*/
            if (i > 1 && i < n - 1) {
                if (val[i + 2] - val[i - 1] < val[i] * 2) {
                    flag = true;
                    printf("%lld %lld %lld %lld\n", val[i], val[i + 1], val[i - 1], val[i + 2]); break;
                }
            }
        }
        if (!flag) printf("-1\n");
    }

    return 0;
}

总结

常见的求差值存在性问题的方法, 可以转化成差分数组的形式
本质上是利用了最小的存在差值必定从相邻两项的差中产生

注意转化问题的方式
常见的类似前后缀的判断方式

标签:suf,val,Geometry,每日,int,flag,MAXN,Kevin,lld
From: https://www.cnblogs.com/YzaCsp/p/18683036

相关文章

  • 每日进步一点点(网安)
    一、XSS-labs1.什么是XSSXSS是“Cross-SiteScripting”(跨站脚本攻击)的缩写,为了与层叠样式表(CSS)区分开来,故简称为XSS。它是一种常见的web安全漏洞,攻击者利用该漏洞在目标网站上注入恶意脚本,当用户访问该网站时,这些恶意脚本就会在用户的浏览器中执行,从而达到窃取用户信息......
  • 力扣 739. 每日温度
    ......
  • 每日学习30分轻松掌握CursorAI:Cursor AI使用技巧总结
    CursorAI使用技巧总结一、学习回顾与最佳实践总结1.快捷键使用总结表类别快捷键功能描述代码生成Ctrl+K通过自然语言生成代码代码补全Tab接受代码建议代码重构Ctrl+R重命名变量/函数AI对话Ctrl+L打开AI对话窗口代码导航Ctrl+P快速文件切换终端操作Ctrl+`打开......
  • 高级java每日一道面试题-2025年01月20日-数据库篇-并发事务带来哪些问题?
    如果有遗漏,评论区告诉我进行补充面试官:并发事务带来哪些问题?我回答:并发事务带来的主要问题在多用户环境中,多个事务可能同时对数据库进行读写操作,这可能导致以下几种常见的并发问题:1.脏读(DirtyRead)定义:当一个事务能够读取到另一个未提交事务的数据修改时,称为......
  • 高级java每日一道面试题-2025年01月19日-框架篇[Mybatis篇]-MyBatis 中见过什么设计模
    如果有遗漏,评论区告诉我进行补充面试官:MyBatis中见过什么设计模式?我回答:1.工厂模式(FactoryPattern)定义:工厂模式是一种创建型模式,它提供了一种创建对象的最佳方式,将对象创建过程抽象化,从而提高代码的可维护性和灵活性。在MyBatis中的应用:SqlSessionFactoryBui......
  • [每日 C] No Prime Differences
    思路首先转化题意构造转化个蛋你发现\(n,m\)只要有一个不是质数,构造就是简单的考虑\(n,m\)都是质数的情况:你可以如下构造\[\begin{bmatrix}1&2&3&\cdots&m-1&m\\m+2&m+3&m+4&\cdots&m&m+1\\2m+3&2m+4&......
  • [每日 C] MEX Game 1
    前言泻药,吉司机线段树学不动冷静的利用时间已经变成了不冷静的浪费时间,干脆打两道\(\rm{C}\)冷静一下思路看到\(\rm{MEX}\)了,无敌,看到\(2,1,0\)了,无敌但是应该不是这个方向先转化题意\(\textrm{Alice,Bob}\)轮流进行游戏,\(\textrm{Alice}\)每次取......
  • 每日一题:奶牛排队
    题目链接:https://www.luogu.com.cn/problem/P6510题目描述:奶牛在熊大妈的带领下排成了一条直队。显然,不同的奶牛身高不一定相同……现在,奶牛们想知道,如果找出一些连续的奶牛,要求最左边的奶牛A是最矮的,最右边的B是最高的,且B奶牛高于A奶牛。中间如果存在奶牛,则身高不能和A,B奶牛......
  • 【练习】力扣热题 100 每日温度
    题目给定一个整数数组temperatures,表示每天的温度,返回一个数组answer,其中answer[i]是指对于第i天,下一个更高温度出现在几天后。如果气温在这之后都不会升高,请在该位置用0来代替。示例1:输入:temperatures=[73,74,75,71,69,72,76,73]输出:[1,1,4,2,1,1......
  • [CF2048F] Kevin and Math Class 题解
    注意到这里有个区间的\(b_i\)最小。我们考虑每个\(b_i\)作为最小的时候各操作几次。显然每个\(b_i\)的【操作区间】更长是不劣的。于是这些个\(b_i\)是可以打成笛卡尔树,进行DP。想到这一点,DP便是不难的了。定义\(f_{i,j}\)为以\(i\)为根的子树内,最优操作后最大值......