首页 > 其他分享 >CF1843E 二分+前缀和

CF1843E 二分+前缀和

时间:2023-06-27 12:25:07浏览次数:54  
标签:二分 cnt 前缀 int CF1843E cin mid 区间

题意:

给定一个长度为n且均为0的数组,q次单点修改(从0改为1),以及m个基于该数组的区间。

规定好区间为:区间内1的个数严格大于0的个数。

上述m个区间若存在一个好区间则为合法,问按顺序进行q次单点修改过程中最早出现合法的单次修改编号,若无则输出-1。

马后炮思考:

对于m个区间,其实际关系是无序的。二分最重要的是考虑单调性,本题中单点修改的不断积累过程本质是趋于合法的单调。因而考虑二分q,一个log。

那么对于某一次二分的check(x),对前x个单点修改作前缀和cnt统计,O(n)。随后遍历所有的m个区间,通过查看cnt[R] - cnt[L-1]判断是否为好区间,得出合法性。

下面是代码,若有误,请您指出。

 1 #include<iostream>
 2 #include<vector> 
 3 #define ll long long
 4 using namespace std;
 5 
 6 const int N = 1e5 + 10;
 7 int L[N], R[N], q[N];
 8 int cnt[N];
 9 int n, m;
10 
11 bool check(int x)
12 {
13     for(int i = 0 ; i <= n ; i++) {
14         cnt[i] = 0;
15     }
16     for(int i = 1 ; i <= x ; i++) {
17         cnt[q[i]] = 1;
18     }
19     for(int i = 1 ; i <= n ; i++) {
20         cnt[i] += cnt[i - 1];
21     }
22     for(int i = 1 ; i <= m ; i++) {
23         int len = R[i] - L[i] + 1;
24         if(cnt[R[i]] - cnt[L[i] - 1] > len / 2){
25             return true;
26         }
27     }
28     return false;
29 }
30 
31 int main(){
32     ios::sync_with_stdio(0);cin.tie(0),cout.tie(0);
33     int cas; cin >> cas;
34     while(cas--)
35     {
36         cin >> n >> m;
37         for(int i = 1 ; i <= m ; i++) {
38             cin >> L[i] >> R[i];
39         }
40         int Q; cin >> Q;
41         for(int i = 1 ; i <= Q ; i++) {
42             cin >> q[i];
43         }
44         int l = 1, r = Q;
45         while(l < r) {
46             int mid = (l + r) >> 1;
47             if(check(mid)) {
48                 r = mid;
49             }else {
50                 l = mid + 1;
51             }
52         }
53         if(check(l) && l <= Q) {
54             cout << l << endl;
55         }else if(check(l + 1) && l + 1 <= Q){
56             cout << l + 1 << endl;
57         }else {
58             cout << -1 << endl;
59         }
60     }
61     
62     return 0;
63 }

 

标签:二分,cnt,前缀,int,CF1843E,cin,mid,区间
From: https://www.cnblogs.com/ecustlegendn324/p/17508383.html

相关文章

  • 二分查找(函数)
    #include<stdio.h>intbinary_search(intarr[],intk,intsz){ intleft=0; intright=sz-1; while(left<=right) { intmid=(left+right)/2; if(arr[mid]>k) { right=right-1; } elseif(arr[mid]<k) { ......
  • 二分查找(函数)
    #include<stdio.h>intbinary_search(intarr[],intk,intsz){ intleft=0; intright=sz-1; while(left<=right) { intmid=(left+right)/2; if(arr[mid]>k) { right=right-1; } elseif(arr[mid]<k) { ......
  • leetcode-前缀和数组&差分数组
    前缀和数组:前缀和技巧适用于快速、频繁地计算一个索引区间内的元素之和。(仅仅适用于原数组不变的情况,如果原数组经常修改,则需要考虑差分数组。)模版如下:classPrefixSum{//前缀和数组privateint[]preSum;/*输入一个数组,构造前缀和*/publicPrefixSu......
  • 二分图最优匹配——Python实现
    二分图是一种特殊的图结构,它在经济与管理中具有重要的作用,譬如二分图在市场与供应链管理中发挥着关键作用,在供应链中二分图可以用来描述供应商与分销商之间的关系,帮助确定最佳的供应商-分销商匹配方案。通过建立供应商与分销商之间的连接,可以降低成本、提高效率,并确保产品能够及时......
  • 机器学习评价指标总结(二分类篇)
    目录疾病预测混淆矩阵基础指标准确率(Accuracy)精确率(Precision)召回率(Recall)精确率和召回率的关系综合指标F1分数(F1Score)P-R曲线平均精确率均值(AveragePrecision)ROC曲线AUC(ROC曲线下面积)对比P-R/AP和ROC/AUC疾病预测我们以疾病预测为例子来介绍分类的指标。疾病预测是一个......
  • Python字符串前缀u、r、b、f含义
    Python字符串前缀u、r、b、f含义1、字符串前加u例子:u"字符串中有中文"含义:前缀u表示该字符串是unicode编码,Python2中用,用在含有中文字符的字符串前,防止因为编码问题,导致中文出现乱码。另外一般要在文件开关标明编码方式采用utf8。Python3中,所有字符串默认都是unicode字符串......
  • Python 算法之二分查找
    Python算法之二分查找二分查找二分查找又称折半查找优点是比较次数少,查找速度快,平均性能好缺点是要求待查表为有序表,且插入删除困难折半查找方法适用于不经常变动而查找频繁的有序列表。猜数字游戏1、生成一个有序列表2、用户猜测某个数字是否在列表中代码#!/usr......
  • 力扣875. 爱吃香蕉的珂珂(二分查找)
     珂珂喜欢吃香蕉。这里有n堆香蕉,第i堆中有piles[i]根香蕉。警卫已经离开了,将在h小时后回来。珂珂可以决定她吃香蕉的速度k(单位:根/小时)。每个小时,她将会选择一堆香蕉,从中吃掉k根。如果这堆香蕉少于k根她将吃掉这堆的所有香蕉,然后这一小时内不会再吃更多的香蕉。珂......
  • 二分查找法lowerCeil版(找某个重复值的最小下标)利用二分upper法实现
    也是利用二分的upper法实现的,不知道什么是upper?看这里->二分查找法upper版(找大于某个值的最小下标)递归+非递归版-翰林猿-博客园(cnblogs.com)思路:先利用upper找到上界的index拿着index-1的下标(也就是重复值的最大下标)向前遍历,一直到遍历到发现不相等的元素即可。......
  • 二分查找法ceil版(找某个重复值的最大下标)利用二分upper法实现
    如果有等于target的元素就返回最大的下标元素。如果没有等于target的元素,那么就返回大于target的最小元素,即这一篇文章实现的upper函数。二分查找法upper版(找大于某个值的最小下标)递归+非递归版-翰林猿-博客园(cnblogs.com),当然你们也可以更改返回值-1什么的作为查找......