上一页 1 ··· 16 17 18 19 20 21 22 23 24 ··· 42 下一页
方法:先对n分解质因数,分别记录每个质因数,那么所求区间内与某个质因数不互质的个数就是n / r(i),假设r(i)是r的某个质因子。假设只有三个质因子,总的不互质的个数应该为p1+p2+p3-p1*p2-p1*p3-p2*p3+p1*p2*p3,及容斥原理,可以转向百度百科查看相关内容pi代表n/r(i),即与某个质因子不互质的数的个数当有更多个质因子的时候,可以用状态压缩解决,二进制位上是1表示这个质因子被取进去了。如果有奇数个1,就相加,反之则相减View Code #include<vector>#include<cstdio>using namespace s Read More
posted @ 2012-01-03 12:31 Because Of You Views(1639) Comments(0) Diggs(0) Edit
以前用RMQ做过,刚好最近在做线段树,就用线段树也做了下,1A~两个域,分别保存当前结点下面的最大值和最小值View Code #include<cstdio>#include<cstring>#include<algorithm>using namespace std;const int maxn = 55555;#define lson l,m,rt<<1#define rson m+1,r,rt<<1|1int MIN[maxn<<2];int MAX[maxn<<2];int min(int a,int Read More
posted @ 2012-01-02 13:47 Because Of You Views(514) Comments(0) Diggs(0) Edit
View Code #include<cstdio>#include<cstring>int n,m;int a[1000010],b[10010];int p[11111];void getp(){ p[1]=0; int i,j=0; for(i=2;i<=m;i++){ while(j>0&&b[j+1]!=b[i]) j=p[j]; if(b[j+1]==b[i]) j+=1; p[i]=j; }}int kmp(){ int i,j=0,cnt=0; for(i=1;i<=n;i++){ wh... Read More
posted @ 2012-01-01 18:37 Because Of You Views(440) Comments(0) Diggs(0) Edit
核心思想:当某个字符失配时,尽可能多的向右滑动而又不影响结果。具体见http://www.matrix67.com/blog/archives/115/View Code #include<cstdio>#include<cstring>int n,m;char a[1000],b[1000];int p[1000];void getp(){ p[1]=0; int i,j=0; for(i=2;i<=m;i++){ while(j>0&&b[j+1]!=b[i]) j=p[j]; if(b[j+1]==b[i]) j+=1; p[i... Read More
posted @ 2012-01-01 18:21 Because Of You Views(620) Comments(0) Diggs(0) Edit
View Code #include<cstdio>#include<cstring>const int maxn = 50010;int c[maxn];int lowbit(int x){ return x&-x;}void update(int x,int d){ for(;x<=maxn;x+=lowbit(x)) c[x]+=d;}int query(int x){ int sum=0; for(;x>0;x-=lowbit(x)) sum+=c[x]; return sum;}int main(){ int t,n,... Read More
posted @ 2012-01-01 17:42 Because Of You Views(267) Comments(0) Diggs(0) Edit
注释在代码中两个树状数组,或者用两次第一次维护的是空位的位置,update,更新管辖范围内空位的个数,getk获得第k个空位置的个数,其实就是第k小数,然后占据该位置,更新相应信息第二次维护的是最长不下降子序列的长度,update:更新长度,getm:获得当前位置之前的最长的LIS长度,再把当前的数加进末尾View Code #include<stdio.h>#include<string.h>#define lowbit(i) (i&(-i))const int MAXN=100005;const int MAXLOG=17;int B[MAXN],pos[M Read More
posted @ 2012-01-01 09:32 Because Of You Views(587) Comments(0) Diggs(0) Edit
www.notonlysuccess.com本小节主要特点:成段更新,懒惰标记我对懒惰标记的解释:如果当前的区间被要更新的区间所覆盖,直接就改变当前结点的信息,不用再往下了,所以,每次在更新的时候,只更新一层,把当前结点的信息往下传递一层,以供下一步使用,如果下一步完成了更新,更新也就结束了,没有完成,继续往下传递一层。。。。以下是一些题目,随时更新。。。。hdu 1698 just a hookView Code #include<cstdio>#include<algorithm>using namespace std;#define lson l,m,rt< Read More
posted @ 2011-12-31 23:00 Because Of You Views(286) Comments(0) Diggs(0) Edit
题意坑爹,应该是求大于a的第k小的数。。线段树思路:更新操作就不说了,和另外一篇的一样http://www.cnblogs.com/wuyiqi/archive/2011/12/26/2301504.html关键是询问操作:问大于a的第k小的数,首先判断有几个数小于a,设为t,则题意就转换为了求整个区间的第k+t小的数求之前先特判一下有没有k+t个数线段树代码如下:View Code #include<stdio.h>#include<string.h>#include<algorithm>using namespace std;const int maxn Read More
posted @ 2011-12-29 14:25 Because Of You Views(907) Comments(0) Diggs(0) Edit
树状数组实现好了之后,改用线段树也实现了一下,接下来再用各种树实现,继续学习!!View Code #include<cstdio>#include<cstring>const int maxn = 222222;#define mid (l+r)>>1#define lson l,m,rt<<1#define rson m+1,r,rt<<1|1int sum[maxn<<2];//记录有几个点的范围在节点的范围内int a[maxn],p[maxn];int n;/*void pushup(int rt){ sum[r Read More
posted @ 2011-12-26 08:33 Because Of You Views(1989) Comments(0) Diggs(0) Edit
来自http://www.cnblogs.com/oa414/archive/2011/07/21/2113234.html的启发,看上述博客如何求第k大的数时,被其第二份代码影响,感觉很巧妙,于是研究了一下,搞懂后顿时神清气爽啊。。。还是看这张经典的图吧,知识在图上就变得形象多了现在假设要求sum[a]的值,一般我们都是从后往前求和,如a=1515-lowbit(15)=14;14-lowbit(14)=12;12-lowbit(12)=8;8-lowbit(b)=0;答案就是sum[15]+sum[14]+sum[12]+sum[8];现在我们可以这样来求,从不超过15的只有一个1的最大二 Read More
posted @ 2011-12-25 16:28 Because Of You Views(5212) Comments(1) Diggs(3) Edit
上一页 1 ··· 16 17 18 19 20 21 22 23 24 ··· 42 下一页