随笔分类 -  思维题

摘要:给定一个 nn 长度的数组 aa ,可以进行操作: 将数组相邻的两个元素删除,并在原来的位置插入这两个元素的异或和。 求在最多删除 n-2n−2 个元素(即至少剩余 22 个元素)的情况下能否使数组所有元素相等。 solution: 前置知识: 异或具有结合性,a xor b xor c xor d 阅读全文
posted @ 2022-01-18 21:09 liyishui 阅读(39) 评论(0) 推荐(0) 编辑
摘要:首先如果不为3的倍数肯定无解 如果为3的倍数 dfs查找每个点作为根的子树和 遇到一个满足和为sum/3的就删去 正确性: 可能会有很多个这样的点,他们之间的切割方式可以排列组合,要不要记录谁先割啥的,dp? 不,因为每个点其实都是一样的,对于两个合法的点之间..它们和为0,这段就没贡献,不影响。 阅读全文
posted @ 2021-11-17 08:04 liyishui 阅读(48) 评论(0) 推荐(0) 编辑
摘要:根据题目特点,b和所有的其他点相连,能先确定b 确定b后再找到第一个不是b的,赋值为a,或者为c,反正都是对称的 赋完值后,对于所有的点,要么和这个点连,要么不联 联的话如果是b就是b,不是b就只能是a 不联的话只能是c 这样一通构造就能得到一个序列,但不一定保证合法 最后再check一下 : #i 阅读全文
posted @ 2021-11-17 08:01 liyishui 阅读(38) 评论(0) 推荐(0) 编辑
摘要:关于思路: 在拓扑题集里发现了这只,怎么想怎么奇怪,产生冠军当且仅当整个拓扑序打出来是联通的,并且到尽头不能有两个以上出度为0的点,这咋判断? 根据冠军的定义,没输过,开两个set,一个存赢家,一个存输家,若赢家没在输家名单里出现过,则cnt++; 产生冠军当且仅当cnt=1; 关于实现: 实现过程 阅读全文
posted @ 2021-11-02 16:20 liyishui 阅读(22) 评论(0) 推荐(0) 编辑
摘要:被昨晚的自己误导一直以为跳过了只能通过回旋跳跃的方式一步一步卡过去.. 考虑跳过的步数,如果差值为偶数,可以在之前的某步先回跳 如果差值为奇数,凑出偶数即可,且一定凑得出来 阅读全文
posted @ 2021-10-22 07:17 liyishui 阅读(56) 评论(0) 推荐(0) 编辑
摘要:刚开始一看这不01背包 一看数据nm炸了 特点是v只可能是1或者2 而2=1+1 建两个大根堆,每次拎q1的两个头出来和q2的一个头出来比较 一个很小的优化就是如果v为奇数,那么q1的最大肯定要先取 —— 最近状态很烂,补一个死活卡在21不知道re在哪里的代码 #include<bits/stdc+ 阅读全文
posted @ 2021-10-21 19:13 liyishui 阅读(35) 评论(0) 推荐(0) 编辑
摘要:题意是说先把所有的yx交换成xy后再移去xy; yy一下(或者多玩几个or观察样例 发现答案为abs(x-y) #include<bits/stdc++.h> using namespace std; const int maxn=1e6+10; char s[maxn]; int main( ) 阅读全文
posted @ 2021-10-09 15:36 liyishui 阅读(29) 评论(0) 推荐(0) 编辑
摘要:问最大的区间异或和 看到n<=100开心n3了; 但有一个性质可以把降到n2 ai^ai+1^ai+2^ai+3^ai+4...aj ==s(i-1)^sj; 求一遍前缀和再枚举区间即可 关于异或有一些很神奇的性质,cf的某道c题就是以这个为基础开脑洞的。 即x^0=x; x^x=0; x^x^x= 阅读全文
posted @ 2021-10-09 15:34 liyishui 阅读(107) 评论(0) 推荐(0) 编辑
摘要:要求最远的不能超过d; 又因为保证了递增 那我们固定一个点,找到数列里第一个刚好<=该点+d的位置 然后区间中任意挑两个数都是合法的; c(2,m)√ # 如何找到第一个刚好<=? 不手写二分的话用 ll r=upper_bound(a+1,a+n+1,tmp)-a; r--; 注意是upper,和 阅读全文
posted @ 2021-10-09 15:29 liyishui 阅读(34) 评论(0) 推荐(0) 编辑
摘要:题意中 x<=n<=1e5; #设想n非常大 那x就没啥用了,如果一个数a,理应和b换,但是a与b之间的距离小于x,我们可以借助一个和a,b的距离大于x的变量作为中介; #但是n再小一点,比如n==x,就一点也动不了了,除非本来就是合法的。 #那么在无穷大和x之间,有一个比较尴尬的地带 取n==2x 阅读全文
posted @ 2021-10-04 17:38 liyishui 阅读(46) 评论(0) 推荐(0) 编辑
摘要:想做出这道题需要三个技能点: 1,对于一个数x,x<<1为x的2倍,且在二进制视角看来,就是末尾多了一个0 2,题目说的k倍,k可以取特殊值,比如1,2 3,样例可能在扯淡有了以上三点前置知识,就可以开始构造了。 找到 xxxxxx xxxxxx0 或者 0xxxxxxxxx xxxxxxxxx 即 阅读全文
posted @ 2021-10-03 21:31 liyishui 阅读(35) 评论(0) 推荐(0) 编辑
摘要:因为只能修改一次 且每点的修改只能对左右产生影响 画出所有的折线情况 发现贡献只能是3 ,或者1 如果满足-3就-3,否则-1; 但一直wa,又找不着该逻辑的毛病,先放着发酵一会 #include<bits/stdc++.h> using namespace std; const int maxn= 阅读全文
posted @ 2021-10-03 19:48 liyishui 阅读(24) 评论(0) 推荐(0) 编辑
摘要:通过模拟发现让第一停可以得到987654321 让第二停可以得到 989012345 让第三停可以得到 9876 有一点比字典序的意思,要最大肯定最高位最大,模拟到3发现2最优了。 #include<bits/stdc++.h> using namespace std; int main( ) { 阅读全文
posted @ 2021-10-03 19:21 liyishui 阅读(43) 评论(0) 推荐(0) 编辑
摘要:谈谈心路历程: 模拟完样例后直觉挑出合法的最大和最小(不在一个包里) 让最小减去最大,然后如果最小所在的集合只有它自己的话,就可以开始疯狂堆了。 但样例2告诉我们可能最小所在的集合可能不只有自己,那么最小的小伙伴一定要被吃掉。 我们就要在剔除前面已经用过的两个数的情况下,再跑一次上述流程。 理论上是 阅读全文
posted @ 2021-10-03 19:18 liyishui 阅读(31) 评论(0) 推荐(0) 编辑
摘要:第一次做到这种神奇的题目 想了一个很复杂的组合数思路,大概就是枚举抽出多少个再放回去能满足条件,照着模拟这样 可是情况太多种了,以至于我想要个正难则反,就是枚举不满足的情况,发现情况也很多种 况且组合数本来就不会打,给我整不会了。 solution:证明了对于一个数列,假如它自己会被count到,那 阅读全文
posted @ 2021-10-03 10:50 liyishui 阅读(151) 评论(0) 推荐(0) 编辑
摘要:2的倍数只有log个 一个数要变成2的倍数除了在现有基础上,如果要加的话只能后面一股脑加 匹配的时候按着2的倍数一一去匹配,配不上就丢掉。(照题意) 也不知道wa在哪儿了,经典出思路but ac不了 20211005,过了,有个情况没考虑全,9没考虑。 阅读全文
posted @ 2021-10-03 09:45 liyishui 阅读(38) 评论(0) 推荐(0) 编辑
摘要:大意是给定一个字符串,每次从中挑一个字母删除该序列中的所有该字母,直到s为空 把每次得到的答案连接起来就是样例啦。 问能否找到一个顺序使得上述情况成立。 找规律ing: 最后一个出现的肯定是最后一次删除的 删除的次数肯定是字母的个数 最后一个出现的次数除以字母个数肯定是它在原序列里的出现次数 同理倒 阅读全文
posted @ 2021-10-03 09:42 liyishui 阅读(34) 评论(0) 推荐(0) 编辑
摘要:关键是k<=n; 考虑最坏情况,逆序 每次挑最大值,只移动一次扔到尾巴 多模拟几个数字,发现任意一种情况都可以这样解决 #include<bits/stdc++.h> using namespace std; typedef long long ll; ll n,a[100],cnt,ans[100 阅读全文
posted @ 2021-09-30 09:26 liyishui 阅读(147) 评论(0) 推荐(0) 编辑
摘要:看错题目三次,相当于做了三道不同的题.. 哪怕是在脑子不清楚的情况下,看好题目是多么重要的事啊。 多画图就可以发现答案不会超过4 虽然在开始的时候就有感觉是递减的 甚至看到了篇数学背景的论文讲这个事情.. 嘿嘿纪念一下,第一次想出1700的题?并且还出得挺快的, 阅读全文
posted @ 2021-09-19 19:46 liyishui 阅读(26) 评论(0) 推荐(0) 编辑
摘要:我知道应该想办法先得到F(a)最大是什么情况,然后再去找符合的序列。 吃饺子的时候突然想到当且仅当可以被平分成两组的时候,F(a)取最大。 这个可以转化为和一定,求最大的几个数相乘的和,拿几个数字玩一下就好了。 比如10分为5+5,ans为25,肯定远远大于{2,2},{2,2},{2,2},{2} 阅读全文
posted @ 2021-09-19 19:41 liyishui 阅读(31) 评论(0) 推荐(0) 编辑

点击右上角即可分享
微信分享提示