【替罪羊树-动态标号+线段树】BZOJ3600[没有人的算术]题解

本文介绍了一种特殊的数据结构——替罪羊树,并结合线段树解决了一个涉及动态标号的问题。通过将题目中的特殊数值转换为实数进行比较,有效地简化了比较过程。

题目概述

定义一种数,这种数只有 0(a,b) ,其中 a,b 是这种数。

定义 < :1. 0 最小。2. (a,b)<(c,d),c>a 。3. (a,b)<(a,c),c>b

现在有 n 个这种数,刚开始都是 0 。给出 m 个操作:1.将 a[k] 赋值为 (a[l],a[r]) 。2.询问 [l,r] 中最大值的编号,有多个最大值取最小编号。

解题报告

询问是裸的线段树,但是真的按题目意思去比大小的话就会非常复杂,实际上我们可以按照这种数的大小关系将每个数都等价为一个实数,然后我们比较实数大小就行了。

因为每次会产生新的数,所以这是一个动态标号问题。快速确定位置可以用平衡树,但是Treap,Splay等旋转平衡树显然无法快速编号。这样的话我们可以用替罪羊树或者非旋Treap。因为替罪羊树好打就用替罪羊树好了~

解题报告

第一次用Emacs打代码,真的是心累QAQ。

#include<cstdio>
#include<cctype>
#include<algorithm>
#define fr first
#define sc second
#define mp make_pair
using namespace std;
typedef long double DB;
const int maxn=1e5,maxt=6e5;const DB AL=0.75;

int n,te,Tail,MAX[(maxn<<2)+5];
struct node{
    node *son[2];pair<node*,node*> val;DB now;int si;node() {}
    node(node *p,pair<node*,node*> v,DB k=0,int s=1) {son[0]=son[1]=p;val=v;now=k;si=s;}
    inline void Pushup() {si=son[0]->si+1+son[1]->si;}
    inline bool isbad() {return si*AL<max(son[0]->si,son[1]->si);}
}nil(&nil,mp(&nil,&nil),0,0);
typedef node* P_node;typedef pair<P_node,P_node> data;
bool operator < (const data &a,const data &b) {return a.fr->now<b.fr->now||a.fr->now==b.fr->now&&a.sc->now<b.sc->now;}
bool operator == (const data &a,const data &b) {return a.fr==b.fr&&a.sc==b.sc;}
node tem[maxt+5];P_node si=tem,null=&nil,ro=null;
DB sl,sr;P_node ID[maxn+5],que[maxt+5],*sgt;

