TJOI2015 旅游

Description

Input

Output

Sample Input

输入:31 2 31 22 321 2 1001 3 100

Sample Output

输出:11

Data Constraint

解法:显然的链剖。维护区间max,min,前面减后面的max,后面减前面的max即可

#include<cstdio>
#include<cstdlib>
#include<algorithm>
#include<cmath>
#include<cstring>

using namespace std;

struct Tree{
    int lr,rl,mx,mn,bz;
}tr[400011];

Tree Tm[111];
int g[50011],next[100011],y[100011],num[50011],dep[50011],fa[50011],top[50011];
int id[50011],son[50011],size[50011],pm[111],sm[111],val[50011];
int tot,tt,n,i,x,z,q,ans,m;

struct AA{
    int l,r,k,sh;
}que[111];

void star(int i,int j)
{
    tt++;
    next[tt]=g[i];
    g[i]=tt;
    y[tt]=j;
}

void build_chain(int root)
{
    int x;
    x=root;
    while(x){
        tot++;
        id[tot]=x;
        num[x]=tot;
        top[x]=root;
        x=son[x];
    }
}

void dfs(int x)
{
    int j,k;
    size[x]=1;
    j=g[x];
    while(j!=0){
        k=y[j];
        if(k!=fa[x]){
            fa[k]=x;
            dep[k]=dep[x]+1;
            dfs(k);
            size[x]+=size[k];
            if(size[k]>size[son[x]]){
                if(son[x])build_chain(son[x]);
                son[x]=k;
            }
            else build_chain(k);
        }
        j=next[j];
    }

}

Tree Merge(Tree a,Tree b)
{
    Tree c;
    c.mx=max(a.mx,b.mx);
    c.mn=min(a.mn,b.mn);
    c.rl=max(a.rl,b.rl);
    c.rl=max(c.rl,b.mx-a.mn);
    c.lr=max(a.lr,b.lr);
    c.lr=max(c.lr,a.mx-b.mn);
    return c;
}

void up(int t)
{
    Tree a,b;
    Tree &c=tr[t];
    a=tr[t+t];b=tr[t+t+1];
    c.mx=max(a.mx,b.mx);
    c.mn=min(a.mn,b.mn);
    c.rl=max(a.rl,b.rl);
    c.rl=max(c.rl,b.mx-a.mn);
    c.lr=max(a.lr,b.lr);
    c.lr=max(c.lr,a.mx-b.mn);

}

void build(int l,int r,int t)
{
    if(l==r){
        tr[t].mx=tr[t].mn=val[id[l]];
        tr[t].lr=tr[t].rl=0;
        tr[t].bz=0;
        return;
    }
    int mid;
    mid=(l+r)/2;
    build(l,mid,t+t);
    build(mid+1,r,t+t+1);
    tr[t].bz=0;
    up(t);
}

void change(int t,int x)
{
    tr[t].bz+=x;
    tr[t].mx+=x;
    tr[t].mn+=x;
}

void down(int t,int l,int r)
{
    if(l==r)return;
    if(tr[t].bz){
        change(t+t,tr[t].bz);
        change(t+t+1,tr[t].bz);
        tr[t].bz=0;
    }
}

void insert(int t,int l,int r,int x,int y,int z)
{
    down(t,l,r);
    if(l==x&&r==y){
        change(t,z);
        return;
    }
    int mid;
    mid=(l+r)/2;
    if(y<=mid)insert(t+t,l,mid,x,y,z);
    if(x>mid)insert(t+t+1,mid+1,r,x,y,z);
    if(x<=mid&&y>mid){
        insert(t+t,l,mid,x,mid,z);
        insert(t+t+1,mid+1,r,mid+1,y,z);
    }
    up(t);
}

Tree ask(int t,int l,int r,int x,int y)
{
    down(t,l,r);
    if(l==x&&r==y)return tr[t];
    Tree re;
    int mid;
    mid=(l+r)/2;
    if(y<=mid)re=ask(t+t,l,mid,x,y);
    if(x>mid)re=ask(t+t+1,mid+1,r,x,y);
    if(x<=mid&&y>mid)re=Merge(ask(t+t,l,mid,x,mid),ask(t+t+1,mid+1,r,mid+1,y));
    up(t);
    return re;
}

