长乐集训 Day3

A.moe

题意

Solution

Code

#include<bits/stdc++.h>
inline int read()
{
    int res=0,flag=1;
    char ch=getchar();
    while(!isalnum(ch)) (ch=='-')?flag=-1:1,ch=getchar();
    while(isalnum(ch)) res=res*10+ch-'0',ch=getchar();
    return res*flag;
}
const int inf=998244353;
struct info
{
    int fa,pre,son;
    int dep,size;
    int top;
};
struct edge
{
    int to,nxt;
    int id;
};
int n,m,tot;
int head[100010],pre[100010];
int ans[100010];
struct info in[100010];
struct edge ed[200010];
std::vector<std::tuple<int,int,int> > ver;
void add_edge(int fr,int to,int val)
{
    ed[++tot]=(edge){to,head[fr],val};
    head[fr]=tot;
    return ;
}
void init(int fr,int fa)
{
    in[fr].fa=fa;
    in[fr].size=0;
    in[fr].dep=in[fa].dep+1;
    for(int i=head[fr];i!=0;i=ed[i].nxt)
    {
        int to=ed[i].to;
        if(fa==to)
            continue;
        init(to,fr);
        in[to].pre=ed[i].id;
        in[fr].size+=in[to].size;
        if(in[in[fr].son].size<in[to].size)
            in[fr].son=to; 
    }
    return ;
}
void dfs(int fr,int fa)
{
    if(in[fr].son!=0)
    {
        int to=in[fr].son;
        in[to].top=in[fr].top;
        dfs(to,fr);
    }
    for(int i=head[fr];i!=0;i=ed[i].nxt)
    {
        int to=ed[i].to;
        if(fa==to||in[fr].son==to)
            continue;
        in[to].top=to;
        dfs(to,fr);
    }
    return ;
}
int lca(int a,int b)
{
    int fa=in[a].top;
    int fb=in[b].top;
    while(fa!=fb)
    {
        if(in[fa].dep<in[fb].dep)
            std::swap(a,b),std::swap(fa,fb);
        if(a==1) return 1;
        a=in[fa].fa;
        fa=in[a].top;
    }
    if(in[a].dep>in[b].dep)
        std::swap(a,b);
    return a;
}
void input()
{
    n=read(),m=read();
    for(int i=1;i<n;i++)
    {
        int fr=read(),to=read();
        add_edge(fr,to,i);
        add_edge(to,fr,i);
    }
    for(int i=1;i<=m;i++)
    {
        int fr=read(),to=read(),val=read();
        ver.push_back(std::make_tuple(val,fr,to));
    }
    return ;
}
int find(int x)
{
    if(pre[x]==x)
        return x;
    return pre[x]=find(pre[x]); 
}
void calc(int &now,int val)
{
    if(ans[in[now].pre]==inf)
        ans[in[now].pre]=val;
    pre[find(now)]=find(in[now].fa);
    now=in[now].fa;
    return ;
}
void solve()
{
    init(1,0);
    in[1].top=1;
    dfs(1,0);
    for(int i=1;i<=n;i++)
        ans[i]=inf,pre[i]=i;
    std::sort(ver.begin(),ver.end());
    for(auto p:ver)
    {
        int val=std::get<0>(p);
        int fr=find(std::get<1>(p));
        int to=find(std::get<2>(p));
        int Lca=lca(fr,to);
        while(in[fr].dep>in[Lca].dep)
            calc(fr,val);
        while(in[to].dep>in[Lca].dep)
            calc(to,val);
    }
    return ;
}
int main(int argc,const char *argv[])
{
    freopen("moe.in","r",stdin);
    freopen("moe.out","w",stdout);
    input();
    solve();
    for(int i=1;i<n;i++)
        printf("%d\n",(ans[i]==inf)?-1:ans[i]);
    return 0;
}

B.potato

题意

Solution

Code

#include<bits/stdc++.h>
using namespace std;
inline int read()
{
    int res=0,flag=1;
    char ch=getchar();
    while(!isalnum(ch)) (ch=='-')?flag=-1:1,ch=getchar();
    while(isalnum(ch)) res=res*10+ch-'0',ch=getchar();
    return res*flag;
}
int main(int argc,const char *argv[])
{
    freopen("potato.in","r",stdin);
    freopen("potato.out","w",stdout);
    int n=read();
    long long cnt=0;
    long long a=-INT_MAX,b=INT_MAX,c=-INT_MAX,d=INT_MAX;
    for(int i=1;i<=n;i++)
    {
        long long x=read()+1e9,y=read()+1e9,t=read();
        a=std::max(a,x+y+t);
        b=std::min(b,x+y-t);
        c=std::max(c,x-y+t);
        d=std::min(d,x-y-t);
    }
    printf("%.8f",(double)std::max(a-b,c-d)/2);
    return 0;
}

