暑假集训day8

Posted Yzyet

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了暑假集训day8相关的知识,希望对你有一定的参考价值。

其实这是昨天的事了。(现在时间回到一天前)

跳跳糖(9018——1563)

这道题用二分步长的方法做(LCA的一种)

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int INF=1e9;
inline int read(){
    int x=0,t=1;char c=getchar();
    while(c<\'0\'||c>\'9\'){if(c==\'-\')t=-1;c=getchar();}
    while(c>=\'0\'&&c<=\'9\'){x=(x<<3)+(x<<1)+c-\'0\';c=getchar();}
    return x*t;
}
int a[4],b[4],ans[4],deep;
int deng(int *x,int *y){
    for(int i=1;i<=3;i++)if(x[i]!=y[i])return 0;return 1;
}
void solve(int *q,int k){
    int t1=q[2]-q[1],t2=q[3]-q[2];
    for(int i=1;i<=3;i++)ans[i]=q[i];
    if(t1==t2)return;
    if(t1<t2){
        int t=min(k,(t2-1)/t1);
        k-=t;deep+=t;
        ans[1]+=t*t1;ans[2]+=t*t1;
    }
    else{
        int t=min(k,(t1-1)/t2);
        k-=t;deep+=t;
        ans[3]-=t*t2;ans[2]-=t*t2;
    }
    if(k)solve(ans,k);
}
int main()
{
    for(int i=1;i<=3;i++)a[i]=read();sort(a+1,a+4);
    for(int i=1;i<=3;i++)b[i]=read();sort(b+1,b+4);
    int x[4],y[4];
    deep=0;solve(a,INF);for(int i=1;i<=3;i++)x[i]=ans[i];int d1=deep;
    deep=0;solve(b,INF);for(int i=1;i<=3;i++)y[i]=ans[i];int d2=deep;
    if(!deng(x,y)){puts("NO");return 0;}
    if(d1>d2){swap(d1,d2);for(int i=1;i<=3;i++)swap(a[i],b[i]);}
    int d=d2-d1;
    solve(b,d);for(int i=1;i<=3;i++)b[i]=ans[i];
    int l=0,r=d1;
    while(l<=r){
        int mid=(l+r)/2;
        solve(a,mid);for(int i=1;i<=3;i++)x[i]=ans[i];
        solve(b,mid);for(int i=1;i<=3;i++)y[i]=ans[i];
        if(!deng(x,y))l=mid+1;
        else r=mid-1;
    }
    printf("YES\\n%d",d+l*2);
    return 0;
}

 

树的统计(bzoj_1036)

就是树链剖分了,模板题。

这题调了半天、、发现swap(t1,t2)变成swap(t1,t1)。

#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<vector>
#include<queue>
using namespace std;
const int N=30010,INF=947483647;
inline int read(){
    int t=1,num=0;char c=getchar();
    while(c>\'9\'||c<\'0\'){if(c==\'-\')t=-1;c=getchar();}
    while(c>=\'0\'&&c<=\'9\'){num=(num<<1)+(num<<3)+c-\'0\';c=getchar();}
    return num*t;
}
struct yzy{int c[2];}t[3*N];vector<int>biao[N];
int n,q,a[N],val[2]={0,-INF},fa[N],dep[N],son[N],size[N],top[N],root,k;
void dfs1(int x,int f,int d){
    dep[x]=d;fa[x]=f;size[x]=1;son[x]=0;
    for (int i=0;i<biao[x].size();i++) {  
        int y=biao[x][i];if(y==f)continue;
        dfs1(y,x,d+1);size[x]+=size[y];
        if(size[y]>size[son[x]])son[x]=y;
    }
}
int num=0,id[N];
void dfs2(int x,int tp){
    id[x]=++num;top[x]=tp;
    if(son[x])dfs2(son[x],tp);
    for(int i=0;i<biao[x].size();i++){
        int y=biao[x][i];if(y!=son[x]&&y!=fa[x])dfs2(y,y);
    }
}
void build(int ro,int l,int r){
    if(l==r){t[ro].c[0]=t[ro].c[1]=a[l];return;}
    int mid=(l+r)>>1;
    build(ro<<1,l,mid);build((ro<<1)+1,mid+1,r);
    t[ro].c[0]=t[ro<<1].c[0]+t[(ro<<1)+1].c[0];
    t[ro].c[1]=max(t[ro<<1].c[1],t[(ro<<1)+1].c[1]);
}
int ask(int ro,int l,int r,int x,int y){
    if(x>r||y<l)return val[k];if(x<=l&&r<=y)return t[ro].c[k];
    int mid=(l+r)>>1;
    if(!k)return (ask(ro<<1,l,mid,x,y)+ask((ro<<1)+1,mid+1,r,x,y));
    return max(ask(ro<<1,l,mid,x,y),ask((ro<<1)+1,mid+1,r,x,y));
}
void change(int ro,int l,int r,int x,int add){
    if(l==r){if(x==l){t[ro].c[0]+=add;t[ro].c[1]+=add;}return;}
    int mid=(l+r)>>1;
    if(x<=mid)change(ro<<1,l,mid,x,add);
    else change((ro<<1)+1,mid+1,r,x,add);
    t[ro].c[0]=t[ro<<1].c[0]+t[(ro<<1)+1].c[0];
    t[ro].c[1]=max(t[ro<<1].c[1],t[(ro<<1)+1].c[1]);
}
int solve(int x,int y){
    int t1=top[x],t2=top[y],ans=val[k];
    while(t1!=t2){
        if(dep[t1]<dep[t2]){swap(t1,t2);swap(x,y);}
        if(k)ans=max(ask(1,1,n,id[t1],id[x]),ans);
        else ans+=ask(1,1,n,id[t1],id[x]);
        x=fa[t1];t1=top[x];
    }
    if(dep[x]>dep[y])swap(x,y);
    if(k)ans=max(ask(1,1,n,id[x],id[y]),ans);
    else ans+=ask(1,1,n,id[x],id[y]);
    return ans;
}
int main()
{
    n=read();for(int i=1;i<n;i++){
        int x=read(),y=read();
        biao[x].push_back(y);biao[y].push_back(x);
    }dfs1(1,0,1);dfs2(1,1);
    for(int i=1;i<=n;i++)a[id[i]]=read();
    build(1,1,n);q=read();
    for(int i=1;i<=q;i++){
        char c=getchar();
        while(c!=\'H\'&&c!=\'M\'&&c!=\'S\')c=getchar();
        int x=read(),y=read();
        if(c==\'H\'){change(1,1,n,id[x],y-a[id[x]]);a[id[x]]=y;continue;}
        else if(c==\'M\')k=1;else k=0;
        printf("%d\\n",solve(x,y));
    }
    return 0;
}

本文由Yzyet编写,网址为www.cnblogs.com/Yzyet。非Yzyet同意,禁止转载,侵权者必究。

以上是关于暑假集训day8的主要内容,如果未能解决你的问题,请参考以下文章

长沙集训day8

价[雅礼集训 2017 Day8]

LOJ_6045_「雅礼集训 2017 Day8」价 _最小割

「6月雅礼集训 2017 Day8」gcd

loj6045 「雅礼集训 2017 Day8」价

暑假集训-8.02总结