alflasjfaj

本文深入探讨了C++编程中高级数据结构和算法的应用,通过实例展示了如何利用STL库和自定义数据结构实现高效操作,特别关注了排序、搜索和查找等关键操作的优化技巧。此外,还介绍了如何使用模板和元编程提升代码的复用性和灵活性,为读者提供了一套实用的编程优化策略。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<iostream>
#include<algorithm>
#include<vector>
#include<cmath>
#define ls(i) T[i].ls
#define rs(i) T[i].rs
#define w(i) T[i].w
#define Find(i) (lower_bound(LX.begin(),LX.begin()+n1,i)-LX.begin())+1

using namespace std;
const int N=60000+10;
struct node{
    int ls,rs,w;
    node(){ls=rs=w=0;}
}T[2000000];
struct ope{
    int i,l,r,k;
}op[11000];
vector<int> LX,Q1,Q2;
int n,n1,m,cnt;
int a[61000],root[61000*2];
inline int lowbit(int x){
    return x&-x;
}
void build(int &i,int l,int r,int x){
    T[++cnt]=T[i]; i=cnt;
    w(i)++;
    if (l==r) return;
    int m=(l+r)>>1;
    if (x<=m) build(ls(i),l,m,x);
    else build(rs(i),m+1,r,x);
}
void ins(int &i,int l,int r,int x,int v){
    if (i==0){ T[++cnt]=T[i]; i=cnt; }
    w(i)+=v;
    if (l==r) return;
    int m=(l+r)>>1;
    if (x<=m) ins(ls(i),l,m,x,v);
    else ins(rs(i),m+1,r,x,v);
}
void my_ins(int pos,int x,int v){
    int t=Find(x);
    for (int i=pos;i<=n;i+=lowbit(i)){
        ins(root[i],1,n1,t,v);
    }
}
int Qy(vector<int> Q1,vector<int> Q2,int l,int r,int k){
    if (l==r) return l;
    int c=0;
    int m=(l+r)>>1;
    for (int i=0;i<Q1.size();i++) c-=w(ls(Q1[i]));
    for (int i=0;i<Q2.size();i++) c+=w(ls(Q2[i]));
    for (int i=0;i<Q1.size();i++) Q1[i]=(c>=k?ls(Q1[i]):rs(Q1[i]));
    for (int i=0;i<Q2.size();i++) Q2[i]=(c>=k?ls(Q2[i]):rs(Q2[i]));

    if (c>=k) return Qy(Q1,Q2,l,m,k);
    else return Qy(Q1,Q2,m+1,r,k-c);
}
void query(int l,int r,int k){
    Q1.clear();Q2.clear();
    Q1.push_back(root[l!=1?l-1+n:0]);
    Q2.push_back(root[r+n]);
    for (int i=l-1;i>0;i-=lowbit(i)) Q1.push_back(root[i]);
    for (int i=r;i>0;i-=lowbit(i)) Q2.push_back(root[i]);

    int t=Qy(Q1,Q2,1,n1,k);
    printf("%d\n",LX[t-1]);
}
void work(){
    cnt=0;
    //for (int i=0;i<n1;i++) cout<<list[i]<<" ";cout<<endl;
    memset(root,0,sizeof(root));
    for (int i=1;i<=n;i++){
        root[i+n]=root[i-1+n];
        int t=Find(a[i]);//函数lower_bound()在first和last中的前闭后开区间进行二分查找,返回大于或等于val的第一个元素位置。
	//如果所有元素都小于val,则返回last的位置
        build(root[i+n],1,n1,t);
    }
    for (int i=0;i<m;i++){
        if (op[i].i==0){
            query(op[i].l,op[i].r,op[i].k);
        //    cout<<"*** "<<i<<endl;
        }else{
            my_ins(op[i].l,a[op[i].l],-1);
            my_ins(op[i].l,op[i].r,1);
            a[op[i].l]=op[i].r;
        }
    }

}
int main(){
    int Cas;scanf("%d",&Cas);
    while (Cas--){
        scanf("%d%d",&n,&m);
        LX.clear();
        for (int i=1;i<=n;i++){
            scanf("%d",&a[i]);LX.push_back(a[i]);
        }
        char s[10];
        for (int i=0;i<m;i++){
            scanf("%s",s);
            if (s[0]=='Q'){
                op[i].i=0;
                scanf("%d%d%d",&op[i].l,&op[i].r,&op[i].k);//查询[op[i].l,op[i].r]的第op[i].k小 
            }else{
                op[i].i=1;
                scanf("%d%d",&op[i].l,&op[i].r);//将a[op[i].l]改为op[i].r 
                LX.push_back(op[i].r);
            }
        }
        sort(LX.begin(),LX.end());//把动态数组中的值排序 
        n1=unique(LX.begin(),LX.end())-LX.begin();//unique()函数是将重复的元素折叠缩编,
	//使成唯一,剔除相邻之间字符重复的,unique()函数的返回值是源数组中去除相邻之间相同字符后剩下的字符串中的最后一个字符的下一个位置
        work();
    }


    return 0;
}

内容概要:本文探讨了在MATLAB/SimuLink环境中进行三相STATCOM(静态同步补偿器)无功补偿的技术方法及其仿真过程。首先介绍了STATCOM作为无功功率补偿装置的工作原理,即通过调节交流电压的幅值和相位来实现对无功功率的有效管理。接着详细描述了在MATLAB/SimuLink平台下构建三相STATCOM仿真模型的具体步骤,包括创建新模型、添加电源和负载、搭建主电路、加入控制模块以及完成整个电路的连接。然后阐述了如何通过对STATCOM输出电压和电流的精确调控达到无功补偿的目的,并展示了具体的仿真结果分析方法,如读取仿真数据、提取关键参数、绘制无功功率变化曲线等。最后指出,这种技术可以显著提升电力系统的稳定性与电能质量,展望了STATCOM在未来的发展潜力。 适合人群:电气工程专业学生、从事电力系统相关工作的技术人员、希望深入了解无功补偿技术的研究人员。 使用场景及目标:适用于想要掌握MATLAB/SimuLink软件操作技能的人群,特别是那些专注于电力电子领域的从业者;旨在帮助他们学会建立复杂的电力系统仿真模型,以便更好地理解STATCOM的工作机制,进而优化实际项目中的无功补偿方案。 其他说明:文中提供的实例代码可以帮助读者直观地了解如何从零开始构建一个完整的三相STATCOM仿真环境,并通过图形化的方式展示无功补偿的效果,便于进一步的学习与研究。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值