nyoj 1217 GLaDOS的耳机(线段树,开两个标记数组维护)

本文介绍了一个基于线段树的数据结构问题——GLaDOS的耳机升级挑战。该问题涉及耳机线上的操作,包括涂漆及查询重量等,并通过线段树来高效地解决这些操作。

  • 1217-GLaDOS的耳机


  • 内存限制:64MB时间限制:3000msSpecial Judge: No

  • accepted:8submit:40


题目描述:

       GLaDOS是个耳机控。对于他来说,已经不满足于只是听出供电设备是水电、核电还是火电了。GLaDOS有更大的目标,他想听出宇宙中最神秘的代号为"Y_A_FL"的声音。为了实现这个目的,GLaDOS决定为他的耳机加工升级。但是笨手笨脚的GLaDOS表示加工升级神马的太困难了。于是GLaDOS想请JX为他解决这个难题,而懒得不能再懒得JX又把这个难题交给了你,你能帮这两个二货解决这个问题么?
       
现在,给你一个n,表示耳机上有n个点,相邻的每两个点间距为1单位长度。从左往右,每个点的编号分别为1,2,3...n。GLaDOS想要对这条耳机线进行m次操作。对于这条耳机线,GLaDOS有两种操作:
        
⊙ 1 L R c d代表着GLaDOS想要为这条耳机线从L点到R点的这段区间上涂一层金属漆(1<=L,R<=n)金属漆的颜色为c(0<=c<=40000),新涂的金属漆会将原有的金属漆覆盖,每单位长度的金属漆重量为d(0<d<=1000)(最初耳机线的重量为0,没有颜色)。
        
⊙ 2 L R 代表着GLaDOS想要知道耳机线在L点到R点这段区间内的重量。

 m次操作结束之后,GLaDOS想知道这根耳机线的总重量和这根耳机线上颜色的种数。


输入描述:

输入包含多组数据(最多11组)每组数据的第一行是两个整数n,m(2<=n,m<=80000)分别表示耳机长度和GLaDOS的操作次数。接着是m行,每行一个操作。

输出描述:

每组数据对于每个操作2,你都将输出1个整数,代表着在L到R这段区间内的耳机线的重量。每组数据的最后一行,输出耳机的总重量和颜色种数。

样例输入:

1000 61 100 1000 1 102 500 6211 7 842 2 102 500 6211 100 347 3 232 120 217

样例输出:

12102420417123031 3


提示:

数据量不小,建议使用scanf()输入

思路:开两个lazy数组一个维护耳机的重量,另一个维护颜色值,重量应该是累加的,而耳机的值则是直接覆盖。关键是最后怎么统计颜色的种类,如建树一般跑一遍,以便确定每一段的颜色值,用vis数组标记一下,最后遍历所有的颜色值,标记过的就加一,最后输出即可。这题还要注意的是区间更新的是线段,而不是每一个点(比如说三个点只有两条线段,而这里要更新的是这两条线段而不是三个点)

比赛时纠结的是颜色种类怎么统计,想到了开两个标记数组,但当时想边更新边统计颜色数量,最后还是没写成,刚学线段树,以后还要多练练。

详细请看代码:

