摘要:hdu1540:http://acm.hdu.edu.cn/showproblem.php?pid=1540题意:给你一列村庄,每个村庄给一个标号,1--n,然后毁掉一些村庄,或者重建几个村庄,重建是按照毁掉的反序建的,也就是说,最新建的是最后毁掉的那个村庄。在这些过程中会有一些查询,查询pos这个村庄所在的最长的连续村庄的个数。题解:很容易想到用线段树来维护,维护区间的最大左连续和最大右连续值,毁掉就是单点更新操作,同时把毁掉的村庄一次放入队列中,重建的时候只要从队列中取出即可。唯一难的是查询操作。一开始,我没有想到如何查询。最后只好查询了别人的代码。分几种情况, 如果pos在该区间的左连续
阅读全文
摘要:hdu3308:http://acm.hdu.edu.cn/showproblem.php?pid=3308题意:给你 100000个数列,然后更新某个点,然后查询区间内最长连续上升数列的长度,用线段树来维护区间的最大连续值,左连续最大值,右连续最大值,区间的左端点,区间的右端点。对于更新,父节点的最大值,首先求左儿子的最大值,右儿子的最大值,比较,选出大者,如果左儿子的又端点小于右儿子的左端点,则要考虑左儿子的右连续+右儿子的左连续是否大于刚才的那个值,选出大的更新。对于父节点的左连续,如果左儿子的左连续等于区间长度则父节点的左连续等于左儿子的左连续+右儿子的左连续,同理更新父节点的右连续。
阅读全文
摘要:poj3667:http://poj.org/problem?id=3667题目大意:Hotel有N(1 ≤ N ≤ 50,000)间rooms,并且所有的rooms都是连续排列在同一边,groups需要check in 房间,要求房间的编号为连续的r..r+Di-1并且r是最小的;visitors同样可能check out,并且他们每次check out都是编号为Xi ..Xi +Di-1 (1 ≤ Xi ≤ N-Di+1)的房间,题目的输入有两种样式: 1 a : groups需要check in a间编号连续的房间 2 a b : visitors check out 房间,其中房间编号
阅读全文
摘要:hdu2795:http://acm.hdu.edu.cn/showproblem.php?pid=2795题意:给一个h*w的公告牌,h是高度,w是宽度,一个单位高度1为一行,然后会有一些公告贴上去,公告是1*wi大小的长纸条,优先贴在最上面并且最左边的位置,如果没有空间贴得下,就输出-1,可以的话,就输出所贴的位置(第几行)。题解:用线段树来维护。把高度看成每一个节点,即每一行看成线段树的一个节点,而w看成底层节点的值,然后每个节点维护区间的最大值。由于h会达到10的9次方,但是只有200000的海报。随意当h大于200000时候,只需建立n==200000的树。 1 #include .
阅读全文
摘要:hdu1394:http://acm.hdu.edu.cn/showproblem.php?pid=1394题意描述:给你一个有0--n-1数字组成的序列,然后进行这样的操作,每次将最前面一个元素放到最后面去会得到一个序列,那么这样就形成了n个序列,那么每个序列都有一个逆数,找出其中最小的一个输出!题解:求最小逆序数的时候有个巧妙的想法,当把x放入数组的后面,此时的逆序数应该为x没放入最后面之前的逆序总数加上(n-x)再减去(x-1);sum = sum+(n-x[i])-(x[i]-1)。求逆序数:此题方法1:暴收 1 #include 2 #include 3 #include 4 #in
阅读全文
摘要:poj1389:http://poj.org/problem?id=1389题意:求矩形面积的并题解:扫描线加线段树 同poj1389 1 #include 2 #include 3 #include 4 #include 5 using namespace std; 6 const int maxn=2002; 7 int num; 8 struct Node{ 9 int l;10 int r;11 int tp;12 int y;13 bool operator =r)update(l,r,f,idx1){57 mid=(...
阅读全文
摘要:poj1151:http://poj.org/problem?id=1151题意:求矩形面积的并题解:扫描线加线段树 1 #include 2 #include 3 #include 4 #include 5 using namespace std; 6 const int maxn=202;//注意这里的初始化,不能开小了,是200条边 7 int num;//记录x坐标的个数 8 struct Node{ 9 double l;//边的左端点 10 double r;//边的又端点 11 int tp;//是出度边还是入度边 12 double y;/...
阅读全文
摘要:poj1050:http://poj.org/problem?id=1050题意:给你一个n*n的矩阵,求一个和最大的一个子矩阵。题解: 从第i行开始,对把i行以后的每一行一次加到第i行上,每加一次,求一遍最大子序列的和。然后枚举每一行,更新ans值。 1 #include 2 #include 3 #include 4 #include 5 using namespace std; 6 int a[102][102]; 7 int temp[102]; 8 int n,ans; 9 void in(){10 memset(a,0,sizeof(a));11 for(int i=...
阅读全文
摘要:hdu1003:http://acm.hdu.edu.cn/showproblem.php?pid=1003题意:给你n个数的序列,求一个连续最大的子序列的和。题解:简单的动态规划。从开始,选择一个连续和是递增的序列,如果当前这段和小于零.则从下一段开始,若下一段的和大于该段,则更新起点和终点。 1 #include 2 #include 3 #include 4 #include 5 using namespace std; 6 int a[100020]; 7 int n,cas; 8 int main(){ 9 scanf("%d",&cas);10 int
阅读全文
摘要:poj1018:http://poj.org/problem?id=1018题意:某公司要建立一套通信系统,该通信系统需要n种设备,而每种设备分别可以有m1、m2、m3、...、mn个厂家提供生产,而每个厂家生产的同种设备都会存在两个方面的差别:带宽bandwidths 和 价格prices。现在每种设备都各需要1个,考虑到性价比问题,要求所挑选出来的n件设备,要使得B/P最大。其中B为这n件设备的带宽的最小值,P为这n件设备的总价。题解:方法一:暴力枚举。枚举每个bandwidth,然后从剩余的n-1个类中,找出bandwith大于等于这个ban的width而且price最小的那个值,然后求
阅读全文
摘要:uva147:题意:给你几种钱币,在给你一个钱的数目,问有多少种用这些钱来组成这个数目。题解:完全背包,不过此时要把钱的数目*100,因为是小数,背包的容量都是整数,然后dp,求出每个容量的数目即可 1 #include 2 #include 3 #include 4 #include 5 #include 6 using namespace std; 7 int we[13]; 8 long long dp[30003]; 9 int main(){10 we[1]=5;we[2]=10;we[3]=20;we[4]=50;we[5]=100;11 we[6]=200;we...
阅读全文
摘要:uva674:题意:有1,5,10,25,50这五种硬币。给一个价值,求有多少种组合可以得到该价值。题解:完全背包 1 #include 2 #include 3 #include 4 #include 5 using namespace std; 6 int we[6]; 7 int dp[7499]; 8 int main(){ 9 we[1]=1;we[2]=5;we[3]=10;we[4]=25;we[5]=50;10 int n;11 12 memset(dp,0,sizeof(dp));13 dp[0]=1;14 ...
阅读全文
摘要:uva11424:题目:给出n,求gcd(1,2)+gcd(1,3)+gcd(2,3)+gcd(1,4)+gcd(2,4)+gcd(3,4)+...+gcd(1,n)+gcd(2,n)+...+gcd(n-1,n) 此题和UVA 11426 一样,不过n的范围只有20000,但是最多有20000组数据。 当初我直接照搬UVA11426,结果超时,因为没有预处理所有的结果(那题n最多4000005,但最多只有100组数据),该题数据太多了额。。。思路:令sum(n)=gcd(1,n)+gcd(2,n)+...+gcd(n-1,n),则所求结果ans(n)=sum(2)+sum(3)+...+s.
阅读全文
摘要:poj2823:http://poj.org/problem?id=2823题意:给出一个序列,要求得到所有长度为k的连续子序列的最大和最小值。题解:直接上线段树 1 #include 2 #include 3 #include 4 #include 5 using namespace std; 6 const int maxn=1000002; 7 int n,k,s; 8 struct Node{ 9 int left;10 int right;11 int minn;12 int maxn;13 }node[4*maxn];14 void build(...
阅读全文
摘要:poj2184:http://poj.org/problem?id=2184题意:给你n头牛,每头牛有一个S值和一个F值,现在的问题是,要你选出其中的一些牛求出S+T的最大值。但是要保证总的s>=0和F>=0 题解:可以把s作为体积,然后利用0,1背包。求出每个s做对应的最大的F值,然后for一遍,求出最大的f+s。因为有负的值出现,所以把 背包的容量加上一个100000;因为过程中s的值可以是小于0的,for的时候从100000开始即可,不是很好理解。 1 #include 2 #include 3 #include 4 #include 5 using namespace st
阅读全文
摘要:hdu2546:http://acm.hdu.edu.cn/showproblem.php?pid=2546题意:给你N元,每一件食品可以购买一次,如果卡上多余5元即使透支也可以刷卡。少于5元不能使用,求最多能让卡的余额为多少? 题解:01背包问题,首先拿出5元买最贵的东西,那接下来就是背包容量m-5,物品数量n-1 的01背包问题了。 1 #include 2 #include 3 #include 4 #include 5 #include 6 #define N 1003 7 using namespace std; 8 int v[N],dp[N],n,k; 9 int main(v.
阅读全文