#define Eoln(x) ((x)==10||(x)==13||(x)==EOF)
inline char readc(){
    static char buf[100000],*l=buf,*r=buf;
    if (l==r) r=(l=buf)+fread(buf,1,100000,stdin);
    if (l==r) return EOF;return *l++;
}
inline int readi(int &x){
    int tot=0,f=1;char ch=readc(),lst='+';
    while (!isdigit(ch)) {if (ch==EOF) return EOF;lst=ch;ch=readc();}
    if (lst=='-') f=-f;
    while (isdigit(ch)) tot=(tot<<3)+(tot<<1)+ch-48,ch=readc();
    return x=tot*f,Eoln(ch);
}
inline char getfst() {char ch=readc();while (ch!='C'&&ch!='Q') ch=readc();return ch;}
#define newnode(v,k) (*si=node(null,v,k),si++)
P_node ins(P_node &p,data k,DB l=0,DB r=1){
    DB m=(l+r)/2;if (p==null) p=newnode(k,m);if (k==p->val) return p;P_node now;
    if (k<p->val) now=ins(p->son[0],k,l,m); else now=ins(p->son[1],k,m,r);
    p->Pushup();if (p->isbad()) sgt=&p,sl=l,sr=r;return now;
}
void Dfs(P_node p){
    if (p==null) return;
    Dfs(p->son[0]);que[++Tail]=p;Dfs(p->son[1]);
}
P_node Build(int L,int R,DB l,DB r){
    if (L>R) return null;int mid=L+(R-L>>1);DB m=(l+r)/2;que[mid]->now=m;
    que[mid]->son[0]=Build(L,mid-1,l,m);que[mid]->son[1]=Build(mid+1,R,m,r);
    que[mid]->Pushup();return que[mid];
}
#define Rebuild Tail=0,Dfs(*sgt),*sgt=Build(1,Tail,sl,sr)
inline P_node Insert(data k) {sgt=0;P_node now=ins(ro,k);if (sgt) Rebuild;return now;}
#define LS (p<<1)
#define RS (p<<1|1)
#define Fix(x,y) if (ID[y]->now>ID[x]->now||ID[y]->now==ID[x]->now&&y<x) x=y
inline void Pushup(int p) {MAX[p]=MAX[LS];Fix(MAX[p],MAX[RS]);}
void Update(int pos,int l=1,int r=n,int p=1){
    if (pos<l||r<pos) return;if (l==r) {MAX[p]=pos;return;}
    int mid=l+(r-l>>1);Update(pos,l,mid,LS);Update(pos,mid+1,r,RS);Pushup(p);
}
inline int Maxer(int x,int y) {Fix(x,y);return x;}
int Ask(int L,int R,int l=1,int r=n,int p=1){
    if (R<l||r<L) return 0;if (L<=l&&r<=R) return MAX[p];
    int mid=l+(r-l>>1);return Maxer(Ask(L,R,l,mid,LS),Ask(L,R,mid+1,r,RS));
}
int main(){
    freopen("program.in","r",stdin);
    freopen("program.out","w",stdout);
    readi(n);ID[0]=null;for (int i=1;i<=n;i++) ID[i]=Insert(mp(null,null)),Update(i);
    for (readi(te);te;te--){
        char td=getfst();int L,R,k;readi(L);readi(R);
        if (td=='C') readi(k),ID[k]=Insert(mp(ID[L],ID[R])),Update(k); else
        printf("%d\n",Ask(L,R));
    }
    return 0;
}
内容概要:本文针对高渗透率分布式光伏与储能变流器接入配电网所带来的运行挑战,深入研究了传统跟网型(GFL)逆变器在电网故障、弱电网及孤岛工况下易失稳脱网,以及构网型(GFM)虚拟同步发电机(VSG)逆变器在并网状态下缺乏同步调节能力的技术瓶颈,提出了一种可实现GFL与GFM双向平滑切换的先进控制策略。研究首先构建了GFL与GFM共用的硬件平台与内环控制基础,继而系统性地设计了基于关键电气量实时监测的切换判据、精确的双向切换时序逻辑,并创新性地引入了过渡过程的平滑抑制策略,以有效抑制切换瞬间的有功功率冲击、电压闪变与频率突变。全文在Matlab/Simulink环境中搭建了完整的仿真模型,通过对并网转孤岛、孤岛转并网等多种工况的动态仿真,全面验证了所提策略的有效性,结果表明该方法能确保系统在模式切换过程中电压、电流与频率的平稳过渡,显著提升了微电网在复杂运行条件下的韧性、稳定性与供电可靠性。; 适合群:从事电力电子、新能源并网、微电网控制、智能配电网等领域的高校研究生、科研院所研究员及电力系统相关企业的工程技术员。; 使用场景及目标:① 解决高比例可再生能源接入引发的电网稳定性与电能质量问题;② 实现微电网在并网与孤岛两种运行模式间的无缝、可靠切换,保障重要负荷的不间断供电;③ 为构网型与跟网型逆变器的协同运行、新型电力系统构建提供先进的控制理论依据与可落地的技术解决方案。; 阅读建议:建议结合文中提供的Simulink仿真模型进行深入学习,重点剖析切换逻辑模块的设计原理与参数整定方法,通过反复观察和分析不同工况下的仿真波形,深刻理解平滑切换过程中的动态响应机理与控制思想。
内容概要:本文提出了一种基于粒子群算法(PSO)优化模糊C均值(FCM)聚类的居民用电行为分析方法,旨在解决传统FCM算法对初始聚类中心敏感、易陷入局部最优解的问题。通过引入PSO算法全局寻优能力,优化FCM的初始聚类中心选择,显著提升了聚类结果的准确性与稳定性。研究结合Matlab平台实现了算法仿真与实证分析,有效挖掘出居民用电负荷的典型模式,为电力系统的需求侧管理、精细化负荷预测及个性化用电服务提供了可靠的数据分析基础和技术支撑。; 适合群:具备一定电力系统基础知识与Matlab编程能力,从事电力大数据分析、智能电网、负荷特性研究、需求响应等相关领域的科研员、高校研究生及工程技术开发者。; 使用场景及目标:①应用于居民用电数据的聚类分析,识别不同用户的典型用电模式与行为特征;②优化传统FCM算法性能,提升聚类过程的鲁棒性与收敛效率;③为电力公司制定差异化电价策略、实施精准需求响应措施以及开展用户画像构建提供科学依据。; 阅读建议:读者应结合Matlab代码实现部分,深入理解PSO优化FCM的整体流程,重点关注适应度函数的设计原则、PSO关键参数(如惯性权重、学习因子)的设定及其对聚类效果的影响,并建议使用真实的居民用电数据集进行实验验证与参数调优,以充分掌握该方法的实际应用技巧。
内容概要:本文系统研究了可切换构网型(Grid-Forming)与跟网型(Grid-Following)逆变器在微电网运行中的双向平滑切换控制策略,旨在解决孤岛与并网模式切换过程中常见的频率、电压突变问题,提升系统稳定性与电能质量。研究融合事件触发机制与分布式协同控制理论,设计了高效的二次频率与电压恢复控制策略,并通过Simulink搭建完整的微电网仿真模型进行验证。文中还深入探讨了通信优化、抗DoS攻击的弹性控制机制等关键技术,体现了对现代智能微电网在高可靠性、高灵活性运行方面的综合控制需求,适用于IEEE/SCI高水平期刊研究成果的复现与拓展。; 适合群:具备电力电子、自动控制或微电网相关专业知识,从事新能源发电、智能电网、分布式能源系统等方向研究的研究生、科研员及工程技术员。; 使用场景及目标:① 深入理解构网型与跟网型逆变器的工作原理及其模式切换的技术难点;② 掌握基于事件触发与分布式协同的微电网二次控制策略设计方法;③ 在Simulink环境中实现微电网多运行模式的建模与仿真,支撑学术论文复现、科研课题推进或实际工程项目开发; 阅读建议:建议结合文中提及的IEEE/SCI顶刊复现案例,循序渐进地学习控制策略的设计逻辑与仿真实现细节,重点关注模式切换的触发条件设定、控制器参数整定及系统稳定性分析,同时可利用提供的网盘资源获取完整仿真模型与代码,以加快学习与研究进程。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值