自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(30)
  • 收藏
  • 关注

原创 uva Potentiometers

很裸的一道树状数组或者线段树题#include #include using namespace std;const int maxn=2e5+10;int C[maxn],x[maxn],n;int lowbit(int x){return x&(-x);}int sum(int x){ int ret=0; while(x>0){ ret+=

2013-11-11 22:50:52 412

原创 uva 11136 Hoax or what

题意:每一次取序列中最大值和最小值,取他们的差值,计算n次后求差值的和。因为是动态的删除最大最小值,那么容易想到利用堆,而需要两个最值,那么就用一个最小堆和一个最大堆,维护这两个堆就可处理,由于C++中已经有set,那么就直接利用就好了。#include #include using namespace std;multiset s;int main(){ int

2013-11-10 22:34:31 461

原创 android中SurfaceView用法

在android中实现自定义的view来画图存在以下两个缺陷:1)view缺乏双缓冲机制2)当程序需要更新view上的视图时,必须重绘整张图片由于上述缺陷,在程序尤其是游戏中,绘图的性能并不理想,android为此提供了SurfaceView。SurfaceView一般和SurfaceHolder结合一起使用,SurfaceHolder用于在向与之关联的SurfaceVie

2013-11-10 16:48:59 689

原创 排序二叉树和treap

排序二叉树:它是这样的一棵树,根的左儿子的键值小于根节点的键值,右儿子的键值大于根节点的键值,并且他的子树也满足这样的性质。为什么会叫它排序二叉树呢,因为如果按照中序排序,那么结果是一个递增的序列。可以证明的是,在一颗排序二叉树中查找、插入和删除的算法复杂度都是树的高度,但是由于排序二叉树的建树和建树过程中选择的序列顺序有关,那么建树的好坏会直接影响其结构的效率,理论上数学期望为O(logn),最

2013-11-09 21:39:00 722

原创 高斯消元

