D2. Dances (Hard Version) Codeforces Round 905 (Div. 2)

2023-10-24 12:28

本文主要是介绍D2. Dances (Hard Version) Codeforces Round 905 (Div. 2),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

Problem - D2 - Codeforces

题目大意:有两个长度为n的数组a,b,给出一个数m,每次操作要删除a和b中的一个数然后将a,b按任意顺序排序,要求用最小的操作次数使对于任意的i都有a[i]<b[i],求a[1]=1~m时最小操作次数的和。

2<=n<=1e5.1<=m<=1e9;1<=a[i],b[i]<=1e9

思路:首先考察每次操作的最优策略是什么,首先数字顺序肯定两个数组都要最小到大排序,要让a小于b,那么应该优先删除a中最大的数和b中最小的数,要删除多少数可以从1到n二分枚举,因为删除更多的数肯定更容易满足条件,符合单调性,这样我们就得到了a[1]固定为某个数时的答案。

        我们令a[1]=1时的答案为ans,在我们增大a[1]到m的过程中,可以发现区别就是可能之前a[1]不用删,增大后要删,那么答案相差就是0或1,且操作次数是随着a[1]增大而增加的,所以我们可以二分枚举1到m找到答案+1的位置,也就是找到一个x使得a[1]=x时得到的答案与ans不同,这样前边的数量*ans后边的数量*(ans+1)就是最终的答案。

//#include<__msvc_all_public_headers.hpp>
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const ll MOD = 1e9 + 7;
const int N = 1e5 + 5;
ll n;
int a[N];
int temp[N];
int b[N];
bool check(int x)
{for (int i = 1; i <= n - x; i++){if (a[i] >= b[x + i]){//a中的前n-x个数和b中后n-x个数做对比return 0;}}return 1;
}
void init()
{}
void solve()
{cin >> n;int m;cin >> m;init();a[1] = 1;for (int i = 2; i <= n; i++){cin >> a[i];temp[i] = a[i];//复制一份a数组}for (int i = 1; i <= n; i++){cin >> b[i];}sort(a + 1, a + n + 1);sort(b + 1, b + n + 1);//将a和b按从小到大的顺序排序int l = 0, r = n, mid;ll ans;while (l <= r){//从1到n二分枚举操作次数mid = (l + r) >> 1;if (check(mid)){ans = mid;r = mid - 1;}else{l = mid + 1;}}l = 1, r = m;ll ans2 = m + 1;//初始化为m+1,没有枚举到答案不同的地方时,答案就是ans*mwhile (l <= r){//二分枚举a[1],找到操作次数改变的第一个位置for (int i = 1; i <= n; i++){a[i] = temp[i];}mid = (l + r) >> 1;a[1] = mid;sort(a + 1, a + n + 1);if (!check(ans)){ans2 = mid;r = mid - 1;}else{l = mid + 1;}}cout << (ans2-1)*ans+(m-ans2+1)*(ans+1);//两个操作次数分别乘以他们的数量cout << '\n';
}
int main()
{ios::sync_with_stdio(false);cin.tie(0);int t;cin >> t;//t = 1;while (t--){solve();}return 0;
}

这篇关于D2. Dances (Hard Version) Codeforces Round 905 (Div. 2)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/275138

相关文章

Codeforces Round #240 (Div. 2) E分治算法探究1

Codeforces Round #240 (Div. 2) E  http://codeforces.com/contest/415/problem/E 2^n个数,每次操作将其分成2^q份,对于每一份内部的数进行翻转(逆序),每次操作完后输出操作后新序列的逆序对数。 图一:  划分子问题。 图二: 分而治之,=>  合并 。 图三: 回溯:

Codeforces Round #261 (Div. 2)小记

A  XX注意最后输出满足条件,我也不知道为什么写的这么长。 #define X first#define Y secondvector<pair<int , int> > a ;int can(pair<int , int> c){return -1000 <= c.X && c.X <= 1000&& -1000 <= c.Y && c.Y <= 1000 ;}int m

Codeforces Beta Round #47 C凸包 (最终写法)

题意慢慢看。 typedef long long LL ;int cmp(double x){if(fabs(x) < 1e-8) return 0 ;return x > 0 ? 1 : -1 ;}struct point{double x , y ;point(){}point(double _x , double _y):x(_x) , y(_y){}point op

Codeforces Round #113 (Div. 2) B 判断多边形是否在凸包内

题目点击打开链接 凸多边形A, 多边形B, 判断B是否严格在A内。  注意AB有重点 。  将A,B上的点合在一起求凸包,如果凸包上的点是B的某个点,则B肯定不在A内。 或者说B上的某点在凸包的边上则也说明B不严格在A里面。 这个处理有个巧妙的方法,只需在求凸包的时候, <=  改成< 也就是说凸包一条边上的所有点都重复点都记录在凸包里面了。 另外不能去重点。 int

Codeforces 482B 线段树

求是否存在这样的n个数; m次操作,每次操作就是三个数 l ,r,val          a[l] & a[l+1] &......&a[r] = val 就是区间l---r上的与的值为val 。 也就是意味着区间[L , R] 每个数要执行 | val 操作  最后判断  a[l] & a[l+1] &......&a[r] 是否= val import ja

Maven创建项目中的groupId, artifactId, 和 version的意思

文章目录 groupIdartifactIdversionname groupId 定义:groupId 是 Maven 项目坐标的第一个部分,它通常表示项目的组织或公司的域名反转写法。例如,如果你为公司 example.com 开发软件,groupId 可能是 com.example。作用:groupId 被用来组织和分组相关的 Maven artifacts,这样可以避免

ural 1149. Sinus Dances dfs

1149. Sinus Dances Time limit: 1.0 second Memory limit: 64 MB Let  An = sin(1–sin(2+sin(3–sin(4+…sin( n))…) Let  Sn = (…( A 1+ n) A 2+ n–1) A 3+…+2) An+1 For given  N print  SN Input One

CSS实现DIV三角形

本文内容收集来自网络 #triangle-up {width: 0;height: 0;border-left: 50px solid transparent;border-right: 50px solid transparent;border-bottom: 100px solid red;} #triangle-down {width: 0;height: 0;bor

Jenkins 通过 Version Number Plugin 自动生成和管理构建的版本号

步骤 1:安装 Version Number Plugin 登录 Jenkins 的管理界面。进入 “Manage Jenkins” -> “Manage Plugins”。在 “Available” 选项卡中搜索 “Version Number Plugin”。选中并安装插件,完成后可能需要重启 Jenkins。 步骤 2:配置版本号生成 打开项目配置页面。在下方找到 “Build Env

Learn ComputeShader 09 Night version lenses

这次将要制作一个类似夜视仪的效果 第一步就是要降低图像的分辨率, 这只需要将id.xy除上一个数字然后再乘上这个数字 可以根据下图理解,很明显通过这个操作在多个像素显示了相同的颜色,并且很多像素颜色被丢失了,自然就会有降低分辨率的效果 效果: 但是这样图像太锐利了,我们加入噪声去解决这个问题 [numthreads(8, 8, 1)]void CSMain(uint3 id