首页 > 其他分享 >NOIP2023-div2模拟赛20 D. 数星星

NOIP2023-div2模拟赛20 D. 数星星

时间:2023-10-17 13:23:11浏览次数:30  
标签:20 int 数星星 dfn que Query NOIP2023 id define

妙妙 + 经典题。

难度:Hard

题意

给定一棵 \(n\) 个结点的树,点有点权。树上有一些简单路径,编号分别为 \(1,2,\cdots,m\)。有 \(q\) 次询问,每次询问查询编号在 \([l,r]\) 中的路径的并的点权和。

题解

考虑一个经典题:定一个数列,每次询问一个区间不同元素的和。

这个问题是简单的,你只需要把询问离线下来,按右端点排序,每次拿树状数组维护最后面一个相同的元素即可(显然这是正确的)。

考虑树上问题怎么做,假设树的高度随机,则每个路径对应的不是一个点了,而是大约 \(\log\) 个点,但是操作还是一样的。

然后如果树的高度不随机,则考虑树剖。树剖出来的就是一个一个的 \(\texttt{dfn}\) 区间,则每个路径对应的就是不超过 \(\log\) 个区间。

那么考虑用 set 维护区间,然后每次加入新的区间就更新原来的区间。例如原有区间 \([3,6]\),新加入区间 \([5,8]\),则把 \([3,6]\) 变成 \([3,4]\),同样树状数组维护,需要预处理一下前缀和。

时间复杂度好像是 \(\mathcal{O}(n\log^2n)\) 的,不过不太会证/ll,有没有会证的老哥私信一下/hanx。

好像还有一个分治做法,暂时还不会/dk。

代码

#include <bits/stdc++.h>
#define rep(i, j, k) for(int i = (j); i <= (k); i++)
#define per(i, j, k) for(int i = (j); i >= (k); i--)
#define ll long long
#define vi vector<int>
#define sz(a) ((int)(a.size()))
#define mset(f, x) memset(f, x, sizeof(f))
#define ALL(x) (x).begin(), (x).end()
#define rALL(x) (x).rbegin(), (x).rend()
#define uni(x) x.resize(unique(ALL(x)) - x.begin())
#define ull unsigned long long
using namespace std;
const int N = 1e5 + 10, M = 2e5 + 10;
int n, m, q;
ll a[N], sum[N], ans[N];
int head[N], nxt[M], to[M], cnt = 1;
int fa[N], dep[N], siz[N], son[N];
int dfn[N], top[N], tim = 0;
struct Path {int u, v;} paths[N];
struct Query {int l, r, id; bool operator < (const Query &p) const {return l < p.l;}} que[N];
void addEdge(int u, int v) {nxt[++cnt] = head[u], head[u] = cnt, to[cnt] = v;}
void dfs(int u, int p) {
    dep[u] = dep[p] + 1; fa[u] = p;
    siz[u] = 1; son[u] = -1;
    for(int i = head[u]; i; i = nxt[i]) {
        int v = to[i]; if(v == p) continue;
        dfs(v, u); siz[u] += siz[v];
        if(son[u] == -1 || siz[v] > siz[son[u]]) son[u] = v;
    }
}
void redfs(int u, int t) {
    dfn[u] = ++tim;
    sum[tim] = sum[tim - 1] + a[u];
    top[u] = t;
    if(~son[u]) redfs(son[u], t);
    for(int i = head[u]; i; i = nxt[i]) {
        int v = to[i]; if(v == fa[u] || v == son[u]) continue;
        redfs(v, v);
    }
}
namespace FenwickTree {
    ll tree[N];
    void init() {memset(tree, 0, sizeof(tree));}
    void update(int x, ll v) {
        while(x > 0) {tree[x] += v; x -= x & -x;}
    }
    ll query(int x) {
        ll res = 0;
        while(x <= m) {res += tree[x]; x += x & -x;}
        return res;
    }
};
set<Query> S;
void update_segment(int l, int r, int id) {
    set<Query>::iterator it;
    while((it = S.upper_bound((Query){r, 0, 0})) != S.begin()) {
        if((--it) -> r < l) break;
        Query v = *it; S.erase(it);
        FenwickTree::update(v.id, sum[max(l, v.l) - 1] - sum[min(r, v.r)]);
        if(v.l < l) S.insert((Query){v.l, l - 1, v.id});
        if(v.r > r) S.insert((Query){r + 1, v.r, v.id});
    }
    FenwickTree::update(id, sum[r] - sum[l - 1]);
    S.insert((Query){l, r, id});
}
void update_chain(int u, int v, int id) {
    while(top[u] != top[v]) {
        if(dfn[top[u]] < dfn[top[v]]) swap(u, v);
        update_segment(dfn[top[u]], dfn[u], id);
        u = fa[top[u]];
    }
    if(dfn[u] > dfn[v]) swap(u, v);
    update_segment(dfn[u], dfn[v], id);
}
int main() {
    freopen("star.in", "r", stdin); freopen("star.out", "w", stdout);
	ios::sync_with_stdio(false), cin.tie(0), cout.tie(0);
    cin >> n >> m >> q;
    rep(i, 1, n) cin >> a[i];
    rep(i, 1, n - 1) {
        int u, v; cin >> u >> v;
        addEdge(u, v); addEdge(v, u);
    } dfs(1, 0); redfs(1, 1);
    rep(i, 1, m) cin >> paths[i].u >> paths[i].v;
    rep(i, 1, q) {
        cin >> que[i].l >> que[i].r; que[i].id = i;
    } sort(que + 1, que + q + 1, [](Query x, Query y) {return x.r < y.r;});
    FenwickTree::init();
    rep(i, 1, q) {
        rep(j, que[i - 1].r + 1, que[i].r) update_chain(paths[j].u, paths[j].v, j);
        ans[que[i].id] = FenwickTree::query(que[i].l);
    }
    rep(i, 1, q) cout << ans[i] << '\n';
	return 0;
}

