当前位置: 首页 > article >正文

【学习笔记】「JOISC 2022 Day3」洒水器

我是小丑。

有没有一种恰好将所有 ≤ d \le d d的点都标记一次的打标方法?

答案是有的。设 f i , d f_{i,d} fi,d表示以 i i i为根的子树,第 d d d层的儿子打上的标记。然后发现,从 x x x出发往上爬到祖先 y y y,假设到 y y y点时上还有 d d d步可以走,那么就把以 y y y为根的子树的第 d d d层和第 d − 1 d-1 d1层打上标记。

这样每个点恰好标记一次。厉害。不需要用到任何数据结构。

复杂度 O ( n d ) O(nd) O(nd)

#include<bits/stdc++.h>
#define ll long long
#define fi first
#define se second
#define pb push_back
#define inf 0x3f3f3f3f
using namespace std;
const int N=2e5+55;
int n,L,Q;
ll f[N][45],h[N],fa[N];
vector<int>G[N];
//joker
void dfs(int u,int topf){
    fa[u]=topf;
    for(auto v:G[u]){
        if(v!=topf){
            dfs(v,u);
        }
    }
}
int main(){
    ios::sync_with_stdio(false);
    cin.tie(0),cout.tie(0);
    cin>>n>>L;
    for(int i=1;i<n;i++){
        int u,v;cin>>u>>v;
        G[u].pb(v),G[v].pb(u);
    }
    for(int i=n+1;i<=n+40;i++){
        G[i].pb(i-1),G[i-1].pb(i);
    }
    for(int i=1;i<=n;i++)cin>>h[i];
    for(int i=1;i<=n+40;i++){
        for(int j=0;j<=40;j++)f[i][j]=1;
    }
    dfs(n+40,0);
    cin>>Q;
    for(int i=1;i<=Q;i++){
        int op;
        cin>>op;
        if(op==1){
            int x,D,W;
            cin>>x>>D>>W;
            while(x&&D>=0){
                f[x][D]=f[x][D]*W%L;
                if(D)f[x][D-1]=f[x][D-1]*W%L;
                x=fa[x],D--;
            }
        }
        else{
            int x,D=0;
            cin>>x;
            ll res=h[x];
            while(x&&D<=40){
                res=res*f[x][D]%L;
                x=fa[x],D++;
            }
            cout<<res<<"\n";
        }
    }
}

http://www.kler.cn/news/16628.html

相关文章:

  • 【数学建模】Day01——层次分析法
  • Java中的StringBuffer 和 StringBuilder 类
  • BM53-缺失的第一个正整数
  • 【6. 激光雷达接入ROS】
  • Java集合框架与ArrayList、LinkedList的区别
  • 操作系统——操作系统逻辑结构
  • Hbase数据库完全分布式搭建以及java中操作Hbase
  • Opencv识别车牌
  • 多级缓存建设方案
  • PHP图片上传代码怎么写和代码的用发
  • vue3表单输入绑定
  • DDD系列:三、Repository模式
  • C++项目中打破循环依赖的锁链:实用方法大全
  • 【Java校招面试】基础知识(二)——Spring Framework AOP
  • java stream 实践篇
  • day1_内存区域
  • 枚举法计算24点游戏
  • C++Primer第五版【阅读笔记】
  • LeetCode 560. 和为 K 的子数组
  • kettle不同数据源的字段不一致的合并后插入数据库
  • 如何使用快速排序算法对整数数组进行就地排序?
  • 从4k到42k,软件测试工程师的涨薪史,给我看哭了
  • 我的医学预测模型评价步骤(仅供参考)
  • SmartEngine流程引擎之Custom模式
  • ApplicationContextAware接口
  • ETL工具 - Kettle 输入输出算子介绍
  • MyBatisPlus代码生成器使用
  • Linux Ansible角色介绍
  • Python使用AI animegan2-pytorch制作属于你的漫画头像/风景图片
  • 3.3 泰勒公式例题分析