dreamxr
精诚所至,金石为开!

导航

 

2012年8月3日

摘要: 【题目描述】 给定两个字符串,有两个操作 1--把其中一个串的某个位置的字符变换; 2--询问以某个位置开头的两个串完全相同的最大长度。 【分析】 可以两个字符串的相关信息转化为长为l的一个序列x(l=max(l1,l2)),若在i处两字符相同则x[i]=1否则x[i]=0, 每次更新就是线段树的单点更新,最后的询问就是从i开始的连续的最长的1的长度。 这题的更新很简单,问题是如何处理询问。 我的... 阅读全文
posted @ 2012-08-03 21:51 dreamxr 阅读(136) 评论(0) 推荐(0)
 
摘要: 【题目描述】给定两个字符串,有两个操作1--把其中一个串的某个位置的字符变换;2--询问以某个位置开头的两个串完全相同的最大长度。【分析】可以两个字符串的相关信息转化为长为l的一个序列x(l=max(l1,l2)),若在i处两字符相同则x[i]=1否则x[i]=0,每次更新就是线段树的单点更新,最后的询问就是从i开始的连续的最长的1的长度。这题的更新很简单,问题是如何处理询问。我的办法是记录区间内以左端点开始的最长的连续1的长度,询问的时候,如果点n正好被左端点开始的连续1序列覆盖,则递归结束。否则继续递归左儿子或者右儿子。另外还要处理下横跨区间的问题(具体见代码)。 1 #include&l 阅读全文
posted @ 2012-08-03 21:51 dreamxr 阅读(130) 评论(0) 推荐(0)
 

2012年8月1日

摘要: 【题目描述】给定一排连续的房间,有两个操作:1--找到一排连续尽可能靠左的n个房间,入住房间,并输出最左的房间号,如果不存在输出0;2--清空某个区间内房间的人 。【分析】非常非常经典的一道题。ps.前两天做的这题,当时想了半天没有想好怎么去维护,后来依靠题解磕磕绊绊的过了这题。结果今天写题解的时候还是没有马上想到思路,有空重新做一次这题。s[n][0]表示以区间左端点开始的连续空房间个数s[n][1]表示以区间右端点结束的连续空房间个数s[n][2]表示整个区间的连续空房间个数s[n][3]为懒惰标记。注意询问的时候要输出满足条件的最左的房间号,所以注意下判断的次序即可。#include&l 阅读全文
posted @ 2012-08-01 23:20 dreamxr 阅读(160) 评论(0) 推荐(0)
 
摘要: 【题目描述】 给定一排连续的房间,有两个操作:1--找到一排连续尽可能靠左的n个房间,入住房间,并输出最左的房间号,如果不存在输出0; 2--清空某个区间内房间的人 。 【分析】 非常非常经典的一道题。 ps.前两天做的这题,当时想了半天没有想好怎么去维护,后来依靠题解磕磕绊绊的过了这题。结果今天写题解的时候还是没有马上想到思路,有空重新做一次这题。 s[n][0]表示以区间左端点开始的连续空房间... 阅读全文
posted @ 2012-08-01 23:20 dreamxr 阅读(111) 评论(0) 推荐(0)
 
摘要: 【题目描述】给定n个区间表示某种花开放的时间,询问在某一个时刻有多少种花开放。【分析】线段树的染色问题,询问即为某点被染色的次数。这题的范围为10^9,需要离散化处理(ps.这题数据很弱,不离散化好像也能过的)。对于离散化,我的做法是把输入的区间端点和询问的一起离散化,然后在进行线段树的操作。维护的时候可以用懒惰标记的办法处理。我的方法没有使用懒惰标记,更新的时候如果找到一个被完全覆盖的区间,那就更新这个区间,其他的区间就不更新,询问的时候只要从线段树的根节点一直遍历到询问点就行,对这个路径上所有的区间值加和即可。【关于离散化】X[]数组存储需要离散化的值,然后排序,去掉值相同的点,再利用二分 阅读全文
posted @ 2012-08-01 22:56 dreamxr 阅读(162) 评论(0) 推荐(0)
 
摘要: 【题目描述】 给定n个区间表示某种花开放的时间,询问在某一个时刻有多少种花开放。 【分析】 线段树的染色问题,询问即为某点被染色的次数。 这题的范围为10^9,需要离散化处理(ps.这题数据很弱,不离散化好像也能过的)。 对于离散化,我的做法是把输入的区间端点和询问的一起离散化,然后在进行线段树的操作。 维护的时候可以用懒惰标记的办法处理。 我的方法没有使用懒惰标记,更新的时候如果找到一个被完全覆... 阅读全文
posted @ 2012-08-01 22:56 dreamxr 阅读(99) 评论(0) 推荐(0)
 
摘要: 【题目描述】给定一些点的坐标(x,y),定义某个点的level为在这个点左下方点的个数,输出每个level的点的个数。【分析】水题y的坐标已经按照递增的顺序给出,所以不用考虑y的大小,每次插入时只判断比x小的点的个数即可。#include<cstdio>#include<cstring>#define N 33000#define lson l,m,n<<1#define rson m+1,r,n<<1|1using namespace std;int s[N<<2];int ans[N];void build(int l,int r 阅读全文
posted @ 2012-08-01 22:44 dreamxr 阅读(98) 评论(0) 推荐(0)
 
摘要: 【题目描述】给定一个序列,有两个操作。U--将第A个数改成B。Q--询问[a,b]区间内最长的连续上升子序列。【算法分析】线段树的区间合并。s[n][0]表示以区间左端点开头的上升子序列长度,s[n][1]表示以区间右端点结尾的上升子序列长度s[n][2]表示整个区间最长的上升子序列长度。ps.更新s[n][2]的地方写的不够简洁,还能优化一下代码。#include<cstdio>#define N 100010#define lson l,m,n<<1#define rson m+1,r,n<<1|1using namespace std;int s[N& 阅读全文
posted @ 2012-08-01 22:39 dreamxr 阅读(155) 评论(0) 推荐(0)
 
摘要: 【题目描述】 给定一个序列,有两个操作。 U--将第A个数改成B。 Q--询问[a,b]区间内最长的连续上升子序列。 【算法分析】 线段树的区间合并。 s[n][0]表示以区间左端点开头的上升子序列长度,s[n][1]表示以区间右端点结尾的上升子序列长度s[n][2]表示整个区间最长的上升子序列长度。 ps.更新s[n][2]的地方写的不够简洁,还能优化一下代码。 #include #defin... 阅读全文
posted @ 2012-08-01 22:39 dreamxr 阅读(76) 评论(0) 推荐(0)
 

2012年7月6日

摘要: 【题目描述】给定一个区间及区间上的数,每次有一个操作,在某段区间上加某个数后者询问某段区间的和。【思路】线段树的成段更新,要用到lazy_tag,要注意int会超范围,别的没什么了,最近学习了下hh大牛的线段树风格,学习下。#include<cstdio>#define N 100010#define lson l,mid,n<<1#define rson mid+1,r,n<<1|1typedef long long LL;using namespace std;LL sum[N<<2],add[N<<2];void build(i 阅读全文
posted @ 2012-07-06 23:09 dreamxr 阅读(104) 评论(0) 推荐(0)