首页 > 其他分享 >天天爱跑步

天天爱跑步

时间:2023-10-12 15:44:56浏览次数:30  
标签:include int void cin 天天 跑步 calc define

P1600 [NOIP2016 提高组] 天天爱跑步

我们首先考虑满足可以被观测到的条件。

为了方便,我们将一条路径分为两部分,一部分是往上的(包含LCA),另一部分是往下的(不包含LCA)。

对于第一部分,满足 \(d_u-d_x=w_x\rightarrow d_u=d_x+w_x\),是固有属性。

对于第二部分,满足 \(d_u-d_p+d_x-d_p=w_x\rightarrow w_x-d_x=d_u-2d_p\),也是固有属性。

又因为这个是有作用范围的,对于每个点记录一个类似于哈希表的东西,我们可以在路径上打个标记,说明这个位置有 \(d_u/d_u-2d_p\),然后查询哈希表中下标为 \(w_x\pm d_x\) 的值。

发现这是静态的,所以可以差分,对于一段 \((a,b)\)(对于第一二部分均适用),在 \(fa_a\) 上挂上一个下标处-1,\(b\) 处+1,就可以达到效果。

然后最后搜索子树权值和即可,累加遍历子树前后的差值即可(因为遍历后恰好增加了这个子树的贡献)。

这道题的差分很特别,需细细品味。

它记录的值虽然没有任何意义,但是利用的是差值计算答案。

#include<cstdio>
#include<iostream>
#include<cassert>
#include<cstring>
#include<vector>
using namespace std;
#define Ed for(int i=h[x];~i;i=ne[i])
#define Ls(i,l,r) for(int i=l;i<r;++i)
#define Rs(i,l,r) for(int i=l;i>r;--i)
#define Le(i,l,r) for(int i=l;i<=r;++i)
#define Re(i,l,r) for(int i=l;i>=r;--i)
#define L(i,l) for(int i=0;i<l;++i)
#define E(i,l) for(int i=1;i<=l;++i)
#define W(t) while(t--)
#define Wh while
typedef pair<int,int> pii;
#define x first
#define y second
const int N=300010,K=19,M=2*N;
int n,m,f[N][K],d[N],s[N*3],w[N],ans[N];
int h[N],e[M],ne[M],idx;//don't forget memset h!
vector<pii>g[N];
struct{
    int a,b,p;
}q[N];
void add(int a,int b){
    e[idx]=b,ne[idx]=h[a],h[a]=idx++;
}
void dfs(int x,int fa){
    d[x]=d[fa]+1;
    Ed{
        int j=e[i];
        if(j==fa)continue;
        f[j][0]=x;
        E(k, K-1)f[j][k]=f[f[j][k-1]][k-1];
        dfs(j,x);
    }
}
int lca(int a,int b){
    if(d[a]>d[b])swap(a,b);
    Re(i, K-1, 0)
        if(d[f[b][i]]>=d[a])b=f[b][i];
    if(a==b)return a;
    Re(i, K-1, 0)
        if(f[a][i]!=f[b][i])a=f[a][i],b=f[b][i];
    return f[a][0];
}
void calc(int x,int sg){
    int t=w[x]+sg*d[x]+M,lst=s[t];
    for(auto& it:g[x])s[it.x+M]+=it.y;//由于只是累加差值,这句话放哪里都行
    Ed{
        int j=e[i];
        if(j==f[x][0])continue;
        calc(j,sg);
    }
    // assert(!s[t]);
    ans[x]+=s[t]-lst;
}
void calc_up(){
    E(i, m){
        auto[a,b,p]=q[i];
        int D=d[a];
        g[a].push_back({D,1});
        g[f[p][0]].push_back({D,-1});
    }
    calc(1,1);
}
void calc_down(){
    E(i, n)g[i].clear();
    E(i, n*3)s[i]=0;
    E(i, m){
        auto[a,b,p]=q[i];
        int D=d[a]-2*d[p];
        g[b].push_back({D,1});
        g[p].push_back({D,-1});
    }
    calc(1,-1);
}
int main(){
    #ifndef ONLINE_JUDGE
    freopen("1.in","r",stdin);
    #endif
    ios::sync_with_stdio(0);
    cin.tie(0);
    cout.tie(0);
    cin>>n>>m;
    memset(h,-1,n*4+4);
    E(i, n-1){
        int a,b;
        cin>>a>>b;
        add(a,b),add(b,a);
    }
    dfs(1,0);
    E(i, n)cin>>w[i];
    E(i, m){
        int a,b;
        cin>>a>>b;
        // cout<<a<<' '<<b<<' '<<lca(a,b)<<'\n';
        q[i]={a,b,lca(a,b)};
    }
    calc_up();
    calc_down();
    E(i, n)cout<<ans[i]<<' ';
    return 0;
}

