bzoj 3730 震波 - 动态点分治 - BIT

垃圾卡常题bz上过不了

#include<bits/stdc++.h>
#define gc getchar()
#define rep(i,a,b) for(int i=a;i<=b;i++)
#define Rep(i,v) rep(i,0,(int)v.size()-1)
#define lint long long
#define N 100010
#define db double
#define pb push_back
#define mp make_pair
#define fir first
#define sec second
#define debug(x) cerr<<#x<<"="<<x
#define sp <<" "
#define ln <<endl
using namespace std;
typedef pair<int,int> pii;
typedef set<int>::iterator sit;
inline int inn()
{
    int x,ch;while((ch=gc)<'0'||ch>'9');
    x=ch^'0';while((ch=gc)>='0'&&ch<='9')
        x=(x<<1)+(x<<3)+(ch^'0');return x;
}
unordered_map<int,pii> zid[N];
struct edges{
    int to,pre;
}e[N<<1];int *b[N],**bv[N],sr[N],*srv[N];
int h[N],etop,ds[N],sz[N],in[N],out[N],tms[N],dfc,Lst[N],Lcnt,vis[N],dpt[N],val[N],fa[N];
inline int add_edge(int u,int v) { return e[++etop].to=v,e[etop].pre=h[u],h[u]=etop; }
inline int update(int* &b,int p,int n,int v) { for(;p<=n;p+=(p&-p)) b[p]+=v;return 0; }
inline int query(int* &b,int p) { int ans=0;for(;p;p^=(p&-p)) ans+=b[p];return ans; }
inline int build(int* &b,int n)
{
    b=new int[n+1],b[0]=0;
    ds[0]=0;rep(i,1,n) ds[i]+=ds[i-1];
    rep(i,1,n) b[i]=ds[i]-ds[i-(i&-i)];
    return 0;
}
int getsz(int x,int f=0)
{
    sz[x]=1,Lst[++Lcnt]=x;
    for(int i=h[x],y;i;i=e[i].pre)
        if(!vis[y=e[i].to]&&e[i].to!=f) sz[x]+=getsz(y,x);
    return sz[x];
}
inline int getrt(int &x)
{
    for(int i=1,fsz=sz[x],t=fsz;i<=Lcnt;i++)
    {
        int y=Lst[i],ysz=fsz-sz[y];
        for(int j=h[y],z;j;j=e[j].pre) if(!vis[z=e[j].to])
            if(sz[z]<sz[y]) ysz=max(ysz,sz[z]);
        if(ysz<t) t=ysz,x=y;
    }
    return Lcnt=0;
}
int getdz(int x,int f,int z,int d,int c)
{
    zid[z][x]=mp(c,d),dpt[x]=1,tms[in[x]=++dfc]=x;
    for(int i=h[x],y;i;i=e[i].pre) if(!vis[y=e[i].to]&&e[i].to!=f)
        getdz(y,x,z,d+1,c),dpt[x]=max(dpt[x],dpt[y]+1);
    return out[x]=dfc;
}
int solve(int x,int f)
{
    Lcnt=0,getsz(x),getrt(x),fa[x]=f,vis[x]=1,dfc=0,dpt[x]=1;int cnt=0;
    for(int i=h[x],y;i;i=e[i].pre) if(!vis[y=e[i].to])
        getdz(y,x,x,2,cnt),dpt[x]=max(dpt[x],dpt[y]+1),cnt++;
    memset(ds,0,sizeof(int)*(dpt[x]+1));
    rep(i,1,dfc) ds[zid[x][tms[i]].sec]+=val[tms[i]];
    ds[1]+=val[x],build(b[x],sr[x]=dpt[x]);
    bv[x]=new int*[cnt],srv[x]=new int[cnt],cnt=0;
    for(int i=h[x],y;i;i=e[i].pre) if(!vis[y=e[i].to])
    {
        memset(ds,0,sizeof(int)*(dpt[y]+2));
        rep(j,in[y],out[y]) ds[zid[x][tms[j]].sec]+=val[tms[j]];
        build(bv[x][cnt],srv[x][cnt]=dpt[y]+1),cnt++;
    }
    for(int i=h[x],y;i;i=e[i].pre) if(!vis[y=e[i].to]) solve(y,x);
    return 0;
}
inline int update(int x,int v)
{
    val[x]+=v,update(b[x],1,sr[x],v);
    for(int y=fa[x],z,d;y;y=fa[y])
        z=zid[y][x].fir,d=zid[y][x].sec,
        update(b[y],d,sr[y],v),
        update(bv[y][z],d,srv[y][z],v);
    return 0;
}
inline int query(int x,int k)
{
    int ans=query(b[x],min(sr[x],k+1));
    for(int y=fa[x],z,d;y;y=fa[y])
    {
        z=zid[y][x].fir,d=zid[y][x].sec;
        if(k+1>=d) ans+=query(b[y],min(sr[y],k-d+2))-query(bv[y][z],min(srv[y][z],k-d+2));
    }
    return ans;
}
char ss[N*14],tt[20];int ssl,ttl;
inline int show(int x)
{
    if(!x) ss[++ssl]='0';for(ttl=0;x;x/=10) tt[++ttl]=char(x%10+'0');
    for(;ttl;ttl--) ss[++ssl]=tt[ttl];return ss[++ssl]='\n';
}
int main()
{
    int n=inn(),m=inn(),x,y;rep(i,1,n) val[i]=inn();
    rep(i,1,n-1) x=inn(),y=inn(),add_edge(x,y),add_edge(y,x);
    solve(1,0);
    for(int i=1,las=0;i<=m;i++)
    {
        int tp=inn(),x=inn()^las,y=inn()^las;
        if(!tp) show(las=query(x,y));
        else update(x,y-val[x]);
    }
    return fwrite(ss+1,sizeof(char),ssl,stdout),0;
}
内容概要:本文详细介绍了如何使用Matlab对地表水源热泵系统进行建模,并采用粒子群算法来优化每小时的制冷量和制热量。首先,文章解释了地表水源热泵的工作原理及其重要性,随后展示了如何设定基本参数并构建热泵机组的基础模型。接着,文章深入探讨了粒子群算法的具体实现步骤,包括参数设置、粒子初始化、适应度评估以及粒子位置和速度的更新规则。为了确保优化的有效性和实用性,文中还讨论了如何处理实际应用中的约束条件,如设备的最大能力和制冷/制热模式之间的互斥关系。此外,作者分享了一些实用技巧,例如引入混合优化方法以加快收敛速度,以及在目标函数中加入额外的惩罚项来减少不必要的模式切换。最终,通过对优化结果的可视化分析,验证了所提出的方法能够显著降低能耗并提高系统的运行效率。 适用人群:从事暖通空调系统设计、优化及相关领域的工程师和技术人员,尤其是那些希望深入了解地表水源热泵系统特性和优化方法的专业人士。 使用场景及目标:适用于需要对地表水源热泵系统进行精确建模和优化的情景,旨在找到既满足建筑负荷需求又能使机组运行在最高效率点的制冷/制热量组合。主要目标是在保证室内舒适度的前提下,最大限度地节约能源并延长设备使用寿命。 其他说明:文中提供的Matlab代码片段可以帮助读者更好地理解和复现整个建模和优化过程。同时,作者强调了在实际工程项目中灵活调整相关参数的重要性,以便获得更好的优化效果。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值