首页 > 其他分享 >魔法逝

魔法逝

时间:2024-09-08 19:36:40浏览次数:7  
标签:begin int 魔法 delta quad first op

原题链接

$\quad $ 先考虑如何处理 \(max(a_p + a_q ,b_p + b_q)\) ,当 \(a_p +a_q \ge b_p +b_q\) 时,\(a_p -b_p \ge b_q -a_q\) 。

$\quad $ 那我们记法杖的 \(\delta _{p}=a_p -b_p\) ,咒语的 \(\delta_{q}=b_q -a_q\) ,那么 \(max(a_p + a_q ,b_p + b_q)\) 的取值就只和 \(\delta_{p}\) 和 \(\delta_{q}\) 的大小有关。

$\quad $ 可以发现 \(\delta \in [-2.5 \times 10^5,2.5 \times 10^5]\) ,这个数据范围建一棵线段树的话内存是可以接受的(当然动态开点最好,但是我学得不好)。
$\quad $ 对于每一个特定的 \(\delta\) ,我们开两个 \(multiset\) 来分别记录该点的所有法杖和咒语。
$\quad $ 细节都在注释里了。

#define yhl 0
#include<bits/stdc++.h>
using namespace std;
#define ld (x<<1)
#define rd (x<<1|1)
#define IN_MA (1e8)
const int N=1e6+10,res=2.5e5+1;
int m,flag,lan;
struct stu{
    int l,r,a,al,b,bl,ans;
}s[N<<2];
multiset<pair<int,int> >q[N][2];
//只给叶子节点开即可。
inline int min(int x,int y){return x<y?x:y;}
void push_up(int x){
    s[x].ans=min({s[ld].ans,s[rd].ans,s[rd].a+s[ld].al,s[ld].b+s[rd].bl});
    //这里不仅要算上左右子树的答案,还要找出跨左右子树的答案进行更新。
    s[x].a=min(s[ld].a,s[rd].a);
    s[x].al=min(s[ld].al,s[rd].al);
    s[x].b=min(s[ld].b,s[rd].b);
    s[x].bl=min(s[ld].bl,s[rd].bl);
}
void build(int x,int l,int r){
    s[x].l=l,s[x].r=r;
    if(l==r){
        s[x].ans=IN_MA;
        s[x].a=IN_MA;
        s[x].b=IN_MA;
        s[x].al=IN_MA;
        s[x].bl=IN_MA;
        q[s[x].l][yhl].insert(make_pair(IN_MA,IN_MA));
        q[s[x].l][1].insert(make_pair(IN_MA,IN_MA));
        //全初始化成极大值,在两个set里插入极大值,这样就不用判空了。
        return;
    }
    int mid=l+r>>1;
    build(ld,l,mid);
    build(rd,mid+1,r);
    push_up(x);
}
void add(int x,int pos,pair<int,int> op,bool is_a){
    if(s[x].l==s[x].r){
        q[s[x].l][is_a].insert(op);
        if(is_a){
            s[x].a=min(s[x].a,op.first);
            s[x].b=min(s[x].b,op.second);
        }else{
            s[x].al=min(s[x].al,op.first);
            s[x].bl=min(s[x].bl,op.second);
        }
        if(q[s[x].l][is_a].size()&&q[s[x].l][is_a^1].size())
            s[x].ans=(*q[s[x].l][is_a].begin()).first+(*q[s[x].l][is_a^1].begin()).first;
        //在同一位置,对于法杖或咒语来说,a、b之间的差值是一定的,当a最小时,b也最小。
        return;
    }
    int mid=s[x].l+s[x].r>>1;
    if(pos<=mid)add(ld,pos,op,is_a);
    else add(rd,pos,op,is_a);
    push_up(x);
}
void del(int x,int pos,pair<int,int>op,bool is_a){
    if(s[x].l==s[x].r){
        q[s[x].l][is_a].erase(q[s[x].l][is_a].find(op));
        if(is_a){
            s[x].a=(*q[s[x].l][1].begin()).first;
            s[x].b=(*q[s[x].l][1].begin()).second;
        }else{
            s[x].al=s[x].bl=IN_MA;
            s[x].al=(*q[s[x].l][yhl].begin()).first;
            s[x].bl=(*q[s[x].l][yhl].begin()).second;
        }
        s[x].ans=(*q[s[x].l][is_a].begin()).first+(*q[s[x].l][is_a^1].begin()).first;
        return;
    }
    int mid=s[x].l+s[x].r>>1;
    if(pos<=mid)del(ld,pos,op,is_a);
    else del(rd,pos,op,is_a);
    push_up(x);
}
int main(){
    scanf("%d%d",&m,&flag);
    build(1,1,500001);
    //偏移量最小设置为2.5e5+1。
    while(m--){
        int op,fl,a,b;
        scanf("%d%d%d%d",&op,&fl,&a,&b);
        if(flag)a^=lan,b^=lan;
        if(op==1){
            if(fl)add(1,res+b-a,make_pair(a,b),yhl);
            else add(1,res+a-b,make_pair(a,b),1);
        }else{
            if(fl)del(1,res+b-a,make_pair(a,b),yhl);
            else del(1,res+a-b,make_pair(a,b),1);
        }
        lan=s[1].ans>=1e8?yhl:s[1].ans;;
        printf("%d\n",lan);
    }
    return yhl;
}

