ACdream 1101 瑶瑶想要玩滑梯

没想到线段树的基本用法这么长时间没写了还没有忘,1A的感觉还是很爽的。

题目大意:

中文题,点此查看题目。

解题思路:

线段树的区间更新与查询。

lazy标记的使用。

当需要返回区间多个值时可以使用引用参数。

下面是代码:

#include <stdio.h>
#include <string.h>
#include <algorithm>
#include <iostream>
#include <math.h>
#include <stdlib.h>

using namespace std;

int min(int a,int b)
{
    if(a>b)a=b;
    return a;
}
int max(int a,int b)
{
    if(a<b)a=b;
    return a;
}
int n,m,l,r,x;
struct node1
{
    int num,l,r,lcnt,rcnt,mcnt;
} node[100000<<2];
char s[3];
void PushUp(int l,int r,int m,int tr)
{
    node[tr].num=-1;
    node[tr].l=node[tr<<1].l;
    node[tr].r=node[tr<<1|1].r;
    node[tr].lcnt=node[tr<<1].lcnt;
    if(node[tr<<1].lcnt==m-l+1&&node[tr<<1].r<node[tr<<1|1].l)
    {
        node[tr].lcnt+=node[tr<<1|1].lcnt;
    }
    node[tr].rcnt=node[tr<<1|1].rcnt;
    if(node[tr<<1|1].rcnt==r-m&&node[tr<<1].r<node[tr<<1|1].l)
    {
        node[tr].rcnt+=node[tr<<1].rcnt;
    }
    if(node[tr<<1].r<node[tr<<1|1].l)
    {
        node[tr].mcnt=node[tr<<1].rcnt+node[tr<<1|1].lcnt;
    }
    else node[tr].mcnt=0;
    node[tr].mcnt=max(node[tr<<1].mcnt,max(node[tr<<1|1].mcnt,max(node[tr].lcnt,max(node[tr].rcnt,node[tr].mcnt))));
}
void build(int l,int r,int tr)
{
    if(l==r)
    {
        scanf("%d",&node[tr].num);
        node[tr].l=node[tr].num;
        node[tr].r=node[tr].num;
        node[tr].lcnt=1;
        node[tr].rcnt=1;
        node[tr].mcnt=1;
        return ;
    }
    int m=(l+r)>>1;
    build(l,m,tr<<1);
    build(m+1,r,tr<<1|1);
    PushUp(l,r,m,tr);
}
void Pushdown(int l,int r,int tr)
{
    if(node[tr].num!=-1)
    {
        node[tr<<1]=node[tr];
        node[tr<<1|1]=node[tr];
        node[tr].num=-1;
    }
}
void Update(int L,int R,int num,int l,int r,int tr)
{
    if(L<=l&&r<=R)
    {
        if(node[tr].num==-1)node[tr].num=0;
        node[tr].num+=num;
        node[tr].l=num;
        node[tr].r=num;
        node[tr].lcnt=1;
        node[tr].rcnt=1;
        node[tr].mcnt=1;
        return ;
    }
    if(l==r)return;
    Pushdown(l,r,tr);
    int m=(l+r)>>1;
    if(m>=L)Update(L,R,num,l,m,tr<<1);
    if(m<R)Update(L,R,num,m+1,r,tr<<1|1);
    PushUp(l,r,m,tr);
}
void copy1(int a,int b,int c,int d,int e,int &a1,int &b1,int &c1,int &d1,int &e1)
{
    a1=a;
    b1=b;
    c1=c;
    d1=d;
    e1=e;
}
void query(int L,int R,int l,int r,int tr,int &lcnt,int &lnum,int &rcnt,int &rnum,int &mnum)
{
    if(L<=l&&r<=R)
    {
        mnum=node[tr].mcnt;
        lcnt=node[tr].lcnt;
        lnum=node[tr].l;
        rcnt=node[tr].rcnt;
        rnum=node[tr].r;
        return;
    }
    if(l==r)return;
    int m=(l+r)>>1,a[2]={0},b[2]={0},c[2]={0},d[2]={0},e[2]={0};
    Pushdown(l,r,tr);
    if(m>=L)
    {
        query(L,R,l,m,tr<<1,a[0],b[0],c[0],d[0],e[0]);
    }
    if(m<R)
    {
        query(L,R,m+1,r,tr<<1|1,a[1],b[1],c[1],d[1],e[1]);
    }
    if(c[0]!=0)
    {
        if(a[1]!=0)
        {
            mnum=max(e[0],e[1]);
            lcnt=a[0];
            lnum=b[0];
            rcnt=c[1];
            rnum=d[1];
            if(d[0]<b[1])
            {
                mnum=max(mnum,c[0]+a[1]);
                if(a[0]==e[0]&&a[0]==m-l+1)
                {
                    lcnt+=a[1];
                }
                if(c[1]==e[1]&&c[1]==r-m)
                {
                    rcnt+=c[0];
                }
            }
        }
        else
        {
            copy1(a[0],b[0],c[0],d[0],e[0],lcnt,lnum,rcnt,rnum,mnum);
        }
    }
    else
    {
        copy1(a[1],b[1],c[1],d[1],e[1],lcnt,lnum,rcnt,rnum,mnum);
    }
    PushUp(l,r,m,tr);
    return ;
}
int main()
{
    scanf("%d%d",&n,&m);
    build(1,n,1);
    int temp[5];
    for(int i=0; i<m; i++)
    {
        scanf("%s",s);
        if(s[0]=='Q')
        {
            scanf("%d%d",&l,&r);
            query(l,r,1,n,1,temp[0],temp[1],temp[2],temp[3],temp[4]);
            printf("%d\n",max(temp[0],max(temp[2],temp[4])));
        }
        else if(s[0]=='U')
        {
            scanf("%d%d%d",&l,&r,&x);
            Update(l,r,x,1,n,1);
        }
    }
    return 0;
}

