摘要:
其实,这道题暴力也行,两个for就搞定了,时间复杂度为O(N^2),而树状数组的时间复杂度为O(N*logN)。树状数组求逆序对的原理:前面有i-1个数,把每次输入的数看作树状数组的下标,设置增加的变量为1,算其前缀和(有多少个1就有多少个顺序对),然后减去顺序对就是答案,方案有两种(本质是一样的):1、ans+=(i-1-sum(a));add(a);2、 add(a); ans+=(i-sum(a));#include<iostream>#include<cstdio>#include<cstring>#include<cmath>#incl 阅读全文
摘要:
这题为啥用树状数组呢?首先1<=N<=100,如果暴力修改的话,最糟糕的时间为O(N*N*N),然后有M个命令,1<=M<=10000,总耗时为O(M*N*N*N),也就是100*100*100*10000,而限时1s,神仙难救~如果把修改次数看成前缀和,修改次数为奇数,答案则为1,修改次数为偶数,则为0,总的耗时为Q(M*logN*logN*logN),随意可过~#include<iostream>#include<cstdio>#include<cstring>#include<cmath>#include<al 阅读全文
摘要:
假设flag[i][j]=1表示灯亮,flag[i][j]=0表示灯灭只有两种情况需要更新树状数组:1、flag[x1][y1]=1,命令是D,add(x1,y1,1)2、flag[x1][y1]=0,命令是B,add(x1,y1,-1)由于树状数组的下标从1开始,而x1,y1有可能等于0,所以自增1#include<iostream>#include<cstdio>#include<cstring>#include<cmath>#include<algorithm>#include<string>#include< 阅读全文
摘要:
假设每个格子代表一个数A[i][j],i是横坐标,j是纵坐标,左上角的坐标为(1,1)我们要求红色区域元素之和,设sum(i,j)表示以i,j坐标为右下角坐标,以0,0为左上角坐标矩形内的元素之和,sum(c,d):绿色+黄色+红色+蓝色sum(c,b-1):绿色+蓝色sum(a-1,d):绿色+黄色sum(a-1,b-1):绿色则红色区域元素之和=sum(c,d)-sum(c,b-1)-sum(a-1,d)+sum(a-1,b-1)#include<iostream>#include<cstring>using namespace std;#define N 1005 阅读全文
摘要:
首先,我们可以把树状数组的横坐标x看作c[i]数组的下标i,由于y是递增的,所以如果有两个数的横坐标相同,则...#include<iostream>#include<string.h>#define MARK 32005int c[MARK],lev[MARK];int sum(int x) //计算最大下标为x的前缀和{ int ret=0; while(x>0) { ret+=c[x];x-=(x&-x); } return ret;}void add(int x) //下标x的数增加d,对应的c数组也会有变化{ while(x<MARK... 阅读全文
摘要:
http://www.java3z.com/cwbwebhome/article/article1/1369.html推荐的博文referrence:http://community.topcoder.com/tc?module=Static&d1=tutorials&d2=binaryIndexedTrees对于正整数,我们定义lowbit(x)为x的二进制表达式中最右边1所对应的值。对于节点i,如果它是左子节点,那么父节点的编号就是i+lowbit(i),如果它是右子节点,那么父节点的编号是i-lowbit(i),构造一个辅助数组C,其中 Ci=A[i-lowbit(i)+ 阅读全文
摘要:
#include<iostream>#include<cstdio>#include<cstring>#include<cmath>#include<algorithm>#include<string>#include<queue>using namespace std;int c[100005],n;int lowbit(int x){ return x&-x;}int sum(int x){ int ret=0; while(x>0) { ret+=c[x];x-=lowbit(x); } r 阅读全文
摘要:
超级无敌裸的树状数组#include<iostream>#include<cstdio>#include<cstring>#include<cmath>#include<algorithm>#include<string>#include<queue>using namespace std;int c[50005],n;int lowbit(int x){ return x&(-x);}int sum(int x){ int ret=0; while(x>0) { ret+=c[x];x-=low 阅读全文
摘要:
AC自动机原理:摘自http://www.cnblogs.com/huangxincheng/archive/2012/12/02/2798317.html,ORZ大牛一:构建AC自动机同样我也用网上的经典例子,现有say she shr he her 这样5个模式串,主串为yasherhs,我要做的就是哪些模式串在主串中出现过?1: 构建trie树 如果看过我前面的文章,构建trie树还是很容易的。2:失败指针 构建失败指针是AC自动机的核心所在,玩转了它也就玩转了AC自动机,失败指针非常类似于KMP中的next数组,也就是说,当我的主串在trie树中进行匹配的时候,如果当前节点不能再继续进 阅读全文
摘要:
#include<iostream>#include<cstdio>#include<cstring>#include<cmath>#include<algorithm>#include<string>#include<queue>using namespace std;char a[1000001],p[55];struct Trie{ Trie *child[26]; Trie *fail; //失败指针 //int num; int cnt; //由于同一单词可能出现多次。。。 Trie() { //nu 阅读全文