![](https://img-blog.csdnimg.cn/20201014180756757.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
双指针
timidcatt
永远不要放弃战斗
展开
-
C. Smilo and Monsters Codeforces Round 907 (Div. 2)
思路:因为大招可以花一点费用杀死很多怪,性价比肯定比普攻高,且大招一次消耗的能量越多越赚,要消耗更多的能量就要选择怪的数量尽可能多的堆施放大招,所以我们按怪的数量从小到大排序,建立双指针l=1,r=n,前面怪数量少的我们用普攻,如果当前积攒的能量达到a[r]了,就用大招消灭a[r],这样最终可能会剩余1堆,那么除去当前大招能杀死的以外,其他的一半向上取整都要用普攻,然后其余的一个大招杀掉。原创 2023-10-31 23:27:55 · 334 阅读 · 0 评论 -
C. Colorful Table CodeTON Round 6 (Div. 1 + Div. 2, Rated, Prizes!)
思路:通过观察可以发现,这个方阵是关于左上-右下的直线对称的,所以我们要找的矩形都是正方形,因为方阵中的值是取最小值得来的,所以每个数构成的正方形的边界就是a中最左边和最右边大于该数的位置,那么问题就转化成了在数组中求每个数最左和最右边大于这个数的位置之间的长度。首先考虑每个数的左边界怎么求,因为每个数的边界都是最靠左的那个,所以从左向右遍历,我们每遇到一个没处理过的数,所有小于等于这个数的数的左边界都是这个位置,然后这些数都被标记为已处理。原创 2023-09-20 10:45:06 · 492 阅读 · 0 评论 -
Circle of Mistery 2023牛客暑期多校训练营5 B
要找一个最短的区间,显然需要区间端点都是正数,可以用尺取的方式找到这样的一个区间,要是区间里的环最大,区间里的大于等于0的数肯定都选,负数就要用一个大根堆存起来,在找到合法区间后,尽可能加上大的负数,这样就能使得答案最小。然后我们找这样的区间,可以贪心一下,我们从上面的式子可以看出,要想答案最小,就要找一个最短的区间,并且使里面的环的大小最大。题目大意:给出一个n个数的数组a,求一个排列,使其形成的其中一个置换环上的数的和>=k,并使产生的逆序对数量最少。tips:关于置换环是什么可以看这道经典题。原创 2023-08-04 00:04:38 · 513 阅读 · 0 评论 -
Go to Play Maimai DX 2023牛客暑期多校训练营5 G
思路:用双指针l,r维护合法区间,先向右扩展r,同时记录访问过几个不同的数以及4的数量直到满足要求,然后缩短左端点l,维护当前区间内每个数的个数,直到不满足条件就记录答案。题目大意:给出一长度为n的仅由1,2,3,4组成的数组和一整数k,求一个最短的区间使得1,2,3,4至少各有一个,且4的数量>=k。原创 2023-08-01 10:43:22 · 566 阅读 · 0 评论 -
Election of the King 2023牛客暑期多校训练营4-F
思路:每次操作一定是删除最大数或者最小数的其中一个,所以我们可以将数组排序然后模拟操作,维护当前剩余数的区间左右端点l,r,求出当前区间长度len=r-l+1,然后我们看中间的那个数选择哪个,如果len是偶数,要看中间偏左的那一个,因为平票是会选数值更大那一个的,也就是最大值,然后看中间值和右边的差,如果右边的差大于等于左边,就投出右边的,r--反之l++,直到l=r,最后在原数组中找到最后剩下的数的位置即可。原创 2023-07-29 00:14:34 · 684 阅读 · 0 评论 -
C. Dora and Search codeforces 1793C
思路:我们从最长的子串,也就是整个数组开始看,如果有某个端点不符合条件,可以发现,任何以该点为端点且更短的子串都是不合条件的,那么就可以把这个点舍掉,使原数组变成长度减1的新数组继续判断,所以我们维护双指针l=1,r=n,维护当前的最大值ma=n和最小值mi=1,如果当前的右端点不满足最大值条件就r-1,ma-1,另外三种情况以此类推,如果当前的区间长度原创 2023-02-13 16:39:50 · 371 阅读 · 0 评论 -
C2. Sheikh (Hard Version) codeforces 1732C2
思路:由easy version 可知每个区间数值和与异或和的差的最大值等于整个区间的相应差值,且区间内数越少,差值只可能越小,所以依然是要找每个区间内最短的一个区间使其差值等于最大值,因为每个数都不超过2的31次方,所以我们从区间两端分别向中间找31个非零的数,必然能使差值不再等于最大值,我们在输入数组时,可以记录每个位置的下一个非零数的位置和上一个非零数的位置所以每次询问最多遍历31*31次,时间复杂度不到O(1000q),4s不会超时。原创 2022-11-29 20:41:55 · 262 阅读 · 0 评论 -
C1. Sheikh (Easy version) codeforces 1732C1
思路:因为两个数的异或值是小于等于两个数之和的,所以我们每在区间内添加一个数,数值和与异或和的差要么不变要么变小,所以整个数组的数值和与异或和的差的最大值就等于整个数组的数值和-异或和,那么我们求出这个最大值ma,然后问题就转化成了求一个最短的区间使数值和与异或和的差等于ma,我们首先求出前缀数值和与前缀异或和,用于维护区间和,然后建立双指针l,r先右移右指针直到区间内的数值和与异或和的差等于ma,然后在差值不变的情况下右移l,然后维护答案,时区间长度最小。原创 2022-11-28 18:35:45 · 274 阅读 · 0 评论 -
B. Rebellion codeforces 1746B
Problem - B - Codeforces题目大意:有一个长度为n的只含有0或1的数组,每次操作可以选择两个位置i,j使aj=aj+ai,问最少操作多少次可以使得逆序对的数量最少1原创 2022-10-24 21:01:21 · 296 阅读 · 0 评论