首页 > 其他分享 >2024 Summer_Camp 做题总结 下

2024 Summer_Camp 做题总结 下

时间:2024-08-20 16:09:29浏览次数:11  
标签:rt Summer stk1 int Camp modify ++ 2024 read

Close Vertices

思路

很明显,这是一道点分治题目,但有两个限制条件,考虑将两个条件排序起来,双指针找第一个条件,树状数组维护第二个条件,但是同一个子树内不能重复统计,所以将答案减去每个子树内的答案。

代码

#include<iostream>
#include<algorithm>
#define int long long

using namespace std;

inline int read(){register int x = 0, f = 1;register char c = getchar();while (c < '0' || c > '9'){if (c == '-') f = -1;c = getchar();}while (c >= '0' && c <= '9'){x = (x << 1) + (x << 3) + (c ^ 48);c = getchar();}return x * f;}
inline void write(int x){if (x < 0) putchar('-'), x = -x;if (x > 9) write(x / 10);putchar(x % 10 + '0');}

const int N = 4e5 + 10;
int n, k, d, maxn, rt, ans;
int t[N];
int lowbit(int x){return x & (-x);}
void modify(int x, int y){
    for (int i = max(x, 1ll); i <= 1e5 + 1; i += lowbit(i)) t[i] += y;
}
int query(int x){
    int res = 0;
    for (int i = max(x, 1ll); i; i -= lowbit(i)) res += t[i];
    return res;
}
struct edge{
    int v, w, nxt;
}e[N << 1];
int head[N], cnt;
void add(int u, int v, int w){
    e[++cnt] = (edge){v, w, head[u]};
    head[u] = cnt;
}
struct node{
    int dis, l;
    bool operator < (const node &b) const{
        if (dis != b.dis) return dis < b.dis;
        return l < b.l;
    }
}stk1[N], stk2[N];
int mx[N], sz[N], top1, top2, dis[N], l[N];
bool vis[N];
void find(int u, int fa){
    sz[u] = 1, mx[u] = 0;
    for (int i = head[u]; i; i = e[i].nxt){
        int v = e[i].v;
        if (v == fa || vis[v]) continue;
        find(v, u);
        sz[u] += sz[v];
        mx[u] = max(mx[u], sz[v]);
    }
    mx[u] = max(mx[u], maxn - sz[u]);
    if (mx[u] < mx[rt]) rt = u;
}
void dfs(int u, int fa){
    stk2[++top2] = (node){dis[u], l[u]};
    for (int i = head[u]; i; i = e[i].nxt){
        int v = e[i].v;
        if (v == fa || vis[v]) continue;
        dis[v] = dis[u] + e[i].w;
        l[v] = l[u] + 1;
        dfs(v, u);
    }
}
void calc(int u){
    top1 = 0;
    for (int i = head[u]; i; i = e[i].nxt){
        int v = e[i].v;
        if (vis[v]) continue;
        top2 = 0, dis[v] = e[i].w, l[v] = 1;
        dfs(v, u);
        sort(stk2 + 1, stk2 + top2 + 1);
        for (int j = 1; j <= top2; j++) stk1[++top1] = stk2[j], modify(stk2[j].l + 1, 1);
        int l = 1, r = top2;
        while (l <= top2){
            modify(stk2[l].l + 1, -1);
            while (l < r && stk2[l].dis + stk2[r].dis > d) modify(stk2[r--].l + 1, -1);
            if (l >= r) break;
            ans -= query(k - stk2[l].l + 1);
            l++;
        }
    }
    stk1[++top1] = (node){0, 0};
    sort(stk1 + 1, stk1 + top1 + 1);
    for (int i = 1; i <= top1; i++) modify(stk1[i].l + 1, 1);
    int l = 1, r = top1;
    while (l <= top1){
        modify(stk1[l].l + 1, -1);
        while (l < r && stk1[l].dis + stk1[r].dis > d) modify(stk1[r--].l + 1, -1);
        if (l >= r) break;
        ans += query(k - stk1[l].l + 1);
        l++;
    }
}
void solve(int u){
    vis[u] = 1;
    calc(u);
    for (int i = head[u]; i; i = e[i].nxt){
        int v = e[i].v;
        if (vis[v]) continue;
        maxn = sz[v];
        rt = 0;
        find(v, 0);
        solve(rt);
    }
}

signed main(){
    n = read(), k = read(), d = read();
    for (int i = 1; i < n; i++){
        int v = read(), w = read();
        add(i + 1, v, w), add(v, i + 1, w);
    }
    maxn = mx[rt] = n;
    find(1, 0);
    solve(rt);
    cout << ans;
    return 0;
}

