首页 > 其他分享 >双指针问题

双指针问题

时间:2023-12-01 14:34:10浏览次数:27  
标签:表示 set int 问题 数组 我们 指针

1.双指针暴力超时,优化方案

Problem - D - Codeforces

当数组中只存在1和2的值的时候我们可以考虑用二分去优化,我们可以找到数组中最后一个1的值,前面都是1和2的话

我们可以通过最后一个1去灵活地凑出 第一个数到最后一个1的数的和中间的任意一个值(划重点)

当然我们要尽可能凑出来最大的值,如果最后一个1后面的2比第一个1前面的2多,我们用后缀和表示 总和

反之,我们用前缀和表示出我们能表示出的总和的最大值(代码用t来表示)

在此之前,我们需要用一个set来记录每一个1出现的位置,即a数组的下标,每次出现就插入;如果set为空,那么表示

全都为偶数,所以要求我们表示v必须也是偶数才能yes;我们根据set数组也能找到第一个1之前和最后一个1之后的2的个数

用我们的数组总和减去 我们找到的最小的2个数那个区间,得到的就是我们能表示出来的最大的数字t;

在后面的表示中,如果小于我们能表示的数,表示我们能凑出来,为yes;如果大于,我们再用剩余那段2去表示,能表示的

前提就是v和t要是同奇同偶,且v - t 差值要小于我们这段2的个数*2 ,否则表示失败

如果替换的话,就用set去动态维护即可,每次根据v的数字去决定插入还是消除

 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 
 4 const int N = 3e5 + 10;
 5 
 6 int t,m,n;
 7 int a[N],b[N],c[N],ans[N];
 8 
 9 int main()
10 {
11     scanf("%d", &t);
12     while(t --)
13     {
14         cin >> n >> m;
15         set<int> se;
16         
17         int s = 0;
18         for (int i = 1; i <= n; i ++ ) 
19         {
20             scanf("%d", &a[i]);
21             s += a[i]; //s用来记录总和
22             if(a[i] == 1) se.insert(i); //把每一个数字1 的位置丢到set中
23         }
24         
25         while (m -- ){
26             int op,x,v;
27             scanf("%d", &op);
28             if(op == 1)
29             {
30                 scanf("%d", &v); //读入要判断的数
31                 if(se.empty()) puts(v % 2 == 0 ? "YES" : "NO"); //如果se为空,表示全都是2,那么v是偶数就可以凑出来
32                 else 
33                 {//判断是第一个1出现之前的2少还是最后一个1出现之后的2少
34                     int cnt = min(*se.begin() - 1,n - *se.rbegin()); 
35                     int t = s - cnt * 2; //表示除开较少2的那段的数字和
36                     if(v <= t ||(v % 2 == t % 2 && (v - t) / 2 <= cnt)) puts("YES");
37                      //如果 要凑的那个值小于我能表示的值,为yes,如果大于,则用后面的或者前面那段较少的2去维护
38                      // 所以这个前提是 要凑的数和我能表示的最大数同奇同偶,然后大的差值要小于我能凑出的2个数*2,否则凑不了
39                     else puts("NO");
40                 }
41             }
42             else {
43                 scanf("%d%d", &x, &v);
44                 if(a[x] == 1) se.erase(x); //等于1 换掉之后要出set 
45                 if(v == 1) se.insert(x); //换的值为1 换之后要进set
46                 s += v- a[x]; //维护s的值
47                 a[x] = v;
48             }
49         }
50     }
51     return 0;
52 }
Code

 

标签:表示,set,int,问题,数组,我们,指针
From: https://www.cnblogs.com/rw666/p/17869631.html

相关文章

  • 安天防病毒,麒麟系统,内存溢出,问题排查
    问题:八角 今天客户遇到这个问题,导致系统的业务登录不进去,ssh也登录不上,用显示屏,发现一直报错莱芜 解决步骤:咱这两台跑的一样的应用吗?我看刚才这台是nginx服务?oom了outofmemory了命令:收个sosreport-a,打包下/var/logsosreport-a嗯 在17:30左右......
  • 《力扣面试150题》题单拓展——双指针
    《力扣面试150题》题单拓展——双指针1.基础知识为什么双指针会正确?不会漏掉搜索空间数组nums递增排序,假设共8个元素假设由于搜索空间i<j的限制,只搜索右上角白色倒三角空间,一开始,我们检查右上方单元格(0,7),即计算A[0]+A[7],与target进行比较。如果不相等的话,则要么大......
  • 指针数组和数组指针
    intmain(){int*p1[10];int(*p2)[10];return0;}首先要知道,[]优先级是要高于*号。int*p1[10],p1优先和数组结合,那么此时p1就是一个数组,里面存放的内容都是指针类型,所以p1是一个数组,里面存放的内容是指针的地址,叫指针数组。int(*p2)[10],在这里*号优先......
  • 测试环境使用问题及其优化对策实践
    1背景及问题G.J.Myers在<软件测试技巧>中提出:测试是为了寻找错误而运行程序的过程,一个好的测试用例是指很可能找到迄今为止尚未发现的错误的测试,一个成功的测试是揭示了迄今为止尚未发现的错误的测试。对于新手来说,日常测试用例设计时,很少用到系统的方法论,大多是根据产品需求......
  • Prometheus时区问题说明
    背景:prometheus默认使用的时间戳是UTC,UTC代表"协调世界时"(CoordinatedUniversalTime),是国际标准时间。它是一种基于原子钟的时间标准,被认为是世界上最准确的时间标准 我想做的事情:修改prometheus程序里的时间修改为CTS(中国标准时间),"Asia/Shanghai" 时区 ......
  • Linux Mint(Ubuntu)系统VS Code C/C++环境配置include error问题
    1.问题描述安装完成LinuxMint后发现随系统自带了gcc,心里比较开心,以为自己不需要装了。但是在安装完VSCode之后,一直提示#includeerrorsdetected.PleaseupdateyourincludePath.Squigglesaredisabledforthistranslationunitlinux2.解决方案重新通过apt安装gcc......
  • 查找的一些问题
    1.对n个元素的表做顺序查找时,若查找每个元素的概率相同,则平均查找长度为((n+1)/2)。解析:第一次比较的次数为1,第二次为2····第n次的比较次数为n,所以总的比较次数为n(n+1)/2,平均比较次数=(n+1)/2。2.适用于折半查找的表的存储方式及元素排列要求为(顺序方式存储,元素有序)。解......
  • 双指针算法总结
    双指针算法分为两类:第一类指向一个序列(更多的情况),第二类指向两个序列。基本的代码框架是:for(i=0,j=0;i<n;i++){while(j<i&&check(i,j))j++;//每道题目的具体逻辑}核心思想:运用单调性等性质,将O(n2)的算法优化到O(n)。种类:快排的划分、归......
  • JSONObject参数顺序问题
    签名需要规定参数顺序不能错。一开始是这么写的JSONObjectparam=newJSONObject();param.put("idcard",user.getIdCard());param.put("mobile",user.getPhone());param.put("uid",user.getId());param.put("username",user.getName());期望得到的顺序应该......
  • 商家转账到零钱全攻略:开通、使用、区别与常见问题解答
    一、商家转账到零钱功能介绍微信作为中国最受欢迎的社交平台之一,其支付功能也相当强大。其中,商家转账到零钱功能可以让商家直接将款项转入用户的微信零钱,方便快捷。本文将详细介绍商家转账到零钱的功能、开通条件、使用方法以及常见问题解答。二、商家转账到零钱场景说明商家转......