hdu1823 二维线段树

题意:中文题 而且是选择女朋友 应该都理解了吧 = =


解法:其实就是怎么搞二维线段树 可以在纸上画一下 所谓的二维线段树还是很清楚的 就是有一颗线段树 然后它的每一个节点都是一颗线段树,所维护的其实是一个矩阵的值 然后这一道题目是单点修改矩阵的值 然后进行统计举证中的最大值是多少 然后我们要摆平的其实只是插入的时候 在进行单点更新的时候必然会出现一条从顶到底的长度为logn的路径

我们对此的策略是路径上的每一个点都需要更新 当然这里所说的只是两种二维写法中的一种 然后我们对于路径上的每一颗树(就是节点所代表的)都进行logn的更新 那么我们一共更新了 logn*logn个节点

然后统计就不用说了吧 先找出所需要的第一维的区间 然后在这些区间所代表的树里面找出所需要的子区间 然后统计最大值即可


注意点:在进行插入的时候 对于不是非叶节点所代表的树 再更新的时候用到了一个忽略第一维的写法 

另外这一道题目很XX 还有一些精度上面的限制 

#include
#include
#include
#include
#include
using namespace std;
#define xls (xrt<<1)
#define xrs (xrt<<1|1)
#define xmid ((xl+xr)>>1)

#define yls (yrt<<1)
#define yrs (yrt<<1|1)
#define ymid ((yl+yr)>>1)
#define eps 1e-6
//h---x
#define hmax 222
#define amax 1111
double ma[hmax<<2][amax<<2];
double max(double x,double y){
    return x>y?x:y;
}
void ins(int xrt,int xl,int xr,int x,int yrt,int yl,int yr,int y,double w){
//    printf("%.2f\n",ma[xrt][yrt]);
    
    if(xl==xr){
        if(yl==yr){
            ma[xrt][yrt]=max(ma[xrt][yrt],w);
            return ;
        }
        if(y<=ymid)ins(xrt,xl,xr,x,yls,yl,ymid,y,w);
        else if(ymidhr)swap(hl,hr);
                if(al>ar)swap(al,ar);
                double ans=query(1,1,hmax,hl,hr,1,1,amax,(int)(al*10+eps+1),
                                      (int)(ar*10+eps+1));
                if(abs(ans+1)

表达很烂 有什么不懂的还是看代码吧


你可能感兴趣的:(线段树&&树状数组)