Luogu 的 CF Remotejudge 没修好,气死我也。

标签:rt,Summer,stk1,int,Camp,modify,++,2024,read
From: https://www.cnblogs.com/bryceyyds/p/18369580

相关文章

  • 2024年华为OD目录,D卷&C卷,E卷即将更新!
    序言  本专栏收录的华为OD题目都会持续优化并且持续更新最新题目,一次购买,终生享受。2024年,华为OD机试已经启用了D卷,目前D卷和C卷的题目是一样的。我身边有很多同学通过本专栏已经成功上岸华为的OD员工,有同学成功转正为华为正式员工。根据内部消息,华为OD今年可能会使用E......
  • 【开源分享】2024好用的PHP在线客服系统源码 带搭建教程
    安装教程1.上传源码压缩包到网站目录并解压2.设置网站运行目录public3.设置伪静态,选择thinkphp4.创建数据库,导入数据库:public/service.sql5.修改.env里的数据库配置信息6.启动命令(根目录终端) phpthinkworker:gateway-d更详细的搭建文档需下载压缩包,安装教程.docx......
  • 【开源分享】2024好用的PHP工单管理系统 带搭建教程
    在日益复杂的企业运营环境中,工单管理成为企业提升运维效率、优化服务质量的关键环节。工单管理系统源码以其高效、稳定、灵活的特点,为企业提供了强大的工单管理解决方案。未来,我们将继续优化系统功能,提升用户体验,为企业创造更大的价值。同时,我们也期待更多企业加入我们的行列,共......
  • 《2024智慧超矫技术白皮书》
    在全球制造业转型升级的大潮中,金属板材矫平行业正在经历一场深刻的技术变革。作为这一领域的领军企业,玛哈特集团发布了《2024智慧超矫技术白皮书》,深入剖析当前行业所面临的挑战与机遇,展示智慧超矫技术在提升生产效率、降低成本和优化产品质量方面的巨大潜力。01行业变迁中的......
  • 玛哈特发布《2024智慧超矫技术白皮书》 引领金属板材矫平行业的智能化变革
    随着全球制造业对高精度和高效率的需求日益增长,金属板材矫平技术正经历着一场前所未有的变革。玛哈特集团顺应这一趋势,隆重发布了《2024智慧超矫技术白皮书》。该白皮书深入探讨了智慧超矫技术在金属板材矫平中的应用,展示了该技术如何为企业提供更高效、更精确的解决方案,从而帮......
  • 免费【2024】基于SpringBoot 的干洗店预约洗衣系统设计与实现
    博主介绍:✌CSDN新星计划导师、Java领域优质创作者、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和学生毕业项目实战,高校老师/讲师/同行前辈交流✌技术范围:SpringBoot、Vue、SSM、HTML、Jsp、PHP、Nodejs、Python、爬虫、数据可视化、小程序、安卓app、大数......
  • 免费【2024】基于springboot 闲置物品共享平台的设计与实现
    博主介绍:✌CSDN新星计划导师、Java领域优质创作者、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和学生毕业项目实战,高校老师/讲师/同行前辈交流✌技术范围:SpringBoot、Vue、SSM、HTML、Jsp、PHP、Nodejs、Python、爬虫、数据可视化、小程序、安卓app、大数......
  • 20240820:组合计数(2)
    二项式反演引入错排问题:\(n\)个人排列。第\(i\)个人不能在位置\(i\),求合法排列数。钦定\(k\)个人在自己位置上:\[\sum_{k=0}^n(-1)^k\begin{pmatrix}n\\k\end{pmatrix}(n-k)!\]定义\(f(n)\)为\(n\)个人的排列数,\(g(n)\)为\(n\)个人的错排数。\[\begin{ali......
  • 2024杭电多校第9场
    91001树异或价值(hdu7529)对价值定义式进行转化,\((a_i\oplusa_j)\timeslca(a_i,a_j)\)可视为\(a_i,a_j\)的所有祖先下\(\suma_i\oplusa_j\),数组\(a\)总价值即各节点子树中任意两个子节点的异或之和。由按位异或的性质,不同二进制位之间答案互不影响,可简化考虑最低位即......
  • 2024年人教版义务教育新教材网络培训来了
    写在前面1.支持2024年人教版义务教育阶段新教材网络培训会-t.pep.com.cn/xjc2024-1352.时间不是直接看直播,看的是直播以后的课程,回放或者补学,课程出来就会学有学时,可以下证书3.需要帮助绿泡泡190去掉文字3308去掉文字7156项目简介:8月20~27日开展!2024年人教版义务教育......