http://acm.hdu.edu.cn/showproblem.php?pid=1698

原创 2012年03月22日 20:28:02

第一次写线段树题,写的是静态的飘过~~~

线段树:它主要用于处理一段连续区间的插入,查找,统计,查询等操作。
复杂度: 设区间长度是n,所有操作的复杂度是logn级别。

一线段树的建图有两种。

1、最后一层建成线段,就是所有区间都是开区间,最后一层是[1,2]  [2,3] [3,4]。。。。。。

2、最后一层建成点,类似[1,1]  [2,2]..

二、更新

1、注意更新父节点对子节点的影响。

2、注意更新子节点对父节点的影响。

AC代码:

#include<iostream>
#include<string.h>
#include<algorithm>
#define L(x) (x<<1)
#define R(x) (x<<1|1)
#define MID(x,y)((x+y)>>1)
using namespace std;
typedef struct str
{
	int l;
	int r;
	int key;
}Node;
Node node[100001*4];
void build(int t,int l,int r)//建树
{
	node[t].l=l;node[t].r=r;
	node[t].key=1;
	if(l==r-1) return;
	int mid=MID(l,r);
	build(L(t),l,mid);
	build(R(t),mid,r);
}
void update(int t,int l,int r,int sum)//更新
{
	if(l==node[t].l&&r==node[t].r)
	{
		node[t].key=sum;
		return;
	}
	if(node[t].key>0)
	{
		node[L(t)].key=node[t].key;
		node[R(t)].key=node[t].key;
		node[t].key=-1;
	}
	int mid=MID(node[t].l,node[t].r);
	if(l>=mid) update(R(t),l,r,sum);
	else{
		if(r<=mid) update(L(t),l,r,sum);
		else
		{
			update(R(t),mid,r,sum);
			update(L(t),l,mid,sum);
		}
	}
}
int Quary(int t,int l,int r)//查找
{
	if(node[t].key>0)
		return node[t].key*(r-l);
	int mid=MID(node[t].l,node[t].r);
	 return Quary(R(t),mid,r)+Quary(L(t),l,mid);
	/*if(l>=mid) return Quary(R(t),l,r);
	else
	{
		if(r<=mid) return Quary(L(t),l,r);
		else
		{
			return Quary(R(t),mid,r)+Quary(L(t),l,mid);
		}
	}*/
	
}
int main()
{
	int T;
	cin>>T;
	int tot=0;
	while(T--)
	{
		int n;
		cin>>n;
		build(1,0,n);
		int m;
		cin>>m;
		while(m--)
		{
			int x,y,z;
			cin>>x>>y>>z;
			update(1,x-1,y,z);
		 }
		printf("Case %d: The total value of the hook is %d.\n",++tot,Quary(1,0,n));
    }return 0;

}

动态:

#include<iostream>
#include<string.h>
#include<cstdio>
#include<algorithm>
using namespace std;
typedef struct NODE
{
    struct NODE *lc,*rc;
    int ld,rd;
    int key;
    NODE()
    {
        key=1;
    }
}*Node,T;
class rmq{ 
public:
    Node root;
     rmq()
     {
         root=new T;
     }
     ~rmq()
     {
         delete root;
     }
         Node build(int a,int b);
         void update(Node root ,int l,int r,int sum);
         int Quary(Node root,int l,int r);
};
Node rmq::build(int a,int b)
{   
    Node root=new T;
    root->ld=a;
    root->rd=b;
    if(a==b-1) return root;
    int mid=(a+b)>>1;
    root->lc=build(a,mid);
    root->rc=build(mid,b);
    return root;
}
void rmq::update(Node root,int l,int r,int sum)
{
    if(root->ld==l&&root->rd==r)
    {  root->key=sum;
       return;
    }
	if(root->key==sum) return;
    if(root->key>0)
    {
        root->lc->key=root->key;
        root->rc->key=root->key;
        root->key=-1;
    }
    int mid=(root->ld+root->rd)>>1;
    if(l>=mid) update(root->rc,l,r,sum);
     else
    {
        if(r<=mid) update(root->lc,l,r,sum);
                   
        else
        {
            update(root->lc,l,mid,sum);
            update(root->rc,mid,r,sum);
        }
    }
}
int rmq::Quary(Node root,int l,int r)
{
    if(root->key>0)
        return root->key*(root->rd-root->ld);
    int mid=(root->ld+root->rd)>>1;
     return Quary(root->lc,l,mid)+Quary(root->rc,mid,r);
}
int main()
{
    int T;
    cin>>T;
    int tot=0;
    while(T--)
    {
        int n;
        cin>>n;
        rmq s;
        s.root=s.build(0,n);
        int m;
        cin>>m;
        while(m--)
        {
            int x,y,z;
            cin>>x>>y>>z;
            s.update(s.root,x-1,y,z);
        }
        printf("Case %d: The total value of the hook is %d.\n",++tot,s.Quary(s.root,0,n));
    }return 0;
}




