[POI2007]MEG-Megalopolis 树状数组 + dfs序前缀和 好题

本文介绍了一种使用区间树进行二分图匹配的方法,通过构建特定的图结构和区间树,实现了对节点间匹配状态的有效管理和快速查询。文章详细解释了区间树的构建、更新和查询操作,并通过一个具体的算法实现展示了如何在二分图中进行匹配过程的高效处理。

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

#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int N=250000+6;
int C[N<<1],head[N<<1],to[N<<1],nex[N<<1],idx[N],cnt,idx2[N];
int nums=0;
void add_edge(int u,int v){
    nex[++cnt]=head[u],head[u]=cnt,to[cnt]=v;
}
int lowbit(int t){
    return t&(-t);
}
void update(int t,int delta){
    while(t<(N<<1))C[t]+=delta,t+=lowbit(t);
}
int query(int t){
    int tmp=0;
    while(t>0)tmp+=C[t],t-=lowbit(t);
    return tmp;
}
void dfs(int u,int fa)
{
    ++nums;
    if(u!=1)update(nums,1);
    idx[u]=nums;
    for(int v=head[u];v;v=nex[v])
        if(to[v]!=fa)dfs(to[v],u);
    ++nums;
    if(u!=1)update(nums,-1);
    idx2[u]=nums;
}
int main()
{
   // freopen("in.txt","r",stdin);
    int n,m;
    scanf("%d",&n);
    for(int i=1;i<n;++i){
        int a,b;
        scanf("%d%d",&a,&b);
        add_edge(a,b);
        add_edge(b,a);
    }
    dfs(1,-1);
    scanf("%d",&m);
    for(int i=1;i<=m+n-1;++i)
    {
        char s[4];
        scanf("%s",s);
        if(s[0]=='W')
        {
            int a;
            scanf("%d",&a);
            printf("%d\n",query(idx[a]));
        }
        else if(s[0]=='A')
        {
            int a,b;
            scanf("%d%d",&a,&b);
            int cur=max(idx[a],idx[b]);
            int cur2=min(idx2[a],idx2[b]);
            update(cur,-1);
            update(cur2+1,1);
        }
    }
    return 0;
}
### 如何使用 poi-tl 输出数组数据 在 `poi-tl` 中,可以通过 Spring Expression Language (SpEL) 来处理复杂的数据结构,比如数组或列表。以下是具体的实现方式以及代码示例。 #### 使用 SpEL 处理数组数据 当需要输出数组中的元素时,可以利用 SpEL 的语法来遍历并渲染数组中的每一项。例如,在模板中定义占位符 `${dogs}` 或者通过循环标签 `<#list>` 配合表达式完成操作[^2]。 以下是一个完整的例子: ```java import cn.afterturn.easypoi.word.WordExportUtil; import org.apache.poi.xwpf.usermodel.XWPFDocument; import java.io.FileOutputStream; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; public class PoiTlArrayExample { public static void main(String[] args) throws Exception { // 创建一个包含数组数据的地图对象 Map<String, Object> dataMap = new HashMap<>(); List<Map<String, String>> dogsList = new ArrayList<>(); for (int i = 0; i < 3; i++) { Map<String, String> dog = new HashMap<>(); dog.put("name", "Dog-" + i); dog.put("age", String.valueOf(i * 2)); dogsList.add(dog); } dataMap.put("dogs", dogsList); // 加载模板文件并填充数据 XWPFDocument document = WordExportUtil.exportWord("template.docx", dataMap); // 将生成的文档保存到指定路径 try (FileOutputStream fos = new FileOutputStream("output.docx")) { document.write(fos); } System.out.println("文档已成功生成!"); } } ``` 在这个示例中: - 数据模型被封装成一个 `List<Map<String, String>>` 结构,其中每个子地图表示一条记录。 - 模板文件 (`template.docx`) 应该预先设计好,并且包含类似于 `${dogs.name}` 这样的占位符用于动态替换[^1]。 #### 关键点解析 1. **数据准备** 数组或者列表形式的数据通常会被映射为 Java 的集合类型(如 `ArrayList`)。每条记录可以用简单的 POJO 对象或者是哈希表存储属性值对。 2. **模板配置** 在 `.docx` 文件中设置对应的占位符名称以便匹配传入的数据源字段名。如果要显示整个数组的内容,则可以在模板里嵌套表格或其他布局控件辅助呈现效果[^2]。 3. **渲染逻辑** 调用 `XWPFTemplate.compile()` 方法加载预设好的 DOCX 文档作为基础框架;随后调用其 `render(Map)` 函数注入实际参数集即可自动完成内容组装过程[^1]。 --- #### 注意事项 - 如果目标是逐行打印出数组里的每一个成员而非一次性全部展示出来的话,那么可能还需要额外引入 FreeMarker 等更高级别的模版引擎支持更为灵活复杂的场景需求。 - 当前版本仅适用于简单线性排列情况下的批量替换单元格文本动作,对于更加精细定制化的样式调整或许还得依赖其他插件扩展功能才行。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值