标签:include,int,void,cin,天天,跑步,calc,define
From: https://www.cnblogs.com/wscqwq/p/17759660.html

相关文章

  • 传奇架设跑步卡出刀卡怎么解决
    很多新手经常遇到传奇架设跑步卡出刀卡多半是M2参数设置问题,还有就是本地测试无延迟调试好了架设到服务器感觉又卡了,稍微的延迟你可以在微调下,架设到服务器的不要精细调本地的游戏速度,这个问题归根结底来说网络的问题和版本设置问题。M2-选项-参数-游戏速度可以看到如下的设置......
  • 5_1_天天向上_(葵花宝典第1章ZigBee无线网络和收发器)
    ZigBeeWirelessNetworksandTransceivers又是ZigBee界的葵花宝典,为了自己更好的学习,所以决定将比较多的时间拿出来做点有意义的事,虽然翻译水平不是很高,但是在翻译的过程中肯定能得到进步,最关键的就是检验自己的毅力,看看能否坚持。在这个过程中,如果还能帮到一些正在入门ZigBee的朋......
  • P7424 [THUPC2017] 天天爱射击
    传送门我们发现,考虑每个子弹击碎哪些木板是不现实的,所以我们要转换问题:考虑每个木板被哪个子弹击碎考虑可持久化线段树,转换问题成求区间\(l\simr\)的第s早发射的子弹,模板题上代码:#include<bits/stdc++.h>#definelllonglongusingnamespacestd;constllN=2e5+50,M=2e5......
  • 上央视啦!扫描全能王科技助力社会跑步进入无纸化办公时代
    重视人与自然之间的和谐共生推进降碳、减污、扩绿和产业绿色转型是实现社会可持续发展的必经之路科技产品的应用让“减碳”不再是一个宏大而抽象的目标 近期,央视针对纸制品行业发展现状进行探访节目提到,随着图文识别等人工智能技术的广泛应用,无纸化办公成为趋势。 节......
  • 跑步机出口欧盟BS ISO 20957-6-2021认证如何办理呢?
    BSISO20957-6-2021是一种国际质量标准,用于评估运动器材的安全性和可靠性。如果您的跑步机要出口到欧盟市场,那么获得这个认证是非常重要的,因为它可以向欧盟买家证明您的产品符合欧洲标准和法规。要办理BSISO20957-6-2021认证,您需要按照以下步骤进行:1.了解认证要求:首先,您需要详......
  • 简单的python面向对象案例——跑步或吃饭
    个人学习,仅供参考要求对象:小明a.属性:姓名,体重b.方法:跑步,吃东西(每次跑步会减掉0.1kg,每次吃东西增加0.2kg)输入名字以初始体重选择跑步或吃东西,输入次数打印当前体重代码如下:#定义一个类classPerson(object):#公共属性def__init__......
  • 天天打卡一小时第十五天
    天天打卡一小时第十五天问题描述3-5sdut-array2-4打印“杨辉三角“品中国数学史增民族自豪感(1)背景介绍: 北宋人贾宪约1050年首先使用“贾宪三角”进行高次开方运算。南宋数学家杨辉在《详解九章算法》(1261年)记载并保存了“贾宪三角”,故称杨辉三角。杨辉三角是中国数学史上的一......
  • 天天打卡一小时第十四天
    天天打卡一小时第十四天问题描述3-4矩阵运算给定一个n×n的方阵,本题要求计算该矩阵除副对角线、最后一列和最后一行以外的所有元素之和。副对角线为从矩阵的右上角至左下角的连线。输入格式:输入第一行给出正整数n(1<n≤10);随后n行,每行给出n个整数,其间以空格分隔。输出格式:在一行......
  • 天天打卡一小时第十三天
    天天打卡一小时第十三天问题描述3-3校园歌手大赛任务描述:8号选手参加校园歌手大赛,编程读入20个整数(70-100之间)并存入数组中做为20个评委的打分,请按题目要求编程实现输出样例要求的功能(最后得分为去掉最高分和最低分后的平均分)。输入格式:20个整数输出格式:见样例输入样例:82......
  • ​跑步减肥常见的十大误区
    很多人跑步是因为想减肥,而其中的误区可能很多、很碎、很典型,会出现虽然很努力地跑,但就是达不到自己的目标。因此,提出十个最常见的误区,有则改之,无则加勉,❌误区1:出汗越多减肥效果越好❌误区2:跑两三公里也能减肥❌误区3:我都跑了一周了,还没减下来,跑步没用❌误区4:跑步伤膝盖❌误区5:跑步......