1227: [SDOI2009]虔诚的墓主人 树状数组+离散化

本文介绍了一种解决特定组合计数问题的方法,通过使用树状数组维护贡献值,并结合离散化处理来简化计算过程。适用于解决常青树与墓地间的组合问题。

如果对于一个点,四个方向分别有u,d,l,r棵常青树,那么这棵树对答案的贡献ans[i]=C(u,k) * C(d,k) + C(l,k) * C(r,k)。
我们可以发现在两棵常青树之间的墓地,它们的C(l,k) * C(r,k)都是一样的,我们只需要求出C(l,k) * C(r,k) * sigma(C(u,k) * C(d,k)),求和想到树状数组来维护。
我们用树状数组来维护当前这一行的C(u,k) * C(d,k),在逐渐向上移动时,我们更新树状数组中的这一个值。从下往上逐渐扫就可以了。
坐标需要离散化以下。

#include<bits/stdc++.h>
#define lowbit(i) (i&(-i))
#define ll long long 
#define M 2147483648LL
using namespace std;
int n,m,w,k,nowl;
ll c[100005][11],tree[200005];
ll ans;
int sumx[200005],sumy[200005],now[200005],hash[200005];
struct node {int x,y;} a[100005];
inline int read()
{
    int a=0,f=1; char c=getchar();
    while (c<'0'||c>'9') {if (c=='-') f=-1; c=getchar();}
    while (c>='0'&&c<='9') {a=a*10+c-'0'; c=getchar();}
    return a*f;
}
inline int find(int x)
{
    int l=1,r=2*w;
    while (l<=r)
    {
        int mid=l+r>>1;
        if (hash[mid]>x) r=mid-1;
        else if (hash[mid]<x) l=mid+1;
        else return mid;
    }
}
inline void pre_C()
{
    c[0][0]=1;
    for (int i=1;i<=w;i++)
    {
        c[i][0]=1;  
        for (int j=1;j<=min(i,k);j++)
            c[i][j]=(c[i-1][j]+c[i-1][j-1])%M;
    }
}
inline void add(int x,int val)
{
    for (int i=x;i<=2*w;i+=lowbit(i))
        tree[i]=(tree[i]+val)%M;
}
inline ll ask(int x)
{
    ll tmp=0;
    for (int i=x;i;i-=lowbit(i)) tmp=(tmp+tree[i])%M;
    return tmp;
}
inline bool cmp(node a,node b)
{
    return a.y==b.y?a.x<b.x:a.y<b.y;
}
int main()
{   
    n=read(); m=read(); w=read();
    for (int i=1;i<=w;i++)
        hash[2*i-1]=a[i].x=read(),hash[2*i]=a[i].y=read();
    k=read();
    pre_C();
    sort(hash+1,hash+2*w+1);
    for (int i=1;i<=w;i++)
        sumx[find(a[i].x)]++,sumy[find(a[i].y)]++;
    sort(a+1,a+w+1,cmp);
    a[0].y=-1; 
    for (int i=1;i<=w;i++)
    {
        if (a[i].y==a[i-1].y)
        {
            nowl++;
            int t1=find(a[i].x),t2=find(a[i-1].x);
            ll tmp=ask(t1-1)-ask(t2);
            ans=(ans+tmp*c[nowl][k]*c[sumy[find(a[i].y)]-nowl][k])%M;
        }
        else nowl=0;
        int d=find(a[i].x); now[d]++;
        add(d,(c[now[d]][k]*c[sumx[d]-now[d]][k]-c[now[d]-1][k]*c[sumx[d]-now[d]+1][k])%M);
    }
    if (ans<0) ans+=M;
    cout << ans;
    return 0;
}
AI 代码审查Review工具 是一个旨在自动化代码审查流程的工具。它通过集成版本控制系统(如 GitHub 和 GitLab)的 Webhook,利用大型语言模型(LLM)对代码变更进行分析,并将审查意见反馈到相应的 Pull Request 或 Merge Request 中。此外,它还支持将审查结果通知到企业微信等通讯工具。 一个基于 LLM 的自动化代码审查助手。通过 GitHub/GitLab Webhook 监听 PR/MR 变更,调用 AI 分析代码,并将审查意见自动评论到 PR/MR,同时支持多种通知渠道。 主要功能 多平台支持: 集成 GitHub 和 GitLab Webhook,监听 Pull Request / Merge Request 事件。 智能审查模式: 详细审查 (/github_webhook, /gitlab_webhook): AI 对每个变更文件进行分析,旨在找出具体问题。审查意见会以结构化的形式(例如,定位到特定代码行、问题分类、严重程度、分析和建议)逐条评论到 PR/MR。AI 模型会输出 JSON 格式的分析结果,系统再将其转换为多条独立的评论。 通用审查 (/github_webhook_general, /gitlab_webhook_general): AI 对每个变更文件进行整体性分析,并为每个文件生成一个 Markdown 格式的总结性评论。 自动化流程: 自动将 AI 审查意见(详细模式下为多条,通用模式下为每个文件一条)发布到 PR/MR。 在所有文件审查完毕后,自动在 PR/MR 中发布一条总结性评论。 即便 AI 未发现任何值得报告的问题,也会发布相应的友好提示和总结评论。 异步处理审查任务,快速响应 Webhook。 通过 Redis 防止对同一 Commit 的重复审查。 灵活配置: 通过环境变量设置基
【直流微电网】径向直流微电网的状态空间建模与线性化:一种耦合DC-DC变换器状态空间平均模型的方法 (Matlab代码实现)内容概要:本文介绍了径向直流微电网的状态空间建模与线性化方法,重点提出了一种基于耦合DC-DC变换器的状态空间平均模型的建模策略。该方法通过数学建模手段对直流微电网系统进行精确的状态空间描述,并对其进行线性化处理,以便于系统稳定性分析与控制器设计。文中结合Matlab代码实现,展示了建模与仿真过程,有助于研究人员理解和复现相关技术,推动直流微电网系统的动态性能研究与工程应用。; 适合人群:具备电力电子、电力系统或自动化等相关背景,熟悉Matlab/Simulink仿真工具,从事新能源、微电网或智能电网研究的研究生、科研人员及工程技术人员。; 使用场景及目标:①掌握直流微电网的动态建模方法;②学习DC-DC变换器在耦合条件下的状态空间平均建模技巧;③实现系统的线性化分析并支持后续控制器设计(如电压稳定控制、功率分配等);④为科研论文撰写、项目仿真验证提供技术支持与代码参考。; 阅读建议:建议读者结合Matlab代码逐步实践建模流程,重点关注状态变量选取、平均化处理和线性化推导过程,同时可扩展应用于更复杂的直流微电网拓扑结构中,提升系统分析与设计能力。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值