#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include<math.h>
#include<algorithm>
#include<iostream>
#include<queue>
#include<map>
#include<set>
#include<vector>
#include<stack>
using namespace std;
#define inf 0x3f3f3f3f
#define mem(a,b) memset(a,b,sizeof(a))
#define lson l,m,rt<<1
#define rson m+1,r,rt<<1|1
typedef long long LL;
const int mod=1e9+7;
const double pi=acos(-1);
const double eps=1e-8;
const int N=8e4+10;
LL sum[N<<2],lazy[N<<2];//重量以及重量标记
LL color[N<<2],clazy[N<<2];//颜色值以及颜色标记
bool vis[N>>1];
void pushup(int rt)
{
    sum[rt]=sum[rt<<1]+sum[rt<<1|1];
}
void pushdown(int rt,int ln,int rn)
{
    if(lazy[rt])//重量累加
    {
        lazy[rt<<1]+=lazy[rt];
        lazy[rt<<1|1]+=lazy[rt];
        sum[rt<<1]+=lazy[rt]*ln;
        sum[rt<<1|1]+=lazy[rt]*rn;
        lazy[rt]=0;
    }
    if(clazy[rt]!=-1)//颜色值直接覆盖
    {
        clazy[rt<<1]=clazy[rt];
        clazy[rt<<1|1]=clazy[rt];
        color[rt<<1]=clazy[rt];
        color[rt<<1|1]=clazy[rt];
        clazy[rt]=-1;
    }
}
void build(int l,int r,int rt)
{
    color[rt]=-1;
    clazy[rt]=-1;
    lazy[rt]=0;
    sum[rt]=0;
    if(l==r) return ;
    int m=(l+r)>>1;
    build(lson);
    build(rson);
    pushup(rt);
}
void update(int L,int R,int c,int d,int l,int r,int rt)
{
    if(L<=l&&r<=R)
    {
        lazy[rt]+=(LL)c;
        sum[rt]+=(LL)c*(r-l+1);
        clazy[rt]=(LL)d;
        color[rt]=(LL)d;
        return ;
    }
    int m=(l+r)>>1;
    pushdown(rt,m-l+1,r-m);
    if(L<=m) update(L,R,c,d,lson);
    if(R>m) update(L,R,c,d,rson);
    pushup(rt);
}
LL query(int L,int R,int l,int r,int rt)
{
    if(L<=l&&r<=R)
        return sum[rt];
    int m=(l+r)>>1;
    LL ans=0;
    pushdown(rt,m-l+1,r-m);
    if(L<=m) ans+=query(L,R,lson);
    if(R>m) ans+=query(L,R,rson);
    return ans;
}
void build_color(int l,int r,int rt)//确定每一段区间的颜色值
{
    if(l==r)
    {
        vis[color[rt]]=true;
        return ;
    }
    int m=(l+r)>>1;
    pushdown(rt,m-l+1,r-m);
    build_color(lson);
    build_color(rson);
}
int main()
{
    int m,n,op,a,b,c,d,cnt;
    while(~scanf("%d%d",&n,&m))
    {
        cnt=0;
        mem(vis,false);
        build(1,n,1);
        while(m--)
        {
            scanf("%d%d%d",&op,&a,&b);
            a++;//这里更新的是线段,n个点构成n-1条线段,所以让a++
            if(op==2) printf("%lld\n",query(a,b,1,n,1));
            else
            {
                scanf("%d%d",&c,&d);
                update(a,b,d,c,1,n,1);
            }
        }
        build_color(1,n,1);
        for(int i=0;i<=40000;i++)//遍历所有颜色值,统计
            if(vis[i]) cnt++;
        printf("%lld %d\n",query(1,n,1,n,1),cnt);
    }
}



【完美复现】面向配电网韧性提升的移动储能预布局与动态调度策略【IEEE33节点】(Matlab代码实现)内容概要:本文介绍了基于IEEE33节点的配电网韧性提升方法,重点研究了移动储能系统的预布局与动态调度策略。通过Matlab代码实现,提出了一种结合预配置和动态调度的两阶段优化模型,旨在应对电网故障或极端事件时快速恢复供电能力。文中采用了多种智能优化算法(如PSO、MPSO、TACPSO、SOA、GA等)进行对比分析,验证所提策略的有效性和优越性。研究不仅关注移动储能单元的初始部署位置,还深入探讨其在故障发生后的动态路径规划与电力支援过程,从而全面提升配电网的韧性水平。; 适合人群:具备电力系统基础知识和Matlab编程能力的研究生、科研人员及从事智能电网、能源系统优化等相关领域的工程技术人员。; 使用场景及目标:①用于科研复现,特别是IEEE顶刊或SCI一区论文中关于配电网韧性、应急电源调度的研究;②支撑电力系统在灾害或故障条件下的恢复力优化设计,提升实际电网应对突发事件的能力;③为移动储能系统在智能配电网中的应用提供理论依据和技术支持。; 阅读建议:建议读者结合提供的Matlab代码逐模块分析,重点关注目标函数建模、约束条件设置以及智能算法的实现细节。同时推荐参考文中提及的MPS预配置与动态调度上下两部分,系统掌握完整的技术路线,并可通过替换不同算法或测试系统进一步拓展研究。
先看效果: https://pan.quark.cn/s/3756295eddc9 在C#软件发过程中,DateTimePicker组件被视为一种常见且关键的构成部分,它为用户提供了图形化的途径来选取日期与时间。 此类控件多应用于需要用户输入日期或时间数据的场景,例如日程管理、订单管理或时间记录等情境。 针对这一主题,我们将细致研究DateTimePicker的操作方法、具备的功能以及相关的C#编程理念。 DateTimePicker控件是由.NET Framework所支持的一种界面组件,适用于在Windows Forms应用程序中部署。 在构建阶段,程序员能够通过调整属性来设定其视觉形态及运作模式,诸如设定日期的显示格式、是否展现时间选项、预设的初始值等。 在执行阶段,用户能够通过点击日历图标的下拉列表来选定日期,或是在文本区域直接键入日期信息,随后按下Tab键或回车键以确认所选定的内容。 在C#语言中,DateTime结构是处理日期与时间数据的核心,而DateTimePicker控件的值则表现为DateTime类型的实例。 用户能够借助`Value`属性来读取或设定用户所选择的日期与时间。 例如,以下代码片段展示了如何为DateTimePicker设定初始的日期值:```csharpDateTimePicker dateTimePicker = new DateTimePicker();dateTimePicker.Value = DateTime.Now;```再者,DateTimePicker控件还内置了事件响应机制,比如`ValueChanged`事件,当用户修改日期或时间时会自动激活。 发者可以注册该事件以执行特定的功能,例如进行输入验证或更新关联的数据:``...
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值