• 【刷题】BZOJ 4636 蒟蒻的数列


    Description

    蒟蒻DCrusher不仅喜欢玩扑克,还喜欢研究数列

    题目描述

    DCrusher有一个数列,初始值均为0,他进行N次操作,每次将数列[a,b)这个区间中所有比k小的数改为k,他想知

    道N次操作后数列中所有元素的和。他还要玩其他游戏,所以这个问题留给你解决。

    Input

    第一行一个整数N,然后有N行,每行三个正整数a、b、k。

    N<=40000 , a、b、k<=10^9

    Output

    一个数,数列中所有元素的和

    Sample Input

    4
    2 5 1
    9 10 4
    6 8 2
    4 6 3

    Sample Output

    16

    Solution

    直接动态开点线段树维护区间max
    然后对于每个位置一一查累和就好了

    #include<bits/stdc++.h>
    #define ui unsigned int
    #define ll long long
    #define db double
    #define ld long double
    #define ull unsigned long long
    const int MAXN=400000+10;
    int N=1e9,n;
    ll ans;
    template<typename T> inline void read(T &x)
    {
    	T data=0,w=1;
    	char ch=0;
    	while(ch!='-'&&(ch<'0'||ch>'9'))ch=getchar();
    	if(ch=='-')w=-1,ch=getchar();
    	while(ch>='0'&&ch<='9')data=((T)data<<3)+((T)data<<1)+(ch^'0'),ch=getchar();
    	x=data*w;
    }
    template<typename T> inline void write(T x,char ch='')
    {
    	if(x<0)putchar('-'),x=-x;
    	if(x>9)write(x/10);
    	putchar(x%10+'0');
    	if(ch!='')putchar(ch);
    }
    template<typename T> inline void chkmin(T &x,T y){x=(y<x?y:x);}
    template<typename T> inline void chkmax(T &x,T y){x=(y>x?y:x);}
    template<typename T> inline T min(T x,T y){return x<y?x:y;}
    template<typename T> inline T max(T x,T y){return x>y?x:y;}
    #define Mid ((l+r)>>1)
    #define lson l,Mid
    #define rson Mid+1,r
    struct Segment_Tree{
    	int Mx[MAXN<<5],lc[MAXN<<5],rc[MAXN<<5],cnt,root;
    	inline void Update(int &rt,int l,int r,int L,int R,int k)
    	{
    		if(!rt)rt=++cnt;
    		if(L<=l&&r<=R)chkmax(Mx[rt],k);
    		else
    		{
    			if(L<=Mid)Update(lc[rt],lson,L,R,k);
    			if(R>Mid)Update(rc[rt],rson,L,R,k);
    		}
    	}
    	inline void Query(int rt,int l,int r,int pre)
    	{
    		if(!pre&&!rt)return ;
    		int now=max(pre,Mx[rt]);
    		if(l==r)ans+=now;
    		else Query(lc[rt],lson,now),Query(rc[rt],rson,now);
    	}
    };
    Segment_Tree T;
    #undef Mid
    #undef lson
    #undef rson
    int main()
    {
    	read(n);
    	for(register int i=1;i<=n;++i)
    	{
    		int a,b,k;read(a);read(b);read(k);
    		T.Update(T.root,1,N,a,b-1,k);
    	}
    	T.Query(T.root,1,N,0);
    	write(ans,'
    ');
    	return 0;
    }
    
  • 相关阅读:
    C语言扩展题
    C语言第五题
    C语言第四题
    C语言第三题
    c语言第二题
    11
    游戏开发的一些想法
    openxml的视频教程
    JavaScript调试之console.log
    IPPatternConverter
  • 原文地址:https://www.cnblogs.com/hongyj/p/9417945.html
Copyright © 2020-2023  润新知