C.seq

题意

Solution

Code

#include<bits/stdc++.h>
inline int read()
{
    int res=0,flag=1;
    char ch=getchar();
    while(!isalnum(ch)) (ch=='-')?flag=-1:1,ch=getchar();
    while(isalnum(ch)) res=res*10+ch-'0',ch=getchar();
    return res*flag;
}
const int inf=INT_MAX;
struct postion
{
    int x,fr,to;
    int opt,id;
};
struct node
{
    int val,tag;
    int lson,rson;
    node(){val=tag=-1;}
}; 
int n,m,cnt,tot=1,root=1;
int ans[80010],fa[80010],id[80010];
struct node nd[4000010];
struct postion pos[300010];
std::set<int> set[80010];
std::vector<int> son[80010];
void pushdown(int id)
{
    if(nd[id].tag==-1)
        return ;
    nd[nd[id].lson].tag=nd[id].tag;
    nd[nd[id].lson].val=nd[id].tag;
    nd[nd[id].rson].tag=nd[id].tag;
    nd[nd[id].rson].val=nd[id].tag;
    nd[id].tag=-1;
    return ;
}
void modify(long long left,long long right,int &id,int start,int end,int val)
{
    //std::cout<<left<<" "<<right<<" "<<id<<" "<<start<<" "<<end<<" "<<val<<std::endl;
    if(end<left||right<start) return ;
    if(id==0) id=++tot;
    if(start<=left&&right<=end)
    {
        nd[id].val=nd[id].tag=val;
        return ;
    }
    long long mid=(left+right)>>1;
    pushdown(id);
    modify(left,mid,nd[id].lson,start,end,val);
    modify(mid+1,right,nd[id].rson,start,end,val);
    return ;
}
int query(long long left,long long right,int &id,int pos)
{
    //std::cout<<left<<" "<<right<<" "<<id<<" "<<pos<<std::endl; 
    if(id==0) return -1;
    if(left==right) return nd[id].val;
    long long mid=(left+right)>>1,ans=0;
    pushdown(id);
    if(pos<=mid) ans=query(left,mid,nd[id].lson,pos);
    else ans=query(mid+1,right,nd[id].rson,pos);
    if(ans==-1) return nd[id].val;
    else return ans;
}
void solve(int fr)
{
    id[fr]=fr;
    int max=fr;
    for(auto to:son[fr])
    {
        solve(to);
        if(set[id[to]].size()>set[id[max]].size())
            max=to;
    }
    std::swap(id[fr],id[max]);
    for(auto i:son[fr])
        for(auto j:set[id[i]])
            set[id[fr]].insert(j);
    ans[fr]=set[id[fr]].size();
    return ;
}
int main(int argc,const char *argv[])
{
    freopen("colorful.in","r",stdin);
    freopen("colorful.out","w",stdout);
    n=read(),m=read();
    for(int i=1;i<=n;i++)
    {
        int a=read(),b=read(),c=read(),d=read();
        pos[++cnt]=(postion){a,b,d,-1,i};
        pos[++cnt]=(postion){c,b,d,1,i};
    }
    for(int i=1;i<=m;i++)
    {
        int x=read(),y=read(),c=read();
        pos[++cnt]=(postion){x,y,y,0,c};
    }
    std::sort(pos+1,pos+cnt+1,[](struct postion a,struct postion b){return (a.x==b.x)?a.opt<b.opt:a.x<b.x;});
    for(int i=1;i<=cnt;i++)
    {
        //std::cerr<<"solve:"<<pos[i].opt<<" "<<pos[i].x<<" "<<pos[i].fr<<" "<<pos[i].to<<" "<<pos[i].id<<std::endl;
        if(pos[i].opt==-1)
        {
            fa[pos[i].id]=query(1,inf,root,pos[i].fr);
            if(fa[pos[i].id]==-1) fa[pos[i].id]=0;
            //std::cout<<"merge:"<<pos[i].id<<" "<<fa[pos[i].id]<<std::endl;
            son[fa[pos[i].id]].push_back(pos[i].id);
            modify(1,inf,root,pos[i].fr,pos[i].to,pos[i].id);
        }
        if(pos[i].opt==0)
        {
            int res=query(1,inf,root,pos[i].fr);
            if(res!=-1) set[res].insert(pos[i].id);
                //std::cout<<res<<" "<<pos[i].id<<std::endl;
        }
        if(pos[i].opt==1)
            modify(1,inf,root,pos[i].fr,pos[i].to,fa[pos[i].id]);
    }
    solve(0);
    for(int i=1;i<=n;i++)
        printf("%d\n",ans[i]);
    return 0;
}

D.114514

题意

Solution

Code

result

posted @ 2023-11-08 19:23  Che_001  阅读(16)  评论(0)    收藏  举报  来源