bool cmp(AA a,AA b)
{
    if(a.k==b.k){
        if(a.k==1)return a.sh<b.sh;
        else return a.sh>b.sh;
    }
    else return a.k<b.k;
}

void Work(int st,int ed,int ad)
{
    int bs,be,mn[3],i,ts(0);
    bs=1;be=2;
    mn[1]=mn[2]=0;
    while(true){
        if(top[st]==top[ed]){
            if(dep[st]<dep[ed])swap(st,ed),swap(bs,be);
            ts++;
            que[ts].l=num[ed];
            que[ts].r=num[st];
            que[ts].k=bs;
            que[ts].sh=++mn[bs];
            break;
        }
        else{
            if(dep[top[st]]<dep[top[ed]])swap(st,ed),swap(bs,be);
            ts++;
            que[ts].l=num[top[st]];
            que[ts].r=num[st];
            que[ts].k=bs;
            que[ts].sh=++mn[bs];
            st=fa[top[st]];
        }
    }
    sort(que+1,que+1+ts,cmp);
    for(i=1;i<=ts;i++)insert(1,1,n,que[i].l,que[i].r,ad);
    pm[0]=214748364;
    sm[ts+1]=-214748364;
    for(i=1;i<=ts;i++)Tm[i]=ask(1,1,n,que[i].l,que[i].r);
    for(i=1;i<=ts;i++)pm[i]=min(pm[i-1],Tm[i].mn);
    for(i=ts;i>=1;i--)sm[i]=max(sm[i+1],Tm[i].mx);
    ans=-214748364;
    for(i=1;i<=ts;i++){
        if(que[i].k==2)ans=max(ans,Tm[i].rl);
        else ans=max(ans,Tm[i].lr);
        ans=max(ans,sm[i+1]-pm[i]);
    }
}

int main()
{
    scanf("%d",&n);
    for(i=1;i<=n;i++)scanf("%d",&val[i]);
    for(i=1;i<n;i++){
        scanf("%d%d",&x,&z);
        star(x,z);
        star(z,x);
    }
    scanf("%d",&m);
    dfs(1);
    build_chain(1);
    build(1,n,1);
    for(i=1;i<=m;i++){
        scanf("%d%d%d",&x,&z,&q);
        Work(x,z,q);
        printf("%d\n",ans);
    }
}
时间: 2024-08-28 18:00:19

TJOI2015 旅游的相关文章

BZOJ3999 [TJOI2015]旅游

题面:给定一个有$n$个节点的树,每个点又点权$v_i$,每次选取一条树链$[a, b]$,求出$max(v_i - v_j)$,其中$i, j \in [a, b]$且$i$出现在$j$前面,最后树链$[a, b]$上的点点权都加上$v'$ 裸的树链剖分,用线段树维护树链...查询的时候要用线段树合并...然后就没有然后了... 代码能力捉鸡QAQQQ,而且貌似是C++程序里面跑的最慢的QAQQQ 1 /*********************************************

TJOI2015 day2解题报告

其实第三题还没看啦~~前两题就总结下吧 T1:[TJOI2015]旅游 描述:(BZ没题面只能口述了..)一个人在一棵树上走,每次从a->b会进行一次贸易(也就是在这条路径上买入物品然后在后面卖出)然后每次经过一个点该点的物品价格会上涨v,求每次贸易的最大获利 很裸的一道树链剖分,就是题目描述太不明白了..这样就是在某条路径上找到某个点减去后面路径的最小点的值的最大值.可以用线段树的区间合并解决.就是在求答案时的合并答案上方向搞反了查了很久...以前也犯过着种错误,以后不能再犯了.. CODE:

