07 2012 档案
摘要:http://poj.org/problem?id=2492题意:专家研究一种病毒,发现他们只与异性发生性关系。问题:查看他们是否具有同性恋关系,给出n个病毒编号从1-n,给出q中关系,每种关系x,y表示x与y有性行为,即表示他们属于异性,输出这群病毒是否具有异性关系。思路:并查集的基本作用是用来区分不同的集合关系,相同的加入同一集合,不同的则不处理。这里给出x,y的不同关系,让你判断是否是相同集合,这里我们只要把相同的合并即可,另开一个数组记录与x不同的集合的代表(只要一个点即可代表整个与x不同的集合),只要遇到x,y不同我们就把x与opt[y] y与opt[x]合并即可,这样属于同一集合的
阅读全文
摘要:pku 3264http://poj.org/problem?id=3264题意:给定n个奶牛的高度,求区间[s,e]中最高与最低高度的差值。rmq模板题目:求出最高最低然后求差。注意这里f[i][j]表示从j开始的2^i次方个数的最值。View Code #include <cstdio>#include <cstring>#include <iostream>#include <cmath>#define maxn 50007#define N 22using namespace std;int fMin[N][maxn],fMax[N][m
阅读全文
摘要:http://poj.org/summerschool/1_interval_tree.pdfhttp://www.baidu.com/s?wd=%E6%A0%91%E7%8A%B6%E6%95%B0%E7%BB%84&rsv_spt=1&issp=1&rsv_bp=0&ie=utf-8&tn=baiduhome_pg&inputT=6570
阅读全文
摘要:首先要分清a[] c[] sum[] 他们各自所代表的意思;a[]就是输入的数组;c[]就是建立的树状数组;c[i] = a[i - 2^k +1] + ...... + a[i];a有多少个c就有多少个,而且c[i]肯定包含相应的a[i];lowbit(i) = 2^k 表示i的二进制数表示形式留下左右边的1其余为取0得到的数sum[k] = c[N1] + c[N2] + c[N3].......+ c[Nm];Ni-1 = Ni - lowbit(i);求和的话,就是有c[Nm] c[Nm-1] c[Nm-2] .... c[N1]的过程 Ni - lowbit(i)的过程是将Ni的二进
阅读全文
摘要:pku 3321Apple Treehttp://poj.org/problem?id=3321题意:苹果树上有n个分叉,每个插上长着一个苹果,给出每个叉的关系,然后给出两种操作1:C x改变分叉x的苹果(如果有就拿走,如果没有就长出一个) Q x询问包括树叉x在内以及其子树的苹果数量;思路:才开始就在如何将树结构转化成线性数组结构然后用树状数组求解上难住了,最后看了一下解题报告,原来是首先边表(或邻接表)存树,然后dfs对每个节点重新编号每个节点对应着s,e两个编号。s是首先进入该点时的编号也即它本身的新标号(对应了线性数组的编号),e是搜索完子树后返回根节点的编号也即根节点本身所包含的子树
阅读全文
摘要:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=4777本来想的算法是如果V<=100000就直接进行01背包时间复杂度为O(30*100000),如果大于100000大于部分贪心选择,剩余部分在进行01背包,可是中间会出现很多问题,大于部分的的处理不好弄,如果100000加上处理后的剩余部分会出现数组越界,再说有的数据也不会过,这只是一种yy的方法,不对。后来据说是爆搜解决01背包想了想时间复杂度能够达到(10^9自己不敢写,竟没有想到剪枝弄好了能够过,于是就写了起来,这里首先从大到小排序,这样大的在前边保证先装大的
阅读全文
摘要::今天用骗数据的方法做了多校2的1002 1003感觉很爽,跟rh讨论这个题目时,他给我说了一个做这种大数据的经验YM。http://acm.hdu.edu.cn/showproblem.php?pid=4311http://acm.hdu.edu.cn/showproblem.php?pid=4312(这里给出很多点的操作)像这种O(n^2)可以解决的问题,但是数据量太大会tle的,我们可以选择小数据用O(m*n)来做,大数据则是枚举左右K个数,k取决于不超时的前提下的最大值了。(值越大对的可能性就越大)。ps:出题人出卡题的数据大多数会手写,手写的话也只是小数据量,O(m*n)大多数情况下
阅读全文
摘要:话说这次比赛做的叫一个纠结啊,各种粗心的错误,输入数据搞倒了,数组开的大小搞倒了,纠结死了。哎...粗心啊!!!wa致死才检查出这种粗心的错误。。hdu4301 http://acm.hdu.edu.cn/showproblem.php?pid=4310题意:官方是状态压缩dp,我按比率排了个序贪心的选择,险过。View Code #include <iostream>#include <cstdio>#include <algorithm>#define maxn 22using namespace std;struct node{ int d,h; do
阅读全文
摘要:这类题目会询问区间中满足条件的连续最长区间,所以PushUp的时候需要对左右儿子的区间进行合并(这里最难理解)hdu 3308http://acm.hdu.edu.cn/showproblem.php?pid=3308题意:给定n个数,下标从0-n-1,给出两种操作Q x,y询问区间[x,y]中的最长上升子序列(LCIS), U x,y 将下表为x的值替换成y(单点更新)。输出每次询问的值。思路:U操作的单点更新就不必多说了,这里关键理解的是区间的合并;节点信息:struct node{ int l,r;//记录该节点的左右边界 int lm,rm,sm;//分别对应该点包括最左点...
阅读全文
摘要:密码:1234561001http://acm.hdu.edu.cn/diy/contest_showproblem.php?pid=1001&cid=16288&hide=0模拟题目,不过在pos赋初值的时候弄错了,我的pos要的到的值是0-n-1而我给赋值成0了,因为我要用它来判断。所以纠结了老久了才检查到。这种错误很难找的。提醒一下自己认真!View Code #include <cstdio>#include <cstring>#include <iostream>#define maxn 5007using namespace st
阅读全文
摘要:不转不行,太有意思:来自:http://blog.csdn.net/nnnnyyyy/archive/2011/05/10/6410554.aspx最欣赏的是这个:以下是原文:偶是一个程序员。偶的生活很简单.确切地,用两个词,来说,就像偶写的代码一样,单调且无聊。早上七点被手机叫醒:睁开眼,刷牙,洗脸,吃早饭八点半到办公室是必须的,然后开始一天工作:那什么时候下班昵?偶不知道是会是几点钟:从日出到日落,从星期一到星期天,日子就像是写错了代码产生的一个死循环:每周双休?对偶来说只能是一种奢望:平时,他们都叫偶:X工。其实只有偶最清楚,X工不是说偶是一个姓X的工程师,而是一个姓X的民工:偶没有钱,
阅读全文
摘要:这一块关键理解延迟标记(或者说懒惰标记)lz[],就是每次更新的时候不要更新到底,用延迟标记使得更新延迟到下次需要更新或者询问到的时候再更新。这里主要包括两个方面:1:成端替换; 2:成端累加(累减);hdu 1698http://acm.hdu.edu.cn/showproblem.php?pid=1698题意:给定n个连续的奖牌(每个奖牌都有一个价值),初始都为铜牌。有q个操作X,Y,Z,将区间[x,y]内的奖牌的价值改为Z,问经过q个操作后总的价值为多少。思路:就是典型的成段替换,lz标记,关键是注意将lz pushdown。。View Code #include<iostream
阅读全文
摘要:问题描述:对于任何正整数x,起约数的个数记做g(x).例如g(1)=1,g(6)=4.如果某个正整数x满足:对于任意i(0<i<x),都有g(i)<g(x),则称x为反素数.现在给一个N,求出不超过N的最大的反素数.比如:输入1000 输出 840思维过程:求[1..N]中约数在大的反素数-->求约数最多的数如果求约数的个数 756=2^2*3^3*7^1(2+1)*(3+1)*(1+1)=24基于上述结论,给出算法:按照质因数大小递增顺序搜索每一个质因子,枚举每一个质因子为了剪枝:性质一:一个反素数的质因子必然是从2开始连续的质数.因为最多只需要10个素数构造:2,3
阅读全文
摘要:并查集结构: for (i = 0; i <= n; ++i) f[i] = i;查找祖先:int find(int x){ if (x != f[x]) { f[x] = find(f[x]); } return f[x];}合并操作:经常使用的:void Union(int x,int y){ x = find(x); y = find(y); if (x != y) { f[y] = x; num[x] += num[y];//根记录子系的个数 }}还有一种写法:void Union(int...
阅读全文
摘要:结构:struct node{ int flag; node *next[27];}*head;生成节点:/*动态分配内存*/node * newnode(){ int i; node * p = new node; // c语言用(node * )malloc(sizeof(node), 这里是动态分配内存,时间上可能消耗的多一些 p->flag = 0; for(i = 0; i < 26; i++) p->next[i] = NULL; return p;}/*静态分配内存*/node T[1000000];int t = 0...
阅读全文
摘要:hdu1166http://acm.hdu.edu.cn/showproblem.php?pid=1166题意:中文不说了,大体意思是给定n个数;接下来每行有一条命令,命令有4种形式:(1) Add i j,i和j为正整数,表示第i个营地增加j个人(j不超过30)(2)Sub i j ,i和j为正整数,表示第i个营地减少j个人(j不超过30);(3)Query i j ,i和j为正整数,i<=j,表示询问第i到第j个营地的总人数;(4)End 表示结束,这条命令在每组数据最后出现;很纯的单点更新题目:View Code #include <cstdio>#include &l
阅读全文
摘要:http://poj.org/problem?id=3686题意:有n个订单,和m个工厂,给出data[i][j]矩阵表示第i个订单在第j工厂加工消耗的时间。同一时间内每个机器只能加工一个订单,问加工完所有订单后,使得平均加工时间最小。这里关键是拆点建图,很是难理解看老长时间;假设订单N个订单的完成时间为T1 T2 T3 ......Tn。则总的时间为T = T1*n + t2*(n - 1) + ..... + Tn*1;前边完成的时间还会影响后边订单完成的时间T1T1+T2T1 +T2 + T3......设第i个订单,把第j个机器拆成N个点,这N个点中的第k个点表示第i个订单在j机器上倒
阅读全文
摘要:http://poj.org/problem?id=2400题意:有n个管理员需要雇佣n个工作人员。 每个管理员对每个工作人员的评价不同,评价值(score)从0-n-1,0代表评价最高,n-1代表评价最低,(这样处理用KMq求解时才能出现0)同样,每个工作人员对每个管理员也有不同 的评价,评价值也是从0-n-1,0代表评价值最高,n-1代表最低。问n个管理员怎样选择n个工作人员可以使的每个人的平均评价值最小。即总的评价值 /(2*n)最小。如果存在多种最佳方案,则按照字典序输出每一种情况。思路:我们把N个管理员与N个员工分成两个点集,X,Y.管理员X[i]与员工Y[j]总的评价值为X[i]对
阅读全文
摘要:HDU 4217 Data Structure?http://acm.hdu.edu.cn/showproblem.php?pid=4217CZ做的一道题目,我帮忙看了看。题意:给定N个数(1---N),K个操作,然后给K数,i1,i2,i3.......ik 每次取走当前状态下等的第i个数(从小到大的),问取走的数的和。给的那个的n为262144可以断定肯定是O(n*log(n))级的算法,所以选定线段树。叶子节点赋值为1,这些节点存储的就是数的个数,在添加一个val数组记录是哪个数。每次更新将节点a[rt]变成0,找出对应的val[rt]即可。这里坑爹的地方时sum求和时,要用—int64
阅读全文
摘要:差分约束:http://972169909-qq-com.iteye.com/blog/1185527KM算法:http://972169909-qq-com.iteye.com/blog/1184514最短路:http://972169909-qq-com.iteye.com/blog/1156071匹配:http://hi.baidu.com/_lt_zyc/item/0414aee9030341e7e1a5d4fe树状数组:http://hi.baidu.com/lilu03555/blog/item/4118f04429739580b3b7dc74.html矩阵:http://www.
阅读全文
摘要:http://poj.org/problem?id=2195在一个n*m的方格里有nx人(m)和ny个房子(H),(nx = ny)人每次可以向四周移动单位距离,花费1¥,求最小花费是每个人都能进入一个房间。最小费用最大流可以做http://www.cnblogs.com/E-star/archive/2012/06/28/2567079.html这里是个二分图求最小权匹配问题,可以用KM算法求,只要把w[i][j] 化成负数,太用木板求最大的负数,然后输出-KM()就得到最小的整数了。#include <cstdio>#include <cstring>#includ
阅读全文
摘要:两个不错的介绍KM算法的文章:1:http://www.cppblog.com/MatoNo1/archive/2011/07/23/151724.aspx2: KM算法是通过给每个顶点一个标号(叫做顶标)来把求最大权匹配的问题转化为求完备匹配的问题的。设顶点Xi的顶标为A[i],顶点Yi的顶标为B[i],顶点Xi与Yj之间的边权为w[i,j]。在算法执行过程中的任一时刻,对于任一条边(i,j),A[i]+B[j]>=w[i,j]始终成立。KM算法的正确性基于以下定理: 若由二分图中所有满足A[i]+B[j]=w[i,j]的边(i,j)构成的子图(称做相等子图)有完备匹配,那么这个完备匹
阅读全文
摘要:http://acm.hdu.edu.cn/showproblem.php?pid=2255O(n^4)模板#include <cstdio>#include <cstring>#include <iostream>#define maxn 301using namespace std;const int inf = 99999999;int w[maxn][maxn],link[maxn];int lx[maxn],ly[maxn];bool vtx[maxn],vty[maxn];int nx,ny;bool dfs(int i){ int j; vtx
阅读全文
摘要:http://poj.org/problem?id=3308题意:火星人要和地球人PK,地球人间谍搞到了一份情报:火星人要搞伞兵,登陆在地球一个row*col的地图上,而且知道伞兵的数量和每个伞兵要降落的格子。为了消灭敌人,可以在某一行或者某一列安置激光枪。每个激光枪可以瞬间消灭这一行(或者列)的敌人。安装消灭第i行的激光枪消费是ri。安装消灭第j行的激光枪消费是ci。现在总部要你花费最小的费用,安装好足够的激光枪去消灭所有的火星人,问最小的花费是多少。这里花费的定义有点不同:是每个激光器消费的乘积。思路:最小割_最大流,把伞兵看成边,行列看成节点,转化为了带权二分图最小点覆盖。加入超级源点和
阅读全文