openCV|Haar人脸检测与提取

python3.5.2+openCV3.2.0 Haar人脸检测与提取
  • darlingwood2013
  • darlingwood2013
  • 2017年03月20日 17:03
  • 2104

FastDFS安装与nginx反向代理配置

操作系统 Ubuntu Server nginx相关软件nginx-1.10.1 http://nginx.org/en/download.html nginx清除缓存模块 ngx_cache_...
  • ForeverSunshine
  • ForeverSunshine
  • 2016年06月28日 16:42
  • 6479

不用重新配置,用jconsole连接远程机器进程及获得本地进程的JMX Url的终极办法

估计有很多人都在想用jconsole连接远程机器上的进程时,发现没有配置jmx端口,或者其它的东东。 下面介始一种很简单的办法,可以不用重启远程机器的进程: ssh -X  192.168.66....
  • hengyunabc
  • hengyunabc
  • 2013年11月30日 21:39
  • 3957

http://acm.hdu.edu.cn/showproblem.php?pid=1020&&encoding

一道字符串处理的题~ #include #include #include #include using namespace std; int main() { int n; cin>>n;...
  • smallacmer
  • smallacmer
  • 2012年07月06日 09:33
  • 486

Advanced Fruits(链接:http://acm.hdu.edu.cn/showproblem.php?pid=1503)

定义一个标记数组,先进行初始化,标记一下公共子序列字母的状态,之后输出。...
  • LR1741670057
  • LR1741670057
  • 2015年08月12日 17:48
  • 293

一个人的旅行(http://acm.hdu.edu.cn/showproblem.php?pid=2066)SPFA||dijkstra

首先看题意,因为是城市,可以双向来往。设一个n,再输入的数据中找到最大的n值。可以看做城市的编号是1-n,然后开始dijkstra模板。...
  • LR1741670057
  • LR1741670057
  • 2015年08月20日 20:23
  • 285

确定比赛名次(http://acm.hdu.edu.cn/showproblem.php?pid=1285)

简单的拓扑排序,模板题。入门级
  • LR1741670057
  • LR1741670057
  • 2015年08月18日 17:45
  • 288

http://acm.hdu.edu.cn/showproblem.php?pid=1269&&迷宫城堡

强连通模板题,不解释。。 #include #include #include #include #include #define N 10005 #define M 100005 #define ...
  • smallacmer
  • smallacmer
  • 2012年07月16日 18:32
  • 446

http://acm.hdu.edu.cn/showproblem.php?pid=3584

三维树状数组的一个模板题。。应该是属于插线问点这一类型的。。。 题意:一开始三维数组的元素都为0,当输入操作为1时把1->0或者0->1..问经过许多次操作后该位置是1还是0,。 #include...
  • smallacmer
  • smallacmer
  • 2012年02月29日 20:25
  • 473

Happy 2004&&http://acm.hdu.edu.cn/showproblem.php?pid=1452

Total Submission(s): 609 Accepted Submission(s): 431 Problem Description Consider a positive i...
  • smallacmer
  • smallacmer
  • 2012年07月12日 16:55
  • 482
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:http://acm.hdu.edu.cn/showproblem.php?pid=1698
举报原因:
原因补充:

(最多只允许输入30个字)