摘要: 其实这道题真的告诉了我一个道理,那就是仔细看题,题目中明确说出了1就是所有子树的根结点。我们可以想一想,现在每个结点代表着一段区间的询问,所以我们必须利用深搜的时间戳来找出所有结点所代表的区间。前向星见图自然不可少。更新区间的话,我们必须用离线处理,[i,j]这个区间代表着第i个数在这个区内出现k次的数的个数。View Code 1 #include<algorithm> 2 #include<iostream> 3 #include<string.h> 4 #include<cstdio> 5 #include<vector> 6 阅读全文
posted @ 2012-11-24 11:29 诺小J 阅读(348) 评论(0) 推荐(0) 编辑
摘要: 一开始接触到这道题目的时候就有了思路,应该是之前做线段树出来的结果吧,不过这个更新真的想了很久。把其中的红、绿、蓝以1、2、4来代替,那么通过位运算就能将其他的颜色状态都演化出来。代码部分就更新部分最精华,这还是参考的网上的某位大哥的神作而得来的。。View Code 1 #include<iostream> 2 #include<cstdio> 3 #include<algorithm> 4 #include<string.h> 5 #include<stdlib.h> 6 #define LL __int64 7 using st 阅读全文
posted @ 2012-11-24 11:25 诺小J 阅读(231) 评论(0) 推荐(0) 编辑
摘要: View Code 1 #include<iostream> 2 #include<cstdio> 3 #include<algorithm> 4 #include<string.h> 5 #define LL long long 6 using std::sort; 7 const int N = 100005; 8 struct Order 9 {10 int l,r,id;11 bool operator <(const Order & tmp)const12 {13 return r<tmp.r;14 }15 }ord 阅读全文
posted @ 2012-11-22 17:17 诺小J 阅读(359) 评论(0) 推荐(0) 编辑
摘要: 开始看到这道题目的时候,神题啊。。 想了一个下午,没思路。。。后面到网上一看这位大哥的解说,豁然开朗http://blog.csdn.net/gotoac/article/details/7588254每个区间分割多边形是可能是三角形或者梯形或者四边形,都是上底+下底乘高除2,这个小学就会的东西,看来现在还是不能够活用的啊。。。。View Code 1 #include<iostream> 2 #include<stdlib.h> 3 #include<cstdio> 4 #include<algorithm> 5 using std::swap 阅读全文
posted @ 2012-11-14 09:37 诺小J 阅读(148) 评论(0) 推荐(0) 编辑
摘要: 仔细分析的话,不用说了,我只是尽自己的力量去写一个尽量好看的代码。。。思路说一下: 就是先统计这个点的上区间有多少点,下区间有多少点,然后x排序再求上下区间,这个时候便可以得知已经更新进去的点一定在该点的左下方、左上方、下方。。。 由此统计出每个点被作为标准点画出,每个人的得分情况。。View Code 1 #include<iostream> 2 #include<stdio.h> 3 #include<stdlib.h> 4 #include<algorithm> 5 #include<string.h> 6 using name 阅读全文
posted @ 2012-11-13 16:01 诺小J 阅读(164) 评论(0) 推荐(0) 编辑
摘要: 刚刚敲完空间体积相交,但是这道题竟然一开始没有思路,果然还是该打,总结线段树的做题经验就是要仔细看数据的范围。解题思路:因为每一种植物的价值最大不过到100,那么我们需要的价值就是面积*价值,那么我们何不把价值作为第三个坐标轴z轴栏运算呢~ 接下来不说了,,看代码View Code 1 #include<iostream> 2 #include<stdio.h> 3 #include<algorithm> 4 #include<string.h> 5 using std::unique; 6 using std::sort; 7 const in 阅读全文
posted @ 2012-11-07 14:41 诺小J 阅读(187) 评论(0) 推荐(0) 编辑
摘要: 解题思路: 一开始看题完全没思路,本来以为要建一个三维的线段树,以为暂时不能够动了,但是之后忍不住了,看了解题报告,原来是枚举z轴上面的值就可以了,这样猥琐过都可以。。。看来还是自己观察数据不够到位。。。 然后针对每一层z轴,建立一个线段树,对覆盖三次以上的面积求和,然后再求体积。。。View Code 1 #include<iostream> 2 #include<stdio.h> 3 #include<stdlib.h> 4 #include<algorithm> 5 #include<string.h> 6 using std: 阅读全文
posted @ 2012-11-05 18:32 诺小J 阅读(198) 评论(0) 推荐(0) 编辑
摘要: 感觉学过背包的话应该就很容易做了,优先级人数最多,时间最少,那么泡到n个妹妹就有相应的最少时间,所以要开一个数组存储该人数下时间最小。。。仅此。。。View Code 1 #include<iostream> 2 #include<stdio.h> 3 #include<stdlib.h> 4 using namespace std; 5 const int INF=1000000; 6 const int N = 1002; 7 int rmb[N],rp[N],tim[N]; 8 int dp[N][120][120],num[N]; 9 int Min 阅读全文
posted @ 2012-11-04 17:20 诺小J 阅读(211) 评论(0) 推荐(0) 编辑
摘要: 刚刚看到二维线段树,吓到了,,还以为很难的类。。 刚刚入门的话,其实很简单的啦,之后就不知道了。其实就是在原来的一维线段树上面再建立一维就ok了。。。 但是我在想的是 现在是因为数据不够大,要是大了怎么办,哎,还没做到那样的题,先不管了因为每个节点都只用记录最大值。。 仔细看代码吧。。 我已经尽力调到好看了。。。View Code 1 #include<stdio.h> 2 #include<iostream> 3 #include<algorithm> 4 #include<string.h> 5 #include<stdlib.h> 阅读全文
posted @ 2012-11-03 18:52 诺小J 阅读(195) 评论(0) 推荐(0) 编辑
摘要: 实在惭愧。。。理解错了题意还A了。。题意:现在第i个数字表示i这个数字放在第几个位置上面,如果这个位置上面已经有数字则向后移动。一开始我以为是先将所有的数字放好位子之后+二分最长上升就可以,但是思路错了,真正应该记录的值是i这个数字存放在哪个位子,我们在保证数字一定上升的基础上,来求位子的上升。因为第一个数字放的是1,第二个为2,这样的话我们就能求出每次放一个数字产生的最上升序列长度了。。View Code 1 #include<iostream> 2 #include<stdio.h> 3 #include<stdlib.h> 4 const int N 阅读全文
posted @ 2012-10-31 20:38 诺小J 阅读(285) 评论(0) 推荐(0) 编辑