标签:20,int,数星星,dfn,que,Query,NOIP2023,id,define
From: https://www.cnblogs.com/Jerry-Jiang/p/17768587.html

相关文章

  • 2023香山杯nesting详解
    nesting通过函数分析,有一个VM的指令解析器,也看不懂,VM的题看起来特别费劲在sub_16BC里面找cmp的flag比对指令,0x1E21和0x1EC9。最终发现输入正确的字符和错误的字符,0x1E21处的指令执行次数不一样,可以通过输入fo,fl,fi,其中fl是正确的字符,发现正确的字符在0x1E21处执行的次数更多,因......
  • MBR20100CT-ASEMI肖特基MBR20100CT参数、规格、尺寸
    编辑:llMBR20100CT-ASEMI肖特基MBR20100CT参数、规格、尺寸型号:MBR20100CT品牌:ASEMI芯片个数:2封装:TO-220恢复时间:>50ns工作温度:-65°C~175°C浪涌电流:150A正向电流:10A反向耐压:100V正向压降:0.8V引脚数量:3MBR20100CT特性:ASEMI品牌MBR20100CT是采用工艺芯片,该芯片具有良好的稳定性及抗冲......
  • 博睿数据获评2023中国智能运维领域“最具商业合作价值企业”
    博睿数据成功入选由数据猿携手上海大数据联盟共同推出的《2023中国智能运维领域最具商业合作价值企业盘点》。作为中国IT运维监控及可观测性领域的领导者,博睿数据凭借前瞻的产品技术布局、市场影响力以及领先的智能运维技术,获得了评审的一致认可,成功获评“最具商业合作价值企业”。......
  • JIRA 在 2024 年完全停止服务器版本支持
    在服务器上的开源许可证版本已经要过期了,想去更新下。发现,JIRA的所有服务器版本的支持马上就要结束了。  这就意味着,如果你部署的服务器版本的JIRA的话,你将没有办法对服务器进行更新。  貌似,必须使用JIRA提供的云服务版本,这对有数据安全需求,并且希望在本地服务器上部署的......
  • JIRA 在 2024 年完全停止服务器版本支持
    在服务器上的开源许可证版本已经要过期了,想去更新下。发现,JIRA的所有服务器版本的支持马上就要结束了。  这就意味着,如果你部署的服务器版本的JIRA的话,你将没有办法对服务器进行更新。  貌似,必须使用JIRA提供的云服务版本,这对有数据安全需求,并且希望在本地服务......
  • Qt ObjectARX 2022
    QT中的ARX配置LoadQtDlls.pro1TARGET=QTARXLoadQtDlls2#thesdkincludepath3INCLUDEPATH+="D:\ObjectARX2022\inc"4INCLUDEPATH+="D:\ObjectARX2022\inc-x64"56#rxapi.lib;acdb21.lib;acge21.lib;acad.lib;ac1st21.li......
  • MBR20100CT-ASEMI肖特基MBR20100CT参数、规格、尺寸
    编辑:llMBR20100CT-ASEMI肖特基MBR20100CT参数、规格、尺寸型号:MBR20100CT品牌:ASEMI芯片个数:2封装:TO-220恢复时间:>50ns工作温度:-65°C~175°C浪涌电流:150A正向电流:10A反向耐压:100V正向压降:0.8V引脚数量:3MBR20100CT特性:ASEMI品牌MBR20100CT是采用工艺芯片,该芯片具有良......
  • C2000 系列DSP使用Syscfg配置CLB模块记录
    1.1、SysConfig配置1、在工程下新建一个syscfg文件。注意文件的后缀名是.syscfg,命名任意。这时候会弹出一个弹窗,点击yes将SysConfig添加到该工程的toolchain。2、可以看到工程下多了一个GeneratedSource,并且打开工程属性,Build下也新加了SysConfig......
  • PRCV 2023:语言模型与视觉生态如何协同?合合信息瞄准“多模态”技术
    PRCV2023:语言模型与视觉生态如何协同?合合信息瞄准“多模态”技术近期,2023年中国模式识别与计算机视觉大会(PRCV)在厦门成功举行。大会由中国计算机学会(CCF)、中国自动化学会(CAA)、中国图象图形学学会(CSIG)和中国人工智能学会(CAAI)联合主办,多媒体可信感知与高效计算教育部重点实验室、......
  • VS2019连接MySql使用实体数据模型(EF实体映射)【解决创建闪退问题】
    一、确定MySQLConnectorNet版本如果没有请下载下载驱动:mysql-connector-odbc-8.0.20-winx64.msimysqlodbc驱动mysql-for-visualstudio-1.2.9.msiVisualStudio连接MySQL工具mysql-connector-net-8.0.20.msimysql数据库.net开发驱动驱动介绍1.MySQLConnector/ODBC ......