标签:begin,int,魔法,delta,quad,first,op
From: https://www.cnblogs.com/0shadow0/p/18403075

相关文章

  • Objective-C 动态调用秘籍:NSInvocation 的魔法
    标题:Objective-C动态调用秘籍:NSInvocation的魔法在Objective-C编程中,NSInvocation是一个强大的工具,它允许你在运行时动态地调用方法。这种能力对于实现诸如方法拦截、依赖注入、或者在不知道方法签名的情况下调用方法等高级功能至关重要。本文将深入探索NSInvocation的使用方法,并......
  • python 魔法函数
    概述魔法函数(MagicMethods),是Python的一种高级语法,允许在类中自定义函数(函数名格式一般为__xx__),并绑定到类的特殊方法中。比如在类A中自定义__str__()函数,则在调用str(A())时,会自动调用__str__()函数,并返回相应的结果。在我们平时的使用中,可能经常使用__init__函数(构造函数)和__d......
  • 缓冲区的奥秘:解析数据交错的魔法6
    在计算机科学的广袤世界里,有一项看似简单却又深奥无比的技术,那就是缓冲。缓冲,像是隐藏在代码背后的魔法,它默默地改变着数据的流动,使得看似杂乱无章的操作变得井然有序。然而,它的本质并非只是简单的数据暂存,而是一种艺术,一门科学。一、理解缓存区的好处(一)直观性的理解在Java......
  • 数据库守护者:揭秘MySQL组复制的高可用魔法
    mysql高可用之组复制(MGR)(数据库守护者:揭秘MySQL组复制的高可用魔法)什么是MySQLGroupReplication?MySQLGroupReplication是一个基于组通信的复制解决方案,它允许将多个MySQL实例组织成一个组,在该组内进行事务的一致性复制。这样可以确保即使某个实例发生故障,其他实例......
  • Python中的集合魔法:解锁高效数据处理的秘密
    引言集合是一种不允许重复元素的数据结构,并且其内部元素无序排列。这种特性使得集合在某些场景下表现得极为出色:去重:快速去除列表或数组中的重复项。交集、并集、差集等运算:用于比较两个或多个集合间的关系,非常适用于权限控制、用户管理等领域。性能优势:相较于列表,集合......
  • 无魔法利用GPT4o-mini改善网页翻译
    步骤浏览器安装沉浸式翻译插件:https://immersivetranslate.com/进入伊莉思AGI网址:https://agi.ylsap.com/,创建账号并进入个人中心创建并复制APIKEY进入沉浸式翻译插件设置按如下设置展开更多选项https://api.ylsagi.io/tolinks/v2/translators/chat/completions测试......
  • 探索Java的String魔法:揭秘“+”操作符的实现
    探索Java的String魔法:揭秘“+”操作符的实现在Java的世界里,String是一个无处不在的数据类型,它用于存储和操作文本数据。String的“+”操作符是连接字符串的常用方式,但你是否曾想过,这个看似简单的操作符背后隐藏着怎样的魔法?本文将深入探讨Java中String的“+”操作符是如何......
  • 一个免费好用的魔法
    这款虽然是免费的但一天只能免费一个小时,但你可以多造几个号就能一直免费用的时候要把火绒,360等类似的软件关了,不然有时候会得不了。因为是免费的所以有人数限制,一般在9.30之后人都特别多,只有到晚上或者中午和早上时候人少,手机端和PC端是分开的,手机端人是特别少的。官网连接:htt......
  • 探索Python中的拼音魔法:pypinyin库的奇妙之旅
    文章目录探索Python中的拼音魔法:pypinyin库的奇妙之旅背景:为何选择pypinyin?库简介:pypinyin是什么?安装指南:如何将pypinyin纳入你的项目?功能探索:pypinyin的五大核心函数实战演练:pypinyin在不同场景下的应用常见问题:使用pypinyin时的三个常见bug及解决方案总结:pypinyin-你......
  • 《C++模板元编程:编程世界的魔法艺术》
    在C++的广阔编程领域中,模板元编程犹如一种神秘而强大的魔法艺术,为开发者打开了一扇通往极致性能与高度灵活性的大门。那么,究竟什么是模板元编程?又该如何在C++中进行模板元编程呢?首先,让我们来理解一下模板元编程的概念。模板元编程是一种在编译期进行计算和代码生成的技术......