ACdream 1101 瑶瑶想要玩滑梯,布布扣,bubuko.com

时间: 2024-10-05 01:43:02

ACdream 1101 瑶瑶想要玩滑梯的相关文章

ACDream 1101 瑶瑶想要玩滑梯 线段树

http://blog.csdn.net/u013368721/article/details/31400053 线段树上的一种dp //Hello. I'm Peter. //#pragma comment(linker, "/STACK:102400000,102400000") #include<cstdio> #include<iostream> #include<sstream> #include<cstring> #inclu

ACdream 1101 线段树

题目链接 瑶瑶想要玩滑梯 Time Limit: 10000/5000MS (Java/Others)Memory Limit: 512000/256000KB (Java/Others) SubmitStatisticNext Problem Problem Description 众所周知,瑶瑶(tsyao)是个贪玩的萌妹子,特别喜欢闹腾,恰好今天是一个风和日丽的日子,瑶瑶嚷着让姐姐带她去去公园玩滑梯,可是公园的滑梯比较独特,由单位积木搭成,积木是排成一排搭好,每列有xi个积木,共n列.小明

ACdream 1104 瑶瑶想找回文串(SplayTree + Hash + 二分)

Problem Description 刚学完后缀数组求回文串的瑶瑶(tsyao)想到了另一个问题:如果能够对字符串做一些修改,怎么在每次询问时知道以某个字符为中心的最长回文串长度呢?因为瑶瑶整天只知道LOL,当他知道自己省选成绩的时候就天天在LOL,导致现在的她实在是太弱了,根本解决不了这个问题,于是就来找你帮忙,么么哒~你就帮帮她吗 Input 第一行为一个长度不超过100000字符串s作为初始字符串.第二行一个正整数n,表示操作/询问的个数.接下来n行,每行有如下几种可能出现的操作/询问:

acdream 瑶瑶带你玩激光坦克 (模拟)

瑶瑶带你玩激光坦克 Time Limit: 2000/1000MS (Java/Others)    Memory Limit: 256000/128000KB (Java/Others) Submit Status Problem Description 有一款名为激光坦克的游戏,游戏规则是用一个坦克发出激光来达到一些目的,激光可以通过一些镜子反射. 机智的瑶瑶为了显示自己的智商高于常人,把这个游戏改造了一下,变成了用激光攻击敌人的游戏. 瑶瑶想知道射一次激光最多可以攻击到多少个敌人. PS:

B - 瑶瑶带你玩激光坦克

B - 瑶瑶带你玩激光坦克 Time Limit: 2000/1000MS (Java/Others)    Memory Limit: 256000/128000KB (Java/Others) Submit Status Problem Description 有一款名为激光坦克的游戏,游戏规则是用一个坦克发出激光来达到一些目的,激光可以通过一些镜子反射. 机智的瑶瑶为了显示自己的智商高于常人,把这个游戏改造了一下,变成了用激光攻击敌人的游戏. 瑶瑶想知道射一次激光最多可以攻击到多少个敌人.

ACdream 1099 瑶瑶的第K大

瑶瑶的第K大 Time Limit: 10000/5000MS (Java/Others)Memory Limit: 512000/256000KB (Java/Others) SubmitStatisticNext Problem Problem Description 一天,萌萌的妹子--瑶瑶(tsyao)很无聊,就来找你玩.可是你们都不知道玩什么...尴尬了一阵子,机智的瑶瑶就提议:"这样吧,你说N个整数xi,然后在随意说一个数字k,我能够快速地说出这些数字里面第 k 大的数字."

ACdream 1103 瑶瑶正式成为CEO(树链剖分+费用流)

Problem Description 瑶瑶(tsyao)是某知名货运公司(顺丰)的老板,这个公司很大,货物运输量极大,因此公司修建了许多交通设施,掌控了一个国家的交通运输. 这个国家有n座城市,公司的总部在1号城市. 公司下管辖的有m条道路和n-1段火车线路. 这m条道路和n-1条火车线路都可以用u来表示起点,v来表示终点(数据保证m条道路和n-1条火车线路构成有向无环图). 这n-1段火车道保证从1号城市出发,能够有唯一的一道只包含火车道的线路到达其他n-1座城市. 每条道路和每段火车道都有

第K大 [ACdream 1099] 瑶瑶的第K大

瑶瑶的第K大 Time Limit: 10000/5000MS (Java/Others)Memory Limit: 512000/256000KB (Java/Others) SubmitStatisticNext Problem Problem Description 一天,萌萌的妹子--瑶瑶(tsyao)很无聊,就来找你玩.可是你们都不知道玩什么...尴尬了一阵子,机智的瑶瑶就提议:“这样吧,你说N个整数xi,然后在随意说一个数字k,我能够快速地说出这些数字里面第 k 大的数字.” Inp

OCAC暑期比赛第二场 C题 瑶瑶2356 题解

瑶瑶2356原题链接:http://codeforces.com/problemset/problem/734/B[题目描述]最近瑶瑶在房间里面发现了一个神秘的盒子.她打开盒子,发现里面存放了若干张卡片,每张卡片上面都有一个数字.瑶瑶输了一下,卡片上面的数字只有4种数值:2,3,5,6.并且,她统计了一下,一共有k2张数值为2的卡片,有k3张数值为3的卡片,有k5张数值为5的卡片,有k6张数值为6的卡片.瑶瑶最喜欢的数字是 32 和 256.所以它发现可以用这些卡片拼成数字 32 或者 256.