自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

whatbeg

Stay hungry,Stay foolish.

  • 博客(99)
  • 收藏
  • 关注

原创 HDU 4578 Transformation --线段树,好题

题意: 给一个序列,初始全为0,然后有4种操作:1. 给区间[L,R]所有值+c2.给区间[L,R]所有值乘c3.设置区间[L,R]所有值为c4.查询[L,R]的p次方和(1解法: 线段树,维护三个标记,addmark,mulmark,setmark分别表示3种更新,然后p[1],p[2],p[3]分别表示该节点的1,2,3次方和。标记传递顺序setmark一定是第一个,因为s

2014-11-27 18:47:19 712

原创 HDU 4082 Hou Yi's secret --枚举

题意: 给n个点,问最多有多少个相似三角形(三个角对应相等)。解法: O(n^3)枚举点,形成三角形,然后记录三个角,最后按三个角度依次排个序,算一下最多有多少个连续相等的三元组就可以了。注意:在同一个坐标的两点只算一次,所以要判一下。代码:#include #include #include #include #include #include #

2014-11-27 18:47:17 667

原创 POJ 1556 The Doors --几何,最短路

题意: 给一个正方形,从左边界的中点走到右边界的中点,中间有一些墙,问最短的距离是多少。解法: 将起点,终点和所有墙的接触到空地的点存下来,然后两两之间如果没有线段(墙)阻隔,就建边,最后跑一个最短路SPFA,即可得出答案。代码:#include #include #include #include #include #include #include

2014-11-27 18:47:14 596

原创 POJ 1066 Treasure Hunt --几何,线段相交

题意: 正方形的房子,给一些墙,墙在区域内是封闭的,给你人的坐标,每穿过一道墙需要一把钥匙,问走出正方形需要多少把钥匙。解法: 因为墙是封闭的,所以绕路也不会减少通过的墙的个数,还不如不绕路走直线,所以枚举角度,得出直线,求出与正方形内的所有墙交点最少的值,最后加1(正方形边界)。代码:#include #include #include #include #i

2014-11-27 18:47:11 553

原创 POJ 1410 Intersection --几何,线段相交

题意: 给一条线段,和一个矩形,问线段是否与矩形相交或在矩形内。解法: 判断是否在矩形内,如果不在,判断与四条边是否相交即可。这题让我发现自己的线段相交函数有错误的地方,原来我写的线段相交函数就是单纯做了两次跨立实验,在下图这种情况是错误的:这样的话线段与右边界的两次跨立实验(叉积所以要加快速排斥。还有就是这题题目说给出的不一定是左上角,右下角依次的顺序。所以干脆重新自己定义左

2014-11-27 18:47:09 553

原创 HDU 4063 Aircraft --几何,最短路

题意: 给一些圆,要求从第一个圆的圆心走到最后一个圆的圆心,中间路径必须在某个圆内,求最短路径的长度。解法: 易知要保持在圆内且路径最短,走两圆相交的点能使路径尽量短,所以我们找出所有的两圆相交的点,再加上起点和终点,放到一个容器中,去重后,判断每两点之间的线段是否都在圆内,如果是则建边,建完所有的边后跑一个SPFA即可得出最短路。代码:#include #include

2014-11-27 18:47:06 557

原创 POJ 2653 Pick-up sticks --队列,几何

题意: 按顺序扔木棒,求出最上层的木棒是哪些。解法: 由于最上层的木棒不超过1000个,所以用一个队列存储最上层的木棒,每次扔出一个木棒后,都与队列中的木棒一一判断,看此木棒是否在某一最上层的木棒的上面,即判线段是否相交(两次跨立实验),如果相交,则将那个被压的木棒抛出队列,最后再加入扔的这个木棒到队列中。代码:#include #include #include

2014-11-27 18:47:04 676

原创 POJ 3304 Segments --枚举,几何

题意: 给n条线段,问有没有一条直线,是每条线段到这条直线上的投影有一个公共点。解法: 有公共点说明有一条这条直线的垂线过所有线段,要找一条直线过所有线段,等价于从所有线段中任选两端点形成的直线存在可以穿过所有的线段的直线(可将A平移至一条线段端点,然后绕这点旋转,使A过另一条线段端点),然后O(n^2)的枚举找任意两个线段的两个端点,还要找自己这条线段的两个端点,形成一条直线代码:

2014-11-27 18:47:01 572

原创 POJ 1269 Intersecting Lines --计算几何

题意: 二维平面,给两条线段,判断形成的直线是否重合,或是相交于一点,或是不相交。解法: 简单几何。 重合: 叉积为0,且一条线段的一个端点到另一条直线的距离为0不相交: 不满足重合的情况下叉积为0相交于一点: 直线相交的模板代码:#include #include #include #include #include #include #d

2014-11-27 18:46:56 550

原创 URAL 2014 Zhenya moves from parents --线段树

题意:儿子身无分文出去玩,只带了一张他爸的信用卡,当他自己现金不足的时候就会用信用卡支付,然后儿子还会挣钱,挣到的钱都是现金,也就是说他如果有现金就会先花现金,但是有了现金他不会还信用卡的钱。他每花一次钱和挣一次钱都会给他爸发一条短信,告诉他挣/花的钱和时间,但是给出的短信顺序时间可能不是按顺序来的,然后他爸要根据现有的短信信息推测信用卡现在的负债是多少。解法: 因为挣的钱或花的钱都只影响后面

2014-11-27 18:46:54 750

原创 HDU 4122 Alice's mooncake shop --RMQ

题意: 一个月饼店做月饼,总营业时间m小时,只能在整点做月饼,可以做无限个,不过在不同的时间做月饼的话每个月饼的花费是不一样的,假设即为cost[i],再给n个订单,即为在某个时间要多少个月饼,时间从2000年1月1日0时开始计算,必须在每个订单的时间之前完成这么多月饼,月饼还有保质期T小时以及保存费用S每小时,现在问满足这n个点的最小成本是多少。解法: 因为月饼有保质期T,所以第i个月饼

2014-11-27 18:46:51 578

原创 HDU 4121 Xiangqi --模拟

题意: 给一个象棋局势,问黑棋是否死棋了,黑棋只有一个将,红棋可能有2~7个棋,分别可能是车,马,炮以及帅。解法: 开始写法是对每个棋子,都处理处他能吃的地方,赋为-1,然后判断将能不能走到非-1的点。但是WA了好久,也找不出反例,但就是觉得不行,因为可能有将吃子的情况,可能有hack点。但是比赛后还是被我调出来了。代码:#include #include #inclu

2014-11-27 18:46:48 598

原创 HDU 4045 Machine scheduling --第二类Strling数

题意: n个数(1~n)取出r个数,取出的数相差要>=k, 然后分成m个可空组,问有多少种情况。解法: 先看从n个数中取r个相差>=k的数的方法数,可以发现 dp[i][j] = dp[1][j-1] + dp[2][j-1] + ... + dp[i-k][j-1],(dp[i][1] = i)  即维护一个前缀和即可,可以在O(r*n)内得出。然后n个不同的数分成m个可以空的组,即为第

2014-11-27 18:46:46 583

原创 HDU 4041 Eliminate Witches! --模拟

题意: 给一个字符串,表示一颗树,要求你把它整理出来,节点从1开始编号,还要输出树边。解法: 模拟即可。因为由括号,所以可以递归地求,用map存对应关系,np存ind->name的映射,每进入一层括号,使father = now, 遇到右括号')',则father = fa[father],用vector存每个节点的子节点,然后最后dfs输出即可。代码:#include #

2014-11-27 18:46:43 603

原创 HDU 5105 Math Problem --数学,求导

官方题解:f(x)=|a∗x3+b∗x2+c∗x+d|, 求最大值。令g(x)=a∗x3+b∗x2+c∗x+d,f(x)的最大值即为g(x)的正最大值,或者是负最小值。a!=0时,g′(x)=3∗a∗x2+2∗b∗x+c 求出g′(x)的根(若存在,x1,x2,由导数的性质知零点处有极值。ans=max(f(xi)|L≤xi≤R).然后考虑两个端点的特殊性有ans=max(ans,f(L)

2014-11-27 18:46:40 872

原创 2014-2015 Codeforces Trainings Season 2 Episode 7 G Gophers --线段树

题意: 有n个地鼠,m个CD碟,每个CD碟有一个影响范围,范围内的地鼠都会被吵到,每次有一个操作就是移动CD碟,然后求每次被影响的地鼠有多少只。解法: 线段树做。我们只关注地鼠有没有被吵到就可以了,之前我还去把所有可能移到的位置都存下来离散化一下,然后维护也维护错了。一堆bug,真是想多了。线段树维护两个值:  cntS[rt]表示该段被多少个区间所覆盖, NOG[rt]表示此区间内没有被

2014-11-27 18:46:38 837

原创 HDU 4419 Colourful Rectangle --离散化+线段树扫描线

题意: 有三种颜色的矩形n个,不同颜色的矩形重叠会生成不同的颜色,总共有R,G,B,RG,RB,GB,RGB 7种颜色,问7种颜色每种颜色的面积。解法: 很容易想到线段树扫描线求矩形面积并,但是如何维护每种颜色的长度着实让我伤透了脑筋。后来看了一位朋友的题解,才幡然醒悟。开始想到了用二进制表示颜色,R用001表示,G用010表示,B用100表示。那么就可以用十进制1~7表示7种不同颜色了。

2014-11-27 18:46:35 517

原创 HDU 5102 The K-th Distance

题意:给你n-1条边,然后没两个节点的距离按照递增的顺序,求出前k项的和。官方题解:把所有边(u,v) 以及(v,u)放入一个队列,队列每弹出一个元素(u,v),对于所有与u相邻的点w,如果w!=v,就把(w,u)入队。这样就能一个一个生成前K小的距离。 注意到每条边实际上会入队两次,只要把K翻倍且把ans除2即可,时间复杂度为O(n+K);这里只是实现一下而已。代码:

2014-11-27 18:46:33 691

原创 HDU 4445 Crazy Tank --枚举

题意: n个物体从高H处以相同角度抛下,有各自的初速度,下面[L1,R1]是敌方坦克的范围,[L2,R2]是友方坦克,问从某个角度抛出,在没有一个炮弹碰到友方坦克的情况下,最多的碰到敌方坦克的炮弹数。解法: 枚举角度,将pi/2分成1000份,然后枚举,通过方程 v*sin(theta)*t - 1/2*g*t^2 = -H 解出t,然后 x = v*cos(theta)*t算出水平距离,直接

2014-11-27 18:46:30 499

原创 HDU 4409 Family Name List --乱搞、LCA

题意: 给出一些名字,名字间有父子关系,有三种操作:1.按祖先到后代,兄弟间按字典序由小到大排序,然后输出2.求某个节点的兄弟节点有多少个,包括自己(注意,根节点的兄弟节点是1)3.求节点a和b的公共祖先 (注意:如果公共祖先是a或b,必须要输出其父亲,与传统的LCA可以是自己不同)解法: 先把整棵树整理出来,son[u]表示u的儿子个数,用来求兄弟个数, fa[u]表示父亲,Gs

2014-11-27 18:46:27 539

原创 HDU 5101 Select --离散化+树状数组

题意:n 组,每组有一些值,求 在不同的两组中每组选一个使值的和大于k的方法数。解法:n * Cnt[n] 先把所有数离散地存入一个树状数组中,然后每次枚举完一组的数后,将这组的数去掉。代码:#include #include #include #include #include #include #define lll __int64using

2014-11-27 18:46:24 454

原创 HDU 4460 Friend Chains --BFS

题意:问给定的一张图中,相距最远的两个点的距离为多少。解法:跟求树的直径差不多,从1 开始bfs,得到一个最远的点,然后再从该点bfs一遍,得到的最长距离即为答案。代码:#include #include #include #include #include #include #include string>#include #include #

2014-11-27 18:46:22 370

原创 HDU 4455 Substrings --递推+树状数组优化

题意: 给一串数字,给q个查询,每次查询长度为w的所有子串中不同的数字个数之和为多少。解法:先预处理出D[i]为: 每个值的左边和它相等的值的位置和它的位置的距离,如果左边没有与他相同的,设为n+8(看做无穷)。考虑已知w=k的答案,推w = k+1时,这时每个区间都将增加一个数,即后n-k个数会增加到这些区间中,容易知道,如果区间内有该数,那么个数不会加1,,即D[i] > k时,结果+

2014-11-27 18:46:19 446

原创 HDU 4454 Stealing a Cake --枚举

题意: 给一个点,一个圆,一个矩形, 求一条折线,从点出发,到圆,再到矩形的最短距离。解法: 因为答案要求输出两位小数即可,精确度要求不是很高,于是可以试着爆一发,暴力角度得到圆上的点,然后求个距离,求点到矩形的距离就是求点到四边的距离然后求个最小值,然后总的取个最小值即可。代码:#include #include #include #include #incl

2014-11-27 18:46:17 462

原创 HDU 4793 Collision --解方程

题意: 给一个圆盘,圆心为(0,0),半径为Rm, 然后给一个圆形区域,圆心同此圆盘,半径为R(R>Rm),一枚硬币(圆形),圆心为(x,y),半径为r,一定在圆形区域外面,速度向量为(vx,vy),硬币向圆盘撞过去,碰到圆盘后会以相反方向相同速度回来(好像有点违背物理规律啊,但是题目是这样,没办法)。问硬币某一部分在圆形区域内的总时间。解法: 解方程,求 (x+vx*t,y+vy*t) 代入

2014-11-27 18:46:14 731

原创 一些整数类型的表示范围

unsigned int 0~4294967295 int -2147483648~2147483647 unsigned long 0~4294967295long -2147483648~2147483647long long: -9223372036854775808~9223372036854775807u

2014-11-27 18:46:11 647

原创 HDU 4282 A very hard mathematic problem --枚举+二分(或不加)

题意:问方程X^Z + Y^Z + XYZ = K (X1)有多少个正整数解 (K解法:看K不大,而且不难看出 Z但是还可以简化,当Z=2时,X^2+Y^2+2XY = (X+Y)^2 = K, 可以特判下Z= 2的情况,即判断K是否为平方数,然后Z就可以从3开始了,这样的话X^3+... = K的话,X就变为大概1000多了,大大减小了枚举的复杂度,这样的话,直接爆都不会T了,也可以二分

2014-11-27 18:46:09 590

原创 HDU 4286 Data Handler --双端队列

题意:有一串数字,两个指针,然后一些添加,删除,反转,以及移动操作,最后输出序列。解法:可以splay做,但是其实双端队列更简便。维护三个双端队列LE,MI,RI分别表示[L,R]序列左边,[L,R]这段区间的值和[L,R]右边的值。然后维护一个revd标记表示[L,R]内的数是否被翻转了,翻转了的话改变一下一些操作就行了。自己写一个pop_Front()和pop_Back()函数,分别取

2014-11-27 18:46:06 468

原创 POJ 3416 Crossing --离线+树状数组

题意: 给一些平面上的点,然后给一些查询(x,y),即以(x,y)为原点建立坐标系,一个人拿走第I,III象限的点,另一个人拿II,IV象限的,点不会在任何一个查询的坐标轴上,问每次两人的点数差为多少。解法:离线树状数组。点不在坐标轴上,即点不共线使这题简单了不少,可以离散化点,也可以不离散化,因为x,y 见两个树状数组,一个先把所有点都modify进去,一个等待以后加元素。然后将查询

2014-11-27 18:46:03 507

原创 POJ 2464 Brownie Points II --树状数组

题意: 有点迷。有一些点,Stan先选择某个点,经过这个点画一条竖线,Ollie选择一个经过这条直接的点画一条横线。Stan选这两条直线分成的左下和右上部分的点,Ollie选左上和右下部分的点。Stan画一条竖线之后,Ollie有很多种选择,在所有选择中,Stan能获得 “分数最小值的最大值” ,而Ollie的选择便是让自己越多越好。问最后Stan最多能得到的分数是多少,以及在这种情况下Ollie

2014-11-27 18:46:01 535

原创 POJ 1990 MooFest --树状数组

题意:牛的听力为v,两头牛i,j之间交流,需要max(v[i],v[j])*dist(i,j)的音量。求所有两两头牛交谈时音量总和∑(max(v[i],v[j])*abs(x[j]-x[i])) ,x[i]表示i的坐标解法:将牛按听力从小到大排序,这样就可以使每次算一头牛与别的牛的值时听力永远取自己的听力。建两棵树状数组,一颗维护牛的坐标,一颗维护牛的个数。当遍历到某头牛 i 时,求出

2014-11-27 18:45:58 447

原创 HDU 4941 Magical Forest --STL Map应用

题意: 有n*m个格子(n,m 解法:格子太大,但是k比较小,所以考虑离散一下,把行离散出来,最多10^5行,列用map存下即可。nowR[i] = j 时表示现在的第 i 行是原来的第 j 行, nowC表示列的R[]表示该行有没有值, CntC[]表示列然后交换时直交换上面几个东西即可。查询时先找到nowR[mp[A]], nowC[B],在对应原来的那一行里面找B即可,普

2014-11-27 18:45:55 415

原创 HDU 4902 Nice boat --线段树(区间更新)

题意:给一个数字序列,第一类操作是将[l,r]内的数全赋为x ,第二类操作是将[l,r]中大于x的数赋为该数与x的gcd,若干操作后输出整个序列。解法: 本题线段树要维护的最重要的东西就是一个区间内所有数是否相等的标记。只维护这个东西都可以做出来。 我当时想歪了,想到维护Max[rt]表示该段的最大值,最大值如果我想大概是因为如果两个子树最大值或者整个两个子树的数不完全相等的话,根本不能直

2014-11-27 18:45:53 403

原创 HDU 4777 Rabbit Kingdom --容斥原理+树状数组

题意: 给一个数的序列,询问一些区间,问区间内与区间其他所有的数都互质的数有多少个。解法: 直接搞有点难, 所谓正难则反,我们求区间内与其他随便某个数不互质的数有多少个,然后区间长度减去它就是答案了。那么怎么求区间内与区间其他某个数不互质的数的个数(记为cnt)呢? 我们用L[i],R[i]表示在整个序列中左边与 i 最近的与 i 不互质的数的位置,R[i]表示右边的,L[i],R[i]我

2014-11-27 18:45:50 763

原创 HDU 4782 Beautiful Soup --模拟

题意: 将一些分散在各行的HTML代码整理成标签树的形式。解法: 模拟,具体见代码的讲解。 开始没考虑 '\t' 。。代码:#include #include #include #include #include #include #include string>using namespace std;string S,tmp,pre;

2014-11-27 18:45:47 524

原创 Codeforces Round #275 Div.1 B Interesting Array --线段树

题意: 构造一个序列,满足m个形如:[l,r,c] 的条件。 [l,r,c]表示[l,r]中的元素按位与(&)的和为c。解法: 线段树维护,sum[rt]表示要满足到现在为止的条件时该子树的按位与和至少为多少。更新时,如果val的pos位为1,那么整个区间的按位与和pos位也应该为1,否则与出来就不对了。(这是本题解题的核心)那么此时更新 sum[rt] |= val 即可。然后再ch

2014-11-27 18:45:45 452

原创 HDU 5084 HeHe --找规律

题意: 给出矩阵M,求M*M矩阵的r行c列的数,每个查询跟前一个查询的结果有关。解法: 观察该矩阵得知,令ans = M*M,则 ans[x][y] = (n-1-x行的每个值)*(n-1+y列的每个值)。直接对每个查询做n次累加(n*m=10^8的复杂度)竟然可以水过。官方题解给的是n^2的算法,维护一个前缀和,即sum[i][j] 表示 i+j不变的所有sum[i][j]之和。因为

2014-11-27 18:45:42 500

原创 HDU 5083 Instruction --模拟

题意:给出汇编指令,解释出编码或者给出编码,解释出汇编指令。解法:简单模拟,按照给出的规则一步一步来就好了,主要是注意“SET”的情况,还有要输出的东西最好放到最后一起输出,中间如果一旦不对就可以及时跳出去。其他也没什么了,只要细心点,多测几组样例就好了。代码:#include #include #include #include #include #i

2014-11-27 18:45:39 448

原创 HDU 4819 Mosaic --二维线段树(树套树)

题意: 给一个矩阵,每次查询一个子矩阵内的最大最小值,然后更新子矩阵中心点为(Max+Min)/2.解法: 由于是矩阵,且要求区间最大最小和更新单点,很容易想到二维的线段树,可是因为之前没写过二维的线段树,所以没跳出来。后来熟悉了一下,原来很多细节地方都没有考虑到。这里build,update,query都分为两个函数,第一个为Y轴的(sub_update),第二个为X轴的(update)

2014-11-27 18:45:37 445

原创 Codeforces Round #274 Div.1 C Riding in a Lift --DP

题意:给定n个楼层,初始在a层,b层不可停留,每次选一个楼层x,当|x-now| 解法: 定义:      dp[i][j] 表示第i步在j楼的不同序列的个数转移方程: 当j                    当j>b时, 那么dp[i][j] += dp[i-1][(j与b的中点(以下))~n]由于dp[i][j]的值只跟dp[i-1][]的一些值有关,所以用滚动数组会大

2014-11-27 18:45:34 413

空空如也

空空如也

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

TA关注的人

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