广州去厦门旅游攻略--(转自 #散文吧网站#)

广州去厦门旅游攻略 发布时间:2016-12-11 17:30 厦门由厦门岛.离岛鼓浪屿.内陆九龙江南岸海沧半岛.集美半岛.翔安区以及同安等组成,陆地面积1699.39Km2,海域面积300多平方公里.厦门的主体--厦门岛南北长13.7公里,东西宽12.5公里,面积约为128.14Km2.是厦门的主要岛屿,也是厦门第一大岛屿.厦门岛是厦门经济特区的发祥地,岛上有厦门的商业和政治中心.各国殖民者最初居住的地方鼓浪屿就在厦门岛西南部.今天小编带给大家的是广州去厦门旅游攻略, 希望对大家有帮助. 厦门

第四周作业——在你的实际项目旅游网站中,网页主页面主要有哪些模块?

网站的主页面主要包括几个模块.第一个模块是注册与登录模块,用于用户的注册和登录.第二个模块是搜索,它能帮助用户快速方便的查找用户想要了解的城市,从而对该城市的图片进行浏览.第三个模块是城市图片模块,用于用户对城市的自主选择,在该城市首图片的一侧会注有对该城市的一些简单介绍.这是给那些想要旅游却没有明确的目的地的用户提供的一种介绍,在用户看到自己想要了解的城市之后,可以点击图片链接进入更详细的介绍该城市的模块中进行浏览.第四个模块是评论的模块,在该模块中,用户可以结合自己的亲身经历对某城市进行一番

360全景虚拟景区,现在的旅游景点都在用它赚钱

360全景在旅游景点应用,高清晰度全景三维展示景区的优美环境,给观众一个身临其景的体验,结合景区游览图导览,可以让观众自由穿梭于各景点之间,是旅游景区.旅游产品宣传推广的最佳创新手法. 360全景虚拟景区是指以全景虚拟现实为主要技术手段的虚拟现实技术,全面展示旅游景点风貌,给游客身临其境的感受. 360全景虚拟景区主要用于电子商务平台及景区数字推广. 国务院曾出台过<国务院关于加快发展旅游业的意见>的文件,该文件中要求旅游行业"以信息化为主要途径,提高旅游服务效率.全面提升旅游企业.

360全景旅游前景怎么样,有哪些优势?

360全景通过使用数码相机捕捉真实场景的360全景范围内的图像信息,结合全景软件生成360全景并发布,观赏者使用鼠标来控制图像放大缩小,随意拖动观看场景360°范围内的任意角度. 对于某些偏远地区的文化旅游业而言,要促进产业链整合.推动各环节有效联动并实现产业的价值增值,更需要特别重视旅游价值链的各环节. 听"虚拟"一词,给人们的第一感觉就是不真实,虚幻.今日,我们再谈"虚拟",定义不再仅仅是虚拟.全景技术的加入,让虚拟的环境给人以真实的感觉,以身临其境,形象生动.

携程合体去哪儿,与途牛度假旅游市场争高下

作者:楠沨 [IT战略家] 本次度假业务的合并,除了双方在线旅游市场的携手,还包括了地面BU(旅游事业部)的合并,进一步提升双方在包价旅游业务和地面碎片化业务地位的同时,携程旅游将获得去哪儿度假的用户流量,在团队效率上也会有所提高. 近来,携程在资本市场动作频频.先是战略投资旅游百事通,通过后者拥有的5000多家线下门店布局二.三线城市,后又与美国海鸥.纵横.途风三大旅行社战略合作,进军美国旅游市场,扩展线下旅游业务.本次合并去哪儿,是携程整合在线度假市场"生态圈"的又一大动作.同时,

bzoj2157旅游

题目: 2157: 旅游 Time Limit: 10 Sec  Memory Limit: 259 MBSubmit: 569  Solved: 310[Submit][Status][Discuss] Description Ray 乐忠于旅游,这次他来到了T 城.T 城是一个水上城市,一共有 N 个景点,有些景点之间会用一座桥连接.为了方便游客到达每个景点但又为了节约成本,T 城的任意两个景点之间有且只有一条路径.换句话说, T 城中只有N − 1 座桥.Ray 发现,有些桥上可以看到美丽

旅游票务网站

网站简介:实现票务电子商务平台,在平台上面购买票后,在线支付然后手机收到验证码,在景点进行验证进行电子检票.(朋友提的要求) 网站主要有三部分组成,前台web(包括会员系统),后台管理系统,景点验票. 网站的主要内容:景点门票,景区宾馆,旅游租车,会议会务,帮助中心 网站主要的模块:登陆 支付 短信发送 其中会员部分:散户(不登录) 登录会员 代理商 网站设计一共涉及到32个数据表,后经优化压缩到27个.网站采用tp3.1.2框架进行设计 由于个人美工方面不够专业,细节上仍显粗糙!