noip2018 d2t3 保卫王国 解题报告

保卫王国

电脑卡懒得把题面挪过来了。


朴素
\[ dp_{i,0}=\sum dp_{s,1}\\ dp_{i,1}=\sum \min(dp_{s,0},dp_{s,1})+p_i \]
然后直接动态dp就行了

我发现lct是最好写的,反正比树剖好写,还比她快

没倍增快,但是看起来倍增挺难写的...


Code:

#include <cstdio>
#include <algorithm>
#define ll long long
const ll inf=1ll<<45;
const int N=1e5+10;
int ch[N][2],par[N];
struct matrix{ll a,b,c,d;}dat[N],sum[N],ret;
int head[N],to[N<<1],Next[N<<1],cnt;
ll dp[N][2],p[N];
int n,m;char str[233];
using std::min;
void add(int u,int v)
{
    to[++cnt]=v,Next[cnt]=head[u],head[u]=cnt;
}
void dfs(int now)
{
    dp[now][1]=p[now];
    for(int v,i=head[now];i;i=Next[i])
        if((v=to[i])!=par[now])
        {
            par[v]=now,dfs(v);
            dp[now][0]+=dp[v][1];
            dp[now][1]+=min(dp[v][0],dp[v][1]);
        }
    dat[now]=sum[now]=(matrix){inf,dp[now][0],dp[now][1],dp[now][1]};
}
matrix operator ^(matrix a,matrix b)
{
    ret.a=min(a.a+b.a,a.b+b.c);
    ret.b=min(a.a+b.b,a.b+b.d);
    ret.c=min(a.c+b.a,a.d+b.c);
    ret.d=min(a.c+b.b,a.d+b.d);
    return ret;
}
#define ls ch[now][0]
#define rs ch[now][1]
#define fa par[now]
void updata(int now)
{
    sum[now]=ls?sum[ls]^dat[now]:dat[now];
    sum[now]=rs?sum[now]^sum[rs]:sum[now];
}
bool isroot(int now){return ch[fa][0]==now||ch[fa][1]==now;}
int identity(int now){return ch[fa][1]==now;}
void connect(int f,int now,int typ){ch[fa=f][typ]=now;}
void Rotate(int now)
{
    int p=fa,typ=identity(now);
    connect(p,ch[now][typ^1],typ);
    if(isroot(p)) connect(par[p],now,identity(p));
    else fa=par[p];
    connect(now,p,typ^1);
    updata(p),updata(now);
}
void splay(int now)
{
    for(;isroot(now);Rotate(now))
        if(isroot(fa))
            Rotate(identity(now)^identity(fa)?now:fa);
}
void access(int now)
{
    for(int las=0;now;las=now,now=fa)
    {
        splay(now);
        if(las)
        {
            dat[now].b-=sum[las].d;
            dat[now].c-=min(sum[las].b,sum[las].d);
        }
        if(rs)
        {
            dat[now].b+=sum[rs].d;
            dat[now].c+=min(sum[rs].b,sum[rs].d);
        }
        dat[now].d=dat[now].c;
        rs=las;
        updata(now);
    }
}
void modify(int now,ll w)
{
    access(now),splay(now);
    dat[now].c+=w-p[now],p[now]=w;
    dat[now].d=dat[now].c;
    updata(now);
}
int main()
{
    scanf("%d%d%s",&n,&m,str);
    for(int i=1;i<=n;i++) scanf("%lld",p+i);
    for(int u,v,i=1;i<n;i++) scanf("%d%d",&u,&v),add(u,v),add(v,u);
    dfs(1);
    for(int a,x,b,y,i=1;i<=m;i++)
    {
        scanf("%d%d%d%d",&a,&x,&b,&y);
        ll ans=0,t1=p[a],t2=p[b];
        if(x&&y)
        {
            modify(a,-inf),modify(b,-inf);
            ans=(inf<<1)+t1+t2;
        }
        else if(x&&!y)
        {
            modify(a,-inf),modify(b,inf<<1);
            ans=inf+t1;
        }
        else if(!x&&y)
        {
            modify(a,inf<<1),modify(b,-inf);
            ans=inf+t2;
        }
        else
            modify(a,inf<<1),modify(b,inf<<1);
        ans+=min(sum[b].b,sum[b].d);
        if(ans>=inf) puts("-1");
        else printf("%lld\n",ans);
        modify(a,t1),modify(b,t2);
    }
    return 0;
}

2019.1.4

转载于:https://www.cnblogs.com/butterflydew/p/10218577.html

内容概要:该研究通过在黑龙江省某示范村进行24小时实地测试,比较了燃煤炉具与自动/手动进料生物质炉具的污染物排放特征。结果显示,生物质炉具相比燃煤炉具显著降低了PM2.5、CO和SO2的排放(自动进料分别降低41.2%、54.3%、40.0%;手动进料降低35.3%、22.1%、20.0%),但NOx排放未降低甚至有所增加。研究还发现,经济性和便利性是影响生物质炉具推广的重要因素。该研究不仅提供了实际排放数据支持,还通过Python代码详细复现了排放特征比较、减排效果计算和结果可视化,进一步探讨了燃料性质、动态排放特征、碳平衡计算以及政策建议。 适合人群:从事环境科学研究的学者、政府环保部门工作人员、能源政策制定者、关注农村能源转型的社会人士。 使用场景及目标:①评估生物质炉具在农村地区的推广潜力;②为政策制定者提供科学依据,优化补贴政策;③帮助研究人员深入了解生物质炉具的排放特征和技术改进方向;④为企业研发更高效的生物质炉具提供参考。 其他说明:该研究通过大量数据分析和模拟,揭示了生物质炉具在实际应用中的优点和挑战,特别是NOx排放增加的问题。研究还提出了多项具体的技术改进方向和政策建议,如优化进料方式、提高热效率、建设本地颗粒厂等,为生物质炉具的广泛推广提供了可行路径。此外,研究还开发了一个智能政策建议生成系统,可以根据不同地区的特征定制化生成政策建议,为农村能源转型提供了有力支持。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值