随笔分类 -  数据结构

摘要:zoj 3611同类型的题目poj 2688化简模型即可得这样的问题,一幅图给定起点 终点 ,求起点到终点最多经过几个点,如果两种方案经过的点数相同,选路径总长短的注意,这幅图最多只有12个点,所以立刻可以想到用状态压缩来做dp[i][j]表示以i为终点的路径 为j状态(经过了那些点)时的最短路径ps:在预处理最短路的时候不要将'$'算进去,就看成一个普通的可以走的格子就可以了因为可能会出现如下情况,'$'的费用会算了四次,所以还是先数一下有几个'$'然后再独立算吧View Code #include<cstdio>#include& 阅读全文
posted @ 2012-06-25 22:04 Because Of You 阅读(2072) 评论(1) 推荐(1)
摘要:吐槽一下,还是太弱了,这个被认为伸展树水题的题本菜搞了好久。。。给你n个数每次将第i个位置到第i大的数所在位置 之间的数进行翻转,输出的是第i大的数所在的位置伸展树的节点不需要记录任何东西,直接按照各个数在数组中的顺序建树即可(即建好伸展树后中序遍历的结果就是原数组的数)所以伸展树的节点编号的相对大小代表的是这个数在数组中的下标,这点一定要搞清楚然后建树的时候顺便记录下第i大的数所在的节点编号是什么。最后每次将第i大的数旋转到根,然后 左子树的大小 就是在数组中相对位置在这个数的左边的数的个数 因为每次将第i大的数翻转到第i个位置时,这个数就不会用到了,所以每次统计好后就直接把根节点给删了(删 阅读全文
posted @ 2012-06-25 10:35 Because Of You 阅读(2766) 评论(2) 推荐(1)
摘要:ps:D题挂了,最后只有三个。。。。E题是赛后看着一群大神的代码YY的(网上找不到题解,好奇怪,肿么都没人写的)之所以这么迟是因为一直在纠结E题A:如果第一个人能放,那就放在中间的位置,然后第二个人不管放哪第一个人总有对称的放法B:水题C:简单贪心,错了一次D:给你一幅图,假如在地板上铺上无限的同样的图,判断从S出发能否走到无限远的地方只需要判断能否从一幅图的一个点走到相对位置相同的另一幅图中的那个点即可,通过取余来表示无限幅地图E:给你一棵树,然后又给你坐标图上的n个点,让你按照树的构成将坐标连接起来,即给所有的坐标点一个编号,将树种的点与坐标对应起来树中相交的边 在坐标中体现 的线段也相交 阅读全文
posted @ 2012-06-13 22:00 Because Of You 阅读(986) 评论(0) 推荐(1)
摘要:这几个题A的好不容易啊!!!留念一下树链剖分初体验:可以解决 询问一棵树上点对间的简单路径的长度 边权的最大值最小值,并支持动态修改边权,注意,树的形态始终没有改变另外,点权的变化可以转换为边权,即每个点的点权都转移到与父节点的边之间的边权上,根节点特殊判断spoj 375贴上我巨搓无比的代码,虽然没有别人的短,虽然没有别人的快,但是毕竟它A了 -_-!!!View Code #include<cstdio>#include<cstring>#include<algorithm>using namespace std;#define lson l,m,rt& 阅读全文
posted @ 2012-06-08 20:12 Because Of You 阅读(2051) 评论(0) 推荐(0)
摘要:水哈希,将哈希值相同的映射放入一个槽内既可,哈希函数是对一个素数取余View Code #include<cstdio>#include<cstring>#include<algorithm>using namespace std;const int maxn = 4100;struct edge{ int v,next,num;}edge[3999972];int head[3999972];int hash(int num){ return (num+3899971)%3999971;}int tot;void add_edge(int num){ in 阅读全文
posted @ 2012-06-05 15:37 Because Of You 阅读(981) 评论(0) 推荐(0)
摘要:突然发现这题和省赛的线段树类型一模一样的啊,可恨早没有做In one well-known algorithm of finding thek-th order statistics we should divide all elements into groups of five consecutive elements and find the median of each five. A median is called the middle element of a sorted array (it's the third largest element for a group 阅读全文
posted @ 2012-06-04 05:15 Because Of You 阅读(711) 评论(1) 推荐(0)
摘要:k很小,每个可以保存覆盖0~k次的区间和,k次以上全算k次,可以做模板了View Code #include<cstdio>#include<cstring>#include<algorithm>using namespace std;typedef long long lld;#define lson l,m,rt<<1#define rson m+1,r,rt<<1|1const int maxn = 60000;int sum[maxn<<2][15];int cov[maxn<<2];int x[max 阅读全文
posted @ 2012-06-03 09:29 Because Of You 阅读(590) 评论(0) 推荐(0)
摘要:哎,CF终于变色了A题:我写了个二分,囧。。。B题:模拟题,水C题:想了半天,水王(一学长)告诉我是DP,果断敲了dp[i][j]表示i字符走到j字符最大的权值View Code int dp[30][30];int max(int a,int b){ return a>b?a:b;}int main(){ int n,i,j,k; char s[15]; while(scanf("%d",&n)!=EOF) { memset(dp,0,sizeof(dp)); for(k=1;k<=n;k++) { ... 阅读全文
posted @ 2012-05-28 03:14 Because Of You 阅读(438) 评论(0) 推荐(0)
摘要:有n个数,刚开始都为0add i , j 给i,j区间内的数都加1Q i j 询问i、j间能被三整除的数的个数线段树记录三个域对三取余为0的数的个数。。。。。1.。。。。。。。。。。2.。。。。。可以保存在一个数组里面考虑到每次给一个区间加1的时候,区间内对3取余为1的数的个数变成了对三取余为2,2的变成了0,0的变成了1所以每次更新到区间或者把信息(懒惰标记)往下传的时候只需要把相应的域做一下调整即可View Code #include<cstdio>#include<cstring>#include<algorithm>using namespace s 阅读全文
posted @ 2012-05-27 23:20 Because Of You 阅读(957) 评论(0) 推荐(0)
摘要:A:裸的广搜题,需要输出路径B:贪心抓住题目的特殊性,每个物品只有1 2 两种体积先按性价比排序,贪心的优先选择性价比高的,某次选了之后体积超了,就剪掉这样子遍历一遍之后还不是答案因为可能会有1体积的空位,而可能通过去掉已选集合中某个1体积的物品,再用一个2体积的物品替代达到更优解所以这里要判断一下View Code #include<cstdio>#include<cstring>#include<algorithm>using namespace std;const int maxn = 100010;struct node { int type; in 阅读全文
posted @ 2012-05-21 17:13 Because Of You 阅读(278) 评论(0) 推荐(0)
摘要:貌似和以前做过的某道题一模一样,离线查询在这里http://www.cnblogs.com/wuyiqi/archive/2012/02/13/2349290.htmlView Code #include<cstdio>#include<cstring>#include<map>#include<algorithm>using namespace std;const int maxn = 50010;__int64 c[maxn];struct node{ int l,r,id;}p[200010];map<int,int> Hash 阅读全文
posted @ 2012-05-17 17:06 Because Of You 阅读(232) 评论(0) 推荐(0)
摘要:此题有一个关键的地方决定了可以使用树状数组来搞:所有询问的区间不相互包含,但可能交叉这样就可以从左往右边添加边删除用树状数组来做了如果存在包含关系,就不能用树状数组搞了,原因的话看看poj 2104的样例数据就明白了View Code #include<cstdio>#include<cstring>#include<algorithm>using namespace std;const int maxn = 100010;struct node{ int key,id; bool operator < (const node & cm)con 阅读全文
posted @ 2012-05-17 16:59 Because Of You 阅读(794) 评论(0) 推荐(0)
摘要:http://codeforces.com/problemset/problem/12/D线段树View Code #include<cstdio>#include<cstring>#include<algorithm>using namespace std;const int inf = ~0u>>2;const int N = 500010;#define lson l,m,rt<<1#define rson m+1,r,rt<<1|1int Max[N<<2];struct node{ int x,y,z 阅读全文
posted @ 2012-05-12 20:05 Because Of You 阅读(425) 评论(0) 推荐(0)
摘要:和poj 的hotel差不多,多了一些细节处理的过程给一辆汽车安排空位的时候还需要和前后的车都保持一定的车距,如果前面没车或者后面没车,则可以停在边界上典型的线段树区间合并View Code #include<cstdio>#include<cstring>#include<vector>#include<map>#include<algorithm>using namespace std;#define lson l,m,rt<<1#define rson m+1,r,rt<<1|1const int max 阅读全文
posted @ 2012-05-01 11:15 Because Of You 阅读(529) 评论(0) 推荐(0)
摘要:题意:有一个售货员,n个顾客,卖给 i 这个顾客的价格是pi,i 顾客来买东西的时刻为 ti如果有w的时间段没人来买东西,售货员就会睡着,下一个顾客来时会叫醒她,但是不买东西售货员会卖给第i个来(相对顺序)的顾客1 + ((i- 1) mod 3)的数量的面包 即 1 2 3 中的一个问使得平均的销售额最大的最小w以及此时的平均销售额是多少( 总的销售额/顾客的个数)做法:我觉得关键是要抓住题目的特点,深挖下去,售货员每隔w时间会睡着,那就意味着,1:如果有个顾客和上一个顾客间的时间间隔超过了w,这个顾客就不糊买东西,而与上一个顾客来的时间间隔小于等于w的顾客肯定能买到面包所以我们只需枚举每个 阅读全文
posted @ 2012-04-28 10:13 Because Of You 阅读(1048) 评论(0) 推荐(0)
摘要:这题很锻炼模型转换的能力http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=3597题意:有一排的枪编号依次为1~n 有一排靶子编号依次为1~m告诉你哪些枪能打中哪些靶子,然后如果每次只能选连续的P把枪,连续的Q个靶子,每次能打中的靶子的最大值为多少答案是把每次打中的最大值相加再除以总的次数即选择 1~P 的枪能打中的最多的靶子的数量 + 2~p+1 的枪能打中的最多的靶子的数量 +。。。n-p+1~n的枪能打中的最多的靶子的数量 /(n-p+1)注意,每把枪最多只能打一个靶子解法:将题目中的关系转换为坐标 以枪为纵坐标 a 阅读全文
posted @ 2012-04-28 09:38 Because Of You 阅读(533) 评论(0) 推荐(0)
摘要:参考了这里http://blog.sina.com.cn/s/blog_6a6aa7830100x890.html题意:有N条赛道,每一条初始时都是坏的,修复第i条赛道的费用是cost[i];赛道上会举办m个赛事,每个赛事会用到[L,R]之间的赛道,而且要保证赛事进行必须使得这一段的赛道完好,每项赛事还可以获得一定的钱数。问题要求安排哪些比赛可以使得收益最大。可以设dp[i]表示到i这个赛道为止能获得最大的利益有状态转移方程dp[i]=max(dp[i-1],dp[j]+benefit[j+1][i]-mend[j+1][i]);注: j+1->i之间有赛道数据范围200000 暴力的话 阅读全文
posted @ 2012-04-25 16:34 Because Of You 阅读(606) 评论(1) 推荐(1)
摘要:这道题关键是有两个延迟标记当区间被完全覆盖时,要撤销抑或操作所以每次先判断当前区间有没有被完全覆盖有的话就直接改变相应的值,没有的话在判断有无异或标记主要是这个地方要注意,其他地方都和另外一道题一样代码有点长,但是不难View Code #include<cstdio>#include<cstring>#include<algorithm>using namespace std;const int maxn = 100010;#define lson l,m,rt<<1#define rson m+1,r,rt<<1|1int num 阅读全文
posted @ 2012-04-20 16:35 Because Of You 阅读(460) 评论(0) 推荐(2)
摘要:题意:给你一个整数序列,按照这个序列构造一颗二叉排序树输出一个整数序列,要求按照这个序列构造的二叉排序树的形状和原来的一样,而且序列的字典序最小做法:按照题目的序列构造好二叉排序树后直接按照先根遍历的顺序输出即可,因为左儿子小于右儿子,所以在根先输出的情况下,尽量都先输出左儿子,刚好符合先根遍历的特点从来不写指针,最近也偶尔写写,尝试不同的方法View Code #include<stdio.h>#include<string.h>#include<stdlib.h>struct node{ int num; struct node *left; struc 阅读全文
posted @ 2012-04-18 14:42 Because Of You 阅读(634) 评论(0) 推荐(0)
摘要:代码很好懂,不解释了View Code #include<cstdio>#include<cstring>const int maxn = 50010;int c[maxn];void add(int x,int d){ for(;x<maxn;x+=x&-x) c[x]+=d;}int sum(int x){ int ans=0; for(;x>0;x-=x&-x) ans+=c[x]; return ans;}int bin(int val,int n){ int l=1,r=n+1,best=n+2; while(l<=r)... 阅读全文
posted @ 2012-04-10 20:34 Because Of You 阅读(387) 评论(0) 推荐(0)