首页 > 其他分享 >旅行

旅行

时间:2024-07-28 23:28:10浏览次数:12  
标签:旅行 200005 int mid bj cc n1

  • 怎么感觉杭电OJ有好几台不同的评测机,而且评测机之间不但速度不同,而且对代码长度的统计都不同?
  • 理论上答案是可以超过int存储范围的,反正没有这种数据,我不管了
点击查看代码
#include <bits/stdc++.h>
using namespace std;
vector<int>a[200005];
int c[200005],w[200005];
int f[200005],g[200005];
int s[200005],n;
int read1()
{
    char cc=getchar();
    while(!(cc>=48&&cc<=57))
    {
        if(cc=='-')
        {
            break;
        }
        cc=getchar();
    }
    bool f=false;
    int s=0;
    if(cc=='-')
    {
        f=true;
    }
    else
    {
        s=cc-48;
    }
    while(1)
    {
        cc=getchar();
        if(cc>=48&&cc<=57)
        {
            s=s*10+cc-48;
        }
        else
        {
            break;
        }
    }
    if(f==true)
    {
        s=-s;
    }
    return s;
}
struct t1
{
    int l,r;
    int sum,bj;
}t[200000*19+5];
void spread(int p,int l,int r)
{
    int mid=(l+r)>>1;
    if(t[p].l)
    {
        if(l==mid)
        {
            t[t[p].l].sum+=t[p].bj;
        }
        else
        {
            t[t[p].l].bj+=t[p].bj;
        }
    }
    if(t[p].r)
    {
        if(mid+1==r)
        {
            t[t[p].r].sum+=t[p].bj;
        }
        else
        {
            t[t[p].r].bj+=t[p].bj;
        }
    }
    t[p].bj=0;
}
int ask(int p,int l,int r,int x)
{
    if(p==0)
    {
        return INT_MIN;
    }
    spread(p,l,r);
    if(l==r)
    {
        return t[p].sum;
    }
    int mid=(l+r)>>1;
    if(x<=mid)
    {
        return ask(t[p].l,l,mid,x);
    }
    else
    {
        return ask(t[p].r,mid+1,r,x);
    }
}
int cnt;
int New()
{
    cnt++;
    t[cnt].l=t[cnt].r=0;
    t[cnt].sum=INT_MIN;
    t[cnt].bj=0;
    return cnt;
}
void change(int &p,int l,int r,int id,int y)
{
    if(p==0)
    {
        p=New();
    }
    if(l==r)
    {
        t[p].sum=y;
        return;
    }
    int mid=(l+r)>>1;
    if(id<=mid)
    {
        change(t[p].l,l,mid,id,y);
    }
    else
    {
        change(t[p].r,mid+1,r,id,y);
    }
}
int merge(int p,int q,int l,int r)
{
    if(!q)
    {
        return p;
    }
    spread(q,l,r);
    if(!p)
    {
        return q;
    }
    spread(p,l,r);
    if(l==r)
    {
        t[p].sum=max(t[p].sum,t[q].sum);
    }
    else
    {
        int mid=(l+r)>>1;
        t[p].l=merge(t[p].l,t[q].l,l,mid);
        t[p].r=merge(t[p].r,t[q].r,mid+1,r);
    }
    return p;
}
int v;
void dfs(int p,int n1,int fa)
{
    int va=ask(p,1,n,c[n1]);
    if(va!=INT_MIN)
    {
           f[p]=max(f[p],w[n1]+v+g[n1]+va);
       }
    for(int i=0;i<a[n1].size();i++)
    {
        if(a[n1][i]!=fa)
        {
            v=v+(g[n1]-f[a[n1][i]]);
            dfs(p,a[n1][i],n1);
            v=v-(g[n1]-f[a[n1][i]]);
        }
    } 
}
void dp(int n1,int fa)
{
    s[n1]=1;
    int h=0;
    for(int i=0;i<a[n1].size();i++)
    {
        if(a[n1][i]!=fa)
        {
            dp(a[n1][i],n1);
            s[n1]+=s[a[n1][i]];
            g[n1]+=f[a[n1][i]];
            if(s[a[n1][i]]>s[h])
            {
                h=a[n1][i];
            }
        }
    }
    f[n1]=g[n1];
    change(n1,1,n,c[n1],w[n1]+g[n1]);
    if(h==0)
    {
        return;
    }
    f[n1]=max(f[n1],ask(h,1,n,c[n1])+w[n1]+g[n1]-f[h]);
    t[h].bj+=(g[n1]-f[h]);
    n1=merge(n1,h,1,n);
    for(int i=0;i<a[n1].size();i++)
    {
        if(a[n1][i]!=fa&&a[n1][i]!=h)
        {
            v=-f[a[n1][i]];
            dfs(n1,a[n1][i],n1);
            t[a[n1][i]].bj+=(g[n1]-f[a[n1][i]]);
            n1=merge(n1,a[n1][i],1,n);
        }
    }
}
int main()
{
    int T;
    cin>>T;
    while(T--)
    {
        cin>>n;
        cnt=0;
        for(int i=1;i<=n;i++)
        {
            a[i].clear();
            c[i]=read1();
            g[i]=0;
            i=New();
        }
        for(int i=1;i<=n;i++)
        {
            w[i]=read1();
        }
        for(int i=1;i<n;i++)
        {
            int u,v;
            u=read1();
            v=read1();
            a[u].push_back(v);
            a[v].push_back(u);
        }
        dp(1,0);
        cout<<f[1]<<endl;
    }
    return 0;
}

