我要的幸福
题意是找出从1,1到n,m的一条路,有障碍不能走,只能走右边或者下边,每次走一步,求字典序最小方案
这道题当时想着用深搜结果麻烦了,而且答案错误。。。
题解:从终点开始向左边或者上边走,找出所有不能走的点,打上标记
注意vis[i][i]=vis[i+1][j]|vis[i][j+1],异或是有一则一,就是有能到达它的点,他就能走。如果周围都是0那他也不能走
再直接从1,1开始走,贪心地选取右边、下边的中的最小值,依次输出就是字典序最小值了
i&(1<<k)是看i的第k位是什么
1^(1<<k)是改变i的第k位
ksum
求一个序列前k大的子序列和,数据范围十分大
本来可以用线段树做如果数据小的话
enmmm线段树不会写蛤蛤
void Add(int x, long long val) { for(; x <= n; x += lowbit(x)) tree[x] += val; } long long Query(int x) { long long ret = 0; for(;x ; x-= lowbit(x)) ret += tree[x]; return ret; }
所以用我奇特的过点法过掉两个点得20分蛤蛤
知识漏洞很大
题解:由于是正整数组成,一个序列一定比他的子序列的和大,而且一个序列l,r可以由l-1,r或者l,r+1得到
那么用堆来维护,记录前缀和,先把前缀和放进优先队列
这个优先队列是一个结构体类型的,里面存放了这个区间的左端点,右端点,区间和
还有重载bool operator < (const Node & x,const Node &y){
return x.sum>y.sum>
}用来排序
然后每当拿出堆顶的Node,就要把他的变形放回去,作为统一的不要出现重复,可以就把左端点加1,前缀和相应减去
奶牛喝水专用牛棚
差分和线段树都可以
差分就是在一个区间的修改次数比较多的时候派上用场
在L端加上修改值,在R+1端减去修改值,然后计算L到R的修改值的前缀和,再与原数组对应位置相加
emmmm劳资还是没懂,为什么这道题要用差分?????????????????
原文地址:https://www.cnblogs.com/SUMMER20020929/p/9863951.html