摘要: 本题的主要算法就是区间更新和区间求和;可以用线段树和树状数组来做;感觉线段树写的太麻烦了,看到官方题解上说可以用树状数组做,觉得很神奇,以前用过的树状数组都是单点维护,区间求和的;其实树状数组还可以区间维护,单点求值;和区间维护,区间求和的;详情请见博客。#include#include#include#include#define maxn 4000010#define ll long longusing namespace std;ll a[2][maxn];ll b[2][maxn];void add_a(int flag,int x,ll value){ while(x>0) . 阅读全文
posted @ 2014-02-23 21:29 Yours1103 阅读(197) 评论(0) 推荐(0) 编辑
摘要: 几个小结论:1.路径长度=i+j-1;2.最简单的走法是先横走再竖着走或者先竖着走再横着走#include#includeusing namespace std;void print(int x,int y){ for(int i=1; im)continue; ans+=l-1; cnt++; if(cnt>=k)break; } if(cnt>=k)break; } printf("%d\n",ans);// printf("%d %d\n",l,i); for(; ... 阅读全文
posted @ 2014-02-23 13:57 Yours1103 阅读(160) 评论(0) 推荐(0) 编辑
摘要: 这个题目看似不是很好下手,不过很容易发现每次询问的时候总是会问到第r个盒子是否有糖果;这样的话就很好办事了;维护两个数组;一个sum数组:累加和;一个in数组:如果i位是1的话,in[i]=in[i-k]+1;否则不加1,很好理解;然后利用in数组可以找到本来应该有糖果的但是没有糖果的箱子的数目;然后结合sum数组就可以的出结果;#include#include#define maxn 100005using namespace std;char s[maxn];int sum[maxn];int in[maxn];int n,w,k;int main(){ scanf("%d%d% 阅读全文
posted @ 2014-02-23 11:00 Yours1103 阅读(334) 评论(0) 推荐(0) 编辑