标签:旅行,200005,int,mid,bj,cc,n1
From: https://www.cnblogs.com/watersail/p/18329158

相关文章

  • 【Python datetime模块精讲】:时间旅行者的日志,精准操控日期与时间
    当然,让我们深入探讨Python的datetime模块,详细解释其功能和用法。Pythondatetime模块:时间旅行者的日志在编程中,日期和时间的处理是一个常见但复杂的问题。幸运的是,Python的datetime模块为我们提供了一套全面的解决方案。这个模块不仅包括日期和时间的基本表示,还提供......
  • Java计算机毕业设计旅行分享平台(开题报告+源码+论文)
    本系统(程序+源码)带文档lw万字以上 文末可获取一份本项目的java源码和数据库参考。系统程序文件列表开题报告内容研究背景在数字化时代,旅游行业正经历着前所未有的变革。随着人们生活水平的提高和休闲方式的多样化,旅行已成为现代人追求生活品质、拓宽视野的重要方式之一。......
  • 计算机课设——安卓旅行日志
    计算机课设——安卓旅行日志私信获取完整代码本项目用到很多第三方开源库,特此感谢这些大大开源的库,同时也感谢csdn许多博客的启发。......
  • 【智能算法改进】改进的麻雀搜索算法及其求解旅行商问题
    目录1.算法原理2.改进点3.结果展示4.参考文献5.代码获取1.算法原理【智能算法】麻雀搜索算法(SSA)原理及实现2.改进点改进发现者更新位置为了使SSA算法能够避开向原点收敛的弊端,将算法向最优位置跳跃的操作转换为向最优位置的移动:......
  • 【人工智能】高级搜索技术(模拟退火搜索算法和遗传算法解决旅行商问题)
    目录一、旅行商问题1.需求分析2.数据结构、功能模块设计与说明2.1数据结构(1)模拟退火搜索算法(2)遗传算法2.2功能模块设计(1)模拟退火搜索算法(2)遗传算法3.核心代码与测试结果说明(1)模拟退火搜索算法(2)遗传算法4.心得体会一、旅行商问题现有一个商人,准备从广州......
  • P1081[NOIP2012提高组]开车旅行
    前两天老师还让我们狂做紫题,为什么今天就要求我们对这一道蓝题打暴力qwqupdata:今天突然看到,这道题也是紫题了qwqP1081开车旅行这道题一看就是dp一类的题,然后就会很顺畅的想到倍增awa首先,看一下暴力怎么打。这道题是当年的T4,然后有整整70分的暴力分,这是十分可观的awa。所......
  • 同声传译app哪个好免费?5款旅行必备的实时翻译器
    暑假快到了,不得不说暑假就是要好朋友出去玩啊,谁还一整天都待在家里呢?若条件允许,跨出国门,领略异国风情,也是一个不错的选择。但语言障碍常常成为许多人心中的顾虑,担心自己的口语水平不足以畅游无忧。别担心,下面就为大家提供解决方案。今天给大家整理归纳了5个出国旅游必备的同......
  • 毕业旅行 oj题
    对于输入字符串:使用cincin适用于输入不包含空格的字符串。#include<iostream>usingnamespacestd;intmain(){charstr[1001];//字符数组大小为1001,留一个位置给'\0'cin>>str;cout<<"Youentered:"<<str<<endl;retur......
  • P3350 [ZJOI2016] 旅行者
    咕了2天才写的题解还是比较经典的题目,分治处理网格图最短路离线下来,利用分治的思想,用一条线把网格图平均劈成两半,每次只考虑询问在两块的一对点,所有的线必须经过直线上的一个点,于是我把线上所有点都在规定范围内跑一次dijkstra,最后直接算答案,显然我想让最短路跑的次数最小,每次选......
  • 某程旅行安全工程师一面
    一、自我介绍阿吧阿吧,不多说了二、两段实习经历,看你在南京中孚数据安全部做实习生,你能大概讲一下做什么的吗当时做的是一个隐写溯源项目,是我们实验室跟南京中孚那边共同合作的。主要是针对电子文档信息泄露,数据泄密问题,开发涉密文档隐写溯源系统,实现敏感信息泄露追踪溯源技术,解......