zoukankan      html  css  js  c++  java
  • HDOJ 5306 Gorgeous Sequence 线段树


    http://www.shuizilong.com/house/archives/hdu-5306-gorgeous-sequence/

    Gorgeous Sequence

    Time Limit: 6000/3000 MS (Java/Others)    Memory Limit: 131072/131072 K (Java/Others)
    Total Submission(s): 440    Accepted Submission(s): 87


    Problem Description
    There is a sequence a of length n. We use ai to denote the i-th element in this sequence. You should do the following three types of operations to this sequence.

    0 x y t: For every xiy, we use min(ai,t) to replace the original ai's value.
    1 x y: Print the maximum value of ai that xiy.
    2 x y: Print the sum of ai that xiy.
     

    Input
    The first line of the input is a single integer T, indicating the number of testcases. 

    The first line contains two integers n and m denoting the length of the sequence and the number of operations.

    The second line contains n separated integers a1,,an (1in,0ai<231).

    Each of the following m lines represents one operation (1xyn,0t<231).

    It is guaranteed that T=100n1000000, m1000000.
     

    Output
    For every operation of type 1 or 2, print one line containing the answer to the corresponding query.
     

    Sample Input
    1 5 5 1 2 3 4 5 1 1 5 2 1 5 0 3 5 3 1 1 5 2 1 5
     

    Sample Output
    5 15 3 12
    Hint
    Please use efficient IO method
     

    Source
     



    /* ***********************************************
    Author        :CKboss
    Created Time  :2015年07月27日 星期一 08时13分39秒
    File Name     :HDOJ5306.cpp
    ************************************************ */
    
    #include <iostream>
    #include <cstdio>
    #include <cstring>
    #include <algorithm>
    #include <string>
    #include <cmath>
    #include <cstdlib>
    #include <vector>
    #include <queue>
    #include <set>
    #include <map>
    
    using namespace std;
    
    typedef long long int LL;
    
    const int maxn=1000030;
    
    int n,m;
    int a[maxn];
    
    struct Node
    {
    	LL ss;
    	int mx,tag,cv;
    
    	void toString() {
    		printf("ss: %lld mx: %d tag: %d cv: %d
    ",ss,mx,tag,cv);
    	}
    
    }T[maxn<<2];
    
    #define lrt (rt<<1)
    #define rrt (rt<<1|1)
    #define lson l,m,rt<<1
    #define rson m+1,r,rt<<1|1
    
    void push_up(int rt)
    {
    	T[rt].ss=T[lrt].ss+T[rrt].ss;
    	T[rt].mx=max(T[lrt].mx,T[rrt].mx);
    	T[rt].cv=T[lrt].cv+T[rrt].cv;
    }
    
    void pnc(int t,int l,int r,int rt)
    {
    	if(T[rt].tag!=0&&T[rt].tag<=t) return ;
    
    	int all=r-l+1;
    	if(T[rt].cv!=all)
    	{
    		T[rt].ss+=(LL)t*(all-T[rt].cv);
    		T[rt].tag=T[rt].mx=t;
    		T[rt].cv=all;
    	}
    }
    
    void push_down(int l,int r,int rt)
    {
    	if(T[rt].tag)
    	{
    		int m=(l+r)/2;
    		pnc(T[rt].tag,lson); pnc(T[rt].tag,rson);
    	}
    }
    
    /// 清除掉全部大于t的标记
    void fix(int t,int l,int r,int rt)
    {
    	if(T[rt].mx<t) return ;
    
    	if(T[rt].tag>=t) T[rt].tag=0;
    	if(l==r)
    	{
    		T[rt].ss=T[rt].mx=T[rt].tag;
    		T[rt].cv=T[rt].tag!=0;
    	}
    	else
    	{
    		push_down(l,r,rt);
    		int m=(l+r)/2;
    		fix(t,lson); fix(t,rson);
    		push_up(rt);
    	}
    }
    
    void build(int l,int r,int rt)
    {
    	if(l==r)
    	{
    		T[rt].ss=T[rt].mx=T[rt].tag=a[l];
    		T[rt].cv=1;
    		return ;
    	}
    
    	T[rt].tag=0;
    	int m=(l+r)/2;
    	build(lson); build(rson);
    	push_up(rt);
    }
    
    /// 0
    void update(int L,int R,int t,int l,int r,int rt)
    {
    	if(T[rt].mx<=t) return ;
    
    	if(L<=l&&r<=R)
    	{
    		fix(t,l,r,rt);
    		if(l==r)
    		{
    			T[rt].ss=T[rt].mx=T[rt].tag=t; 
    			T[rt].cv=1;
    		}
    		else push_up(rt);
    
    		pnc(t,l,r,rt);
    	}
    	else 
    	{
    		push_down(l,r,rt);
    		int m=(l+r)/2;
    		if(L<=m) update(L,R,t,lson); 
    		if(R>m) update(L,R,t,rson);
    		push_up(rt);
    	}
    }
    
    /// 1
    int query_max(int L,int R,int l,int r,int rt)
    {
    	if(L<=l&&r<=R) return T[rt].mx;
    
    	push_down(l,r,rt);
    
    	int m=(l+r)/2;
    	int ret=0;
    
    	if(L<=m) ret=max(ret,query_max(L,R,lson));
    	if(R>m) ret=max(ret,query_max(L,R,rson));
    
    	return ret;
    }
    
    /// 2
    LL query_sum(int L,int R,int l,int r,int rt)
    {
    	if(L<=l&&r<=R) return T[rt].ss;
    
    	push_down(l,r,rt);
    
    	int m=(l+r)/2;
    
    	LL ret=0;
    	if(L<=m) ret+=query_sum(L,R,lson);
    	if(R>m) ret+=query_sum(L,R,rson);
    
    	return ret;
    }
    
    void show(int l,int r,int rt)
    {
    	printf("rt: %d %d <---> %d
       ",rt,l,r);
    	T[rt].toString();
    
    	if(l==r) return ;
    
    	int m=(l+r)/2;
    	show(lson); show(rson);
    }
    
    /********** fast read **************/
    
    
    char *ch,buf[40*1024000+5];
    
    void nextInt(int& x)
    {
    	x=0;
    	for(++ch;*ch<=32;++ch);
    	for(x=0;'0'<=*ch;ch++) x=x*10+*ch-'0';
    }
    
    
    int main()
    {
    	//freopen("in.txt","r",stdin);
    	//freopen("out.txt","w",stdout);
    
    	ch=buf-1;
    	fread(buf,1,1000*35*1024,stdin);
    
    	int T_T;
    	nextInt(T_T);
    
    	while(T_T--)
    	{
    		nextInt(n); nextInt(m);
    
    		for(int i=1;i<=n;i++) nextInt(a[i]);
    
    		build(1,n,1);
    
    		int k,l,r,t;
    		while(m--)
    		{
    			nextInt(k);
    			if(k==0)
    			{
    				nextInt(l); nextInt(r); nextInt(t);
    				update(l,r,t,1,n,1);
    			}
    			else if(k==1)
    			{
    				nextInt(l); nextInt(r);
    				printf("%d
    ",query_max(l,r,1,n,1));
    			}
    			else if(k==2)
    			{
    				nextInt(l); nextInt(r);
    				//printf("%lld
    ",query_sum(l,r,1,n,1));
    				printf("%I64d
    ",query_sum(l,r,1,n,1));
    			}
    		}
    	}
        return 0;
    }
    


  • 相关阅读:
    php优秀框架codeigniter学习系列——安装,配置
    设计模式学习系列——桥接模式
    elasticsearch学习笔记——相关插件和使用场景
    elasticsearch学习笔记——安装,初步使用
    设计模式学习系列——适配器模式
    php优秀框架codeigniter学习系列——前言
    设计模式学习系列——原型模式
    angular 自定义指令 directive transclude 理解
    inq to datatable group by 多列 实现
    CSS3 media 入门
  • 原文地址:https://www.cnblogs.com/mthoutai/p/6995240.html
Copyright © 2011-2022 走看看