高斯消元的步骤相信大家都很清楚,就是从上到下处理矩阵的每一行,处理完后Aii之前的全为0,Aii非零,代码如下:typedef double Matrix[maxn][maxn];void gauss(Matrix A,int n){ for(int i=0;i<n;i++){ int r=i; for(int j=i+1;j<n;j++){

2013-11-09 20:09:55 495

原创 AC自动机算法

首先介绍Trie(前缀树)这种数据结构。举例来说比较简单如图所示就是表示字符串集合{inn,int,tca,ten,to}的前缀树,建树的代码为C++代码:struct Trie{ int ch[maxnnode][sigma_size];//节点i的字符标号为j的那个子节点的编号 int val[maxnode];//记录字符串的值,通常为其标号

2013-11-08 10:57:33 467

原创 浅谈线段树标志下放

线段树不仅支持点修改,还可以支持区间更新,是一个非常实用的数据结构,关于点修改,基本不会涉及到标志下放的问题,这里不予讨论,而且这一类线段树问题一般来说也很简单,而涉及到区间操作往往会有标志下放的问题,而这个问题之前一直很困扰我,于是写一遍博客来警示自己。首先举例一个问题:有序列{A},有以下三个操作:(1):add(L,R,v),A[L]....A[R]每一个加v(2):

2013-11-07 22:00:58 682

原创 浅谈树状数组和RMQ问题

有这样一个问题:给定一个n个元素的数组{A},你的任务是设计一个数据结构,支持一下操作:ADD(x,d):让Ax增加dQuery(L,R)求A[L]+A[L+1]+...+A[R]的和很显然这可以用线段树求解,但这里说的不是这种数据结构,我们要讨论的是树状数组,一个利用位运算来进行操作的数据结构,相对于上述问题,树状数组速度略微会快一点,而且写起来也简单一些,当然线段树的用处更

2013-11-07 20:56:07 1368

原创 多路归并排序

我们有如下一个问题:对于若干个长度相同的序列,将其合并成一个有序的序列。暴力的方法显然是不可取的,这里可以利用优先队列来处理这个问题。首先从简单的开始,对于2路归并排序,设两个序列为{A},{B},将{A},{B}排序,有A1B1建立一个优先队列,队列中首先存入元素(A1,0),(B1,1),其中标志0,1分别表示元素中的值属于第一个序列还是第二个序列,那么第一次从

2013-11-07 17:39:02 767

原创 ZOj 3633

题解:线段树求解。首先要开一个pre数组,记录每一个数左边的最近的和它相等的小标,然后利用线段树取出[l,r]区间内最大的pre,若pre#include #include #include using namespace std;const int MAX=5e5+10;int pre[MAX],n,m,rec[MAX];typedef struct{

2013-09-20 17:45:42 330

原创 codeforces round171C

题解:对每一个ai记录下ai左边连续降序的最大个数dp1[i],ai右边的连续升序的最大个数dp2[i],然后询问时,若dp1[l]+dp2[r]>=r-l+1,则输出yes,否则no#include #include #include using namespace std;const int MAX=1e5+10;int dp1[MAX],dp2[MAX],a[MAX

2013-09-19 23:50:31 437

原创 codeforces 280C

题解:对于一个节点,它要被消除掉要么是自身消除,要么是父亲节点被消除,那么若其深度为depth,消除它的方法有depth中,平均为1/depth,那么总的期望就是sigma(1/depth[i])#include #include #include using namespace std;const int MAX=1e5+10;double ans;int dfn[M

2013-09-19 19:23:00 500

原创 round 172Div1 B

不得不说自己太水了。。。简单的数据结构题都没想到题解:因为需要的是将次大的和最大的异或,那么对每一个数将其左边的第一个出现的比它小的数和他异或,右边一样,求较大值,那么这样的话可以维护一个单调减的栈来操作,如果新加入的大于栈顶则出栈异或,如此进行即可求最大值,注意的是结束while循环后还要将栈顶和新加入的异或一次,因为此时栈顶可以是最大,新加入的为次大#include #inc

2013-09-18 23:39:29 374

原创 codeforces 280A

不说了,水死了,这样都wa了好几发才过!!!主要要注意细节的部分,要尽量想到每一个地方,尽量不要看数据找错误!!!/**/#include #include #include #include #include using namespace std;int main(){ double w,h,a,ans; cin>>w>>h>>a; ans=w

2013-09-18 18:14:42 557

原创 codeforces round 200Div

A,B,C都很水,D题栈模拟就出来了E:二分查找答案,对每一次查找的mid,对每一个head就进行如下操作,若果p[cur]>head,(开始时cur=1)则head一直往右mid步,记录下这是未被read的第一个track的下标cur,若p[cur]m则返回true#include #include #include #define ll long longusing

2013-09-17 17:30:49 350

原创 ZOJ 3692

题解:首先想到肯定是二分G的可能值,然后对于每一个判断可以用dp求解,值点必须要想到,余下的有点神。。。不好想。。。对于dp[i],其表示前i个人分组之后Ri和的最小值,那么有dp[i]=min{dp[k]+max(rp[k+1,...i])},rp[k+1,...],表示从i开始向前取到第k+1个人,这个dp是一个O(n^2)的算法,显然会T,进一步分析可以知道如果rp[k]前面的一个数

2013-09-12 19:51:14 809

原创 ZOJ 3687

题意:第i天不能复习第j个章节,i,j给定题解:裸的容斥原理,需要注意的是输入可能重复,而且由于m条件较少,可以直接(应该也只能这样)dfs求解代码:#include #include #define mod 55566677#define ll long longusing namespace std;ll fac[55];bool flag[55][5

2013-09-12 13:23:02 464

原创 ZOJ 36

题意:有一个有根树,树上原有节点的全部标记为0,定义这样的操作,每一次操作指定一个节点,对以这个节点为根的子树(包含这个节点)中所有的节点进行翻转(置为1),操作如若干次,便有一次询问,某个子树上1的个数题解:利用先序遍历的时间戳。因为对于先序遍历,每个节点达到的时间戳即其编号,而对于某一个节点,它的时间戳和它的子树中的最大的时间戳即是这棵子树的序号范围,那么一次先序遍历后就可以对每一

2013-09-12 09:47:03 481

原创 ZOJ 3690

题意:有n个人选m个数,选的数可以重复,但是如果两个相邻的人选了相同的数,那么该数必须大于k题解:dp加矩阵快速幂求解。这种问题一般dp和尾部有关,那么就是dp1[i]表示最后一个数小于等于k的方案数,dp2[i]表示最后一个数大于k的方案书,那么有dp1[i+1]=(k-1)*dp[i]+k*dp2[i];dp2[i+1]=(m-k)*(dp1[i]+dp2[i]);直接

2013-09-12 08:17:07 584

原创 ZOJ 3688

题解:很显然利用容斥原理,对于k个章节放错的排列方法,因为放错章节的序列为1 2 2 3 3 4,...,n,1,要满足从这个序列中取出k个数,k个数不想邻,可知即递增序列,且两个1不能同时取到,可以证明自增序列的个数为C(n-k+1,k),而1同时取到的个数为C(2n-4-(k-2)+1,k-2),于是可解代码:#include #include #define ll l

2013-09-12 00:19:39 698

原创 codeforces round 176Div1 B

题解:把每一次转换次数变成1,即每一个k,变换的次数为n/k,则复杂度降为n(1/2+1/3+1/4+..+1/n)=0(nlnn),而要做到这一点可以观察到每一次转换,即将每一个序列段的第一位,移到序列段最后一段+1,于是每一次都移一次,从最后一个开始向前操作,最后数组长度会变成2*n-1,输出n到2*n-1个数即是所求#include #include using nam

2013-09-09 22:51:30 444

原创 CodeForces Round 176Div1 A Lucky permutation

题解:举个例子比较好理解,比如1 2 3 4 5 ,6,7,8,1对应其序号+1,2对应8,于是7,8,分别对应1,7,剩下还有3,4,5,6注意到可以重复上述步骤,于是这是一个可行序列,于是可以得出结论,若n%4==0则按上述规则是可行的,若n%4==1,则可以证明是可行的,其余数不可以#include #include using namespace std;int main

2013-09-09 21:33:45 402

原创 ZOJ 1095 Humble Numbers

题解:预处理一下即可,注意预处理需要的是对2^p1*3^p2*5^p3*7^p4,枚举p1,p2,p3,p4,然后将所得的数排序,最后输出。#include #include #include #include #define ll long long#define MAX 5000000010using namespace std;vector rec;void p

2013-09-08 10:20:18 337

原创 Codeforces round199Div2 C

题解:首先算长方体可以放下几个,然后算出剩余的高,如果h>=r/2&&h=sqrt(3.0)/2*r,则可以放3个气球,否则还能放一个,于是答案可得,这题主要是要考虑清楚,起先没考虑到剩余h足够是可能可以放下3个,要全面考虑#include #include #include #include using namespace std;int main(){ int r

2013-09-07 21:39:04 473

原创 CodeForces round199Div2 B

只要每一次可以往目标走就走,否则就不做任何动作即可。需要注意的就是细节部分,不然的话wa可不是一般可怕,要注意的部分就是每一个步骤都是步骤的次序,只有当前执行次序和某一个步骤的次序相同时才执行,否则不执行。#include #include #include using namespace std;typedef struct{ int l,r; int

2013-09-07 20:35:33 495

原创 HDU 1423 Greatest Common Increasing Subsequence

即求最长公共自增子序列题解:设dp[i][j]表示序列1前i个元素和序列2前j个元素的最长公共递增序列的长度,可以这样进行dp,序列1的前1个元素和序列2的最大所求序列,前2个,3个。。。每一次dp过程记录下最大的值,如果对于某一个第二个序列的元素有a[i]>b[j]且有ma#include #include using namespace std;int a

2013-09-07 18:19:43 439

转载 HDU 题目分类

基础题:1000、1001、1004、1005、1008、1012、1013、1014、1017、1019、1021、1028、1029、1032、1037、1040、1048、1056、1058、1061、1070、1076、1089、1090、1091、1092、1093、1094、1095、1096、1097、1098、1106、1108、1157、1163、1164、1170、1194、1

2013-09-07 11:50:44 441

原创 HDU 4572 Bottles Arrangement

题解:原来想二分最值后判断是否可行,但是想不出怎么解决判断问题,于是搜报告,结果竟然是找规律。。。也确实是找规律,多几组找可以知道序列m,m,m-1,m-1...即符合题意的序列#include #include using namespace std;int main(){ int n,m; while(scanf("%d%d",&m,&n)!=EOF)

2013-09-07 11:07:41 496

原创 HDU 4569 Special equations

题解:如果x满足f(x)%(pri*pri)==0,那么一定有f(x)%p==0,那么一定会有f(x+p)%pri==0,于是可以先找到0到prime中满足f(x)%p==0的x,然后从x开始遍历到pri*pri,每次遍历+pri,如果有满足f(i)%(pri*pri)存在,输出i即可#include #include #include #define ll long longu

2013-09-07 10:07:59 511

原创 HDU 4565 So Easy!

题解:因为b有一个范围,即a-1Cn*((a+sqrt(b))+(a-sqrt(b))),可得递推公式Cn+1=2a*Cn-(a^2-b)*Cn-1,而Pn+1=aPn+bPn-1,这种形式可以利用矩阵快速幂求得,即构造矩阵答案即可求得#include #include #include #include #define ll long longusin

2013-09-07 01:52:29 500

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除