首页 > 其他分享 >CF2006D Iris and Adjacent Products

CF2006D Iris and Adjacent Products

时间:2024-09-09 17:24:39浏览次数:5  
标签:Iris dfrac 大值 sqrt 次数 相乘 Products CF2006D 二类

题意

https://codeforces.com/contest/2006/problem/D

分析

考虑如果没有修改怎么重排最优。先把最大值丢进序列,再把最小值丢进序列,再把次大值丢进序列,再把次小值压进去,以此类推。感性理解的话不难发现这是最优情况,具体证明可以考虑调整法(但我懒)。

令 \(b\) 为 \(a\) 排序后的结果,那么 \(\max a_i\cdot a_{i+1}=\max b_i\cdot b_{n-i+1}\),简而言之就是 \(k\) 大值乘 \(k\) 小值的乘积最大值。如果 \(n\) 为奇数那么最中间的那个数没用。

如果要修改的话,显然要把当前最大值修改为 \(1\),然后就变成了 \(k+2\) 大值和 \(k\) 小值的乘积最大值。

那么一个三方暴力就呼之欲出了:若一个 \(p\) 大值和一个 \(q\) 小值(满足 \(p\ge q\))的乘积大于 \(k\),那么修改次数就需要至少为 \(\dfrac{p-q}{2}+1\),最终答案就是对所有的 \(\dfrac{p-q}{2}+1\) 取 max。注意这里不需要讨论 \(p-q\) 是奇数的情况,因为此时乘积大于 \(k\) 那么 \(p\leftarrow p+1\) 后乘积更大且修改次数不变。

当然这个暴力很容易优化成平方 log,但对正解没啥启发作用。

发现 \(k\) 很小,结合乘法运算的性质,考虑根号分治,把 \(\le \sqrt k\) 的数分为一类(称之为第一类),\(>\sqrt k\) 的数分为一类(称之为第二类)。显然两个第二类的数相乘必定大于 \(k\),两个第一类的数相乘必定小于 \(k\)。考虑把第二类的数重标号,将 \(x\) 重标号为 \(\sqrt k+\lfloor\dfrac{k}{x}\rfloor\),表示这个数在和第一类数中大于 \(\dfrac{k}{x}\) 的数相乘会大于 \(k\),加上 \(\sqrt k\) 只是为了区分第一类数。不难发现此时不同的数种类只有 \(2\sqrt k\) 个。

考虑询问。由于不同的数种类只有 \(2\sqrt k\) 个,所以我们完全可以把区间内每种数的出现次数存下来,跑一遍前缀和就可以知道值域在某段区间内的数的个数。

分类讨论:

  • 两个二类数相乘(前提是需要有至少两个二类数):把排名最小的二类数和排名最大的二类数相乘,能让修改次数卡满。
  • 一类数和二类数相乘:枚举每个二类数 \(x\),求出排名最大的 \(x\) 以及所有 \(>x-\sqrt k\) 的数中排名最小的 \(y\),能让修改次数卡满。

但是,如果维护出 \(s_{c,i}\) 表示前缀 \(i\) 中 \(c\) 的出现次数的话是 \(O(n\sqrt k)\) 的,空间开不下。一种容易想到的方法是考虑莫队维护每种数的出现次数,时间复杂度 \(O(n\sqrt n+q\sqrt k)\),空间复杂度 \(O(n+q+\sqrt k)\),可以通过。

代码:https://codeforces.com/contest/2006/submission/278952523

标签:Iris,dfrac,大值,sqrt,次数,相乘,Products,CF2006D,二类
From: https://www.cnblogs.com/dcytrl/p/18404878

相关文章

  • 题解:AT_arc116_b [ARC116B] Products of Min-Max
    在题库里面乱翻,就翻到了。因为在这道题里面子序列不需要考虑元素顺序,所以原序列无论是什么顺序都不会影响答案。所以先把元素按照从大到小的顺序排列,然后考虑每个元素的贡献。在当前序列中,对于元素\(a_i\),不妨设其为最小值,并去寻找它能作为哪些序列的最小值。容易发现它作为最......
  • 一个练习项目,好玩的bbs-go-iris
    代码:packagemain/**goenv-wGO111MODULE=ongoenv-wGOPROXY=https://goproxy.cngomodinitgosgomodtidygomodvendor*/import("crypto/md5""database/sql""fmt""log""math"......
  • 鸢尾花(Iris)数据集来训练一个分类器
    安装必要的库首先,确保你已经安装了scikit-learn和pandas库。如果没有安装,可以使用以下命令:pipinstallscikit-learnpandas代码示例importpandasaspdfromsklearn.datasetsimportload_irisfromsklearn.model_selectionimporttrain_test_splitfromsklearn.ens......
  • [ABC132F] Small Products 题解
    题意一句话题意不用再翻译了吧。思路先考虑朴素的dp,设\(dp_{i,j}\)表示长度为\(i\)结尾数字为\(j\)的序列的方案数,状态很好转移:\[dp_{i,j}=\sum_{a=1}^{\lfloor\frac{N}{j}\rfloor}dp_{i-1,a}\]这样时间复杂度是\(\Theta(nk)\)的,显然过不了。考虑优化这个dp。......
  • Leetcode: 1484. Groups Sold Products By The Date
    题目要求如下:输入的数据为要求按照日期查询出每日销售数量及相应产品的名称,并按照字符顺序进行排序。下面是实现的代码:importpandasaspddefcategorize_products(activities:pd.DataFrame)->pd.DataFrame:val=activities.drop_duplicates().groupby("sell......
  • SciTech-Mathematics-Probability+Statistics-Dot products, cosine similarity, text
    Dotproducts,cosinesimilarity,textvectorshttps://dev.to/sayemmh/dot-products-cosine-similarity-text-vectors-2lo4SayemHoque,PostedonOct20,2022Dotproducts,cosinesimilarity,textvectorsCosinesimilarityisameasurebetweentwosingledimen......
  • D. Maximum Sum of Products
    链接https://codeforces.com/problemset/problem/1519/D题目分析总的来说不算难的一道题,主要是敢写就行,控制在O(n^2),枚举中心点,分成两类:一类是奇数,一类是偶数对称就行。代码#define_CRT_SECURE_NO_WARNINGS#include<iostream>#include<vector>#include<algorithm>#in......
  • [题解]AT_arc116_b [ARC116B] Products of Min-Max
    思路我们容易可以得到一个朴素的做法,首先对\(a\)数组排序,然后枚举最大值和最小值\(a_i,a_j\),那么对于中间的元素都有选与不选两种情况,得到答案:\[\sum_{i=1}^{n}(a_i\timesa_i+(\sum_{j=i+1}^{n}a_i\timesa_j\times2^{j-i-1}))\]然后对这个式子......
  • 题解/算法 {J - Iris‘ Food}
    题解/算法{J-Iris’Food}@LINK:https://codeforces.com/gym/105184;比如最终答案是:10...01...12...23...3,则其值为1*10^?+(1...1)*10^?+(2...2)*10^?...;因此,如何求2....2这个值(长度为1e9),使用矩阵优化DP,DP定义为:DP[i]:长度为i的2...2的大......
  • tensorflow.js示例笔记 - iris
    根据鸢尾花的数据对花进行分类,使用神经网络对结构化(表格)数据进行分类。index.html<html><head><metacharset="UTF-8"><metaname="viewport"content="width=device-width,initial-scale=1"><linkrel="......