思路讲解
哈哈,找规律很难找,找不出来?不妨使用回溯思想,反过来找。
这个操作那其实就是一个倍增操作,我们反过来找我们的这个位置需要倍增几次才能到那?
知道了这个,只需要通过这个(需要倍增几次)%2 进行反转操作就行。
AC代码
1 |
|
心路历程(WA,TLE,MLE……)
样例给的强,一次提交就过了
https://atcoder.jp/contests/abc380/submissions/60951665
其实调调了半天,尽量函数越少越好(用了一个指针优化掉了一个函数)。
哈哈,找规律很难找,找不出来?不妨使用回溯思想,反过来找。
这个操作那其实就是一个倍增操作,我们反过来找我们的这个位置需要倍增几次才能到那?
知道了这个,只需要通过这个(需要倍增几次)%2 进行反转操作就行。
1 | #include <iostream> |
样例给的强,一次提交就过了
https://atcoder.jp/contests/abc380/submissions/60951665
其实调调了半天,尽量函数越少越好(用了一个指针优化掉了一个函数)。
总体我感觉没什么难的,就是写起来比较复杂
细节上的问题主要写在注释上,这里讲一下答题思路。
先把所有在应该放2位置的1换成2。(之前是没有这个步骤的,但好像导致策略不够优秀)
接着把所有在应该放2位置的0先换成1,再换成2
最后放一下1就可以了
https://codeforces.com/contest/2034/submission/297475528
1 | #include <iostream> |
WA1:
https://codeforces.com/contest/2034/submission/297451161
判断哪里应该是2,哪里应该是1的判断有点问题
WA2:
https://codeforces.com/contest/2034/submission/297454477
策略不够优,超过了最大允许操作次数
主要思路就是逆向思维,把所有能出去的点都识别出来,然后剩下的点就是不能出去的。
如果一个问号点周围都是能出去的,那么他也能出去。只要它周围有一个被困住的(不能出去),那么这个问号块也是被困住的。
然后主要是初始化上的一些细节问题
1 | memset(isStuck, false, sizeof(isStuck)); |
所有外面的块提前被设为不被困住,里面的块设为可以困住的
然后按照这个做法做就完了。
https://codeforces.com/contest/2034/submission/297055462
1 | #include <iostream> |
WA:
https://codeforces.com/contest/2034/submission/297053887
没有注意思路中的初始化上的细节问题
这个视频讲解还不错
https://www.acwing.com/problem/content/submission/code_detail/38373269/
1 | #include <iostream> |
自己写的,稍微有点问题
1 | #include <iostream> |
树状数组经典题。
然后前面看半天看不太懂,原来是用了频数数组呀,我想为啥要用树状数组那?
原来数组里维护的是频数,需要区间查询+单点修改两个操作,这个树状数组操作我还是会的。
频数数组
很多数据结构都是基于「频数数组」。
给定数组 t 以及它的下标范围 [L,R],t[x] 就表示元素 x 在数据结构中的出现次数。基于此,上述的两个操作可以变为:
操作 1「查询」:给定一个范围 [left,right],查询 t[left] 到 t[right] 的和;
操作 2「更新」:给定一个元素 x,将 t[x] 增加 1。
这也是线段树和树状数组的基础,它们需要的空间都与数组 t 的下标范围 [L,R] 正相关。在本题数据规模较大的情况下(例如测试数据中,出现了元素值达到 32 位有符号整数的上下界),线段树和树状数组都会超出空间限制,因此需要借助「离散化」操作,将这些元素映射到一个较小规模的区间内。
https://leetcode.cn/problems/count-of-range-sum/solutions/476205/xian-ren-zhi-lu-ru-he-xue-xi-ke-yi-jie-jue-ben-ti-/
https://leetcode.cn/problems/count-of-range-sum/submissions/585372478/
1 | class Solution { |
唉这题搞了半天
记住,离散化之后,传入的数组大小应该是去重以后的大小(即ditinctN),否则搜出lii的递增范围,lower_bound()就不可靠了。
1 | search(sumA[i]-upper,sumA[i]-lower,BIT,lii,distinctN); |
https://leetcode.cn/problems/count-of-range-sum/submissions/585369029/
记得离散化映射关系数组的初始化值为0容易出事,因为如果是搜0,搜到外面去容易出事
1 | vector<ll> lii(n+10,-1e11+7);// 离散化映射关系数组 |