关于too short on line 1
查看原帖
关于too short on line 1
401052
Endline楼主2022/2/12 13:36

rt,本地测试无误,显示"too short on line 1"

code:

#include<bits/stdc++.h>
#define MAXN 200002
#define ls(x) x<<1
#define rs(x) x<<1|1
#define int long long
using namespace std;
namespace FastIO
{
    char ibuf[(1<<20)+1],*iS,*iT;
	#if ONLINE_JUDGE
	#define gh() (iS==iT?iT=(iS=ibuf)+fread(ibuf,1,(1<<20)+1,stdin),(iS==iT?EOF:*iS++):*iS++)
 	#else
	#define gh() getchar()
	#endif
	#define reg register
	inline long long read(){
		reg char ch=gh();
		reg long long x=0;
		reg char t=0;
		while(ch<'0'||ch>'9')   t|=ch=='-',ch=gh();
		while(ch>='0'&&ch<='9') x=x*10+(ch^48),ch=gh();
		return t?-x:x;
	}
}
using FastIO::read;
int n,m;
int head[MAXN],to[MAXN],nxt[MAXN],w[MAXN],cnt;
int siz[MAXN],son[MAXN],top[MAXN],val[MAXN],fa[MAXN],dfn[MAXN],dep[MAXN],num;
int a[MAXN<<2],sum[MAXN<<2],maxx[MAXN<<2],minn[MAXN<<2];
bool tag[MAXN<<2];
struct edge{
    int from,to;
}e[MAXN];
void add_edge(int x,int y,int val)
{
    to[++cnt]=y;
    w[cnt]=val;
    nxt[cnt]=head[x];
    head[x]=cnt;
}
void dfs1(int u)
{
    siz[u]=1;
    son[u]=-1;
    for(int i=head[u];i;i=nxt[i])
    {
        int v=to[i];
        if(v==fa[u])continue;
        fa[v]=u;
        dep[v]=dep[u]+1;
        dfs1(v);
        siz[u]+=siz[v];
        val[v]=w[i];
        if(son[u]==-1||siz[v]>siz[son[u]])son[u]=v;
    }
    return;
}
void dfs2(int u,int topn)
{
    top[u]=topn;
    dfn[u]=++num;
    a[num]=val[u];
    if(son[u]==-1)return;
    dfs2(son[u],topn);
    for(int i=head[u];i;i=nxt[i])
    {
        int v=to[i];
        if(v==fa[u]||v==son[u])continue;
        dfs2(v,v);
    }
    return;
}
void push_up(int p)
{
    sum[p]=sum[ls(p)]+sum[rs(p)];
    maxx[p]=max(maxx[ls(p)],maxx[rs(p)]);
    minn[p]=min(minn[ls(p)],minn[rs(p)]);
    return;
}
void push_down(int p)
{
    if(tag[p])
    {
        sum[ls(p)]=-sum[ls(p)];
        swap(minn[ls(p)],maxx[ls(p)]);
        minn[ls(p)]=-minn[ls(p)];
        maxx[ls(p)]=-maxx[ls(p)];
        tag[ls(p)]=tag[p];

        sum[rs(p)]=-sum[rs(p)];
        swap(minn[rs(p)],maxx[rs(p)]);
        minn[rs(p)]=-minn[rs(p)];
        maxx[rs(p)]=-maxx[rs(p)];
        tag[rs(p)]=tag[p];

        tag[p]=false;
    }
    return;
}
void build(int l,int r,int p)
{
    if(l==r)
    {
        sum[p]=maxx[p]=minn[p]=a[l];
        return;
    }
    int mid=(l+r)>>1;
    build(l,mid,ls(p));build(mid+1,r,rs(p));
    push_up(p);
    return;
}
void update(int l,int r,int s,int t,int p)
{
    if(s>=l&&t<=r)
    {
        sum[p]=-sum[p];
        swap(minn[p],maxx[p]);
        minn[p]=-minn[p];
        maxx[p]=-maxx[p];
        tag[p]=!tag[p];
        return;
    }
    push_down(p);
    int mid=(s+t)>>1;
    if(mid>=l)update(l,r,s,mid,ls(p));
    if(mid<r)update(l,r,mid+1,t,rs(p));
    push_up(p);
    return;
}
void change(int goal,int s,int t,int p,int k)
{
    if(s==t&&s==goal)
    {
        sum[p]=maxx[p]=minn[p]=k;
        return;
    }
    int mid=(s+t)>>1;
    if(mid>=goal)change(goal,s,mid,ls(p),k);
    if(mid<goal)change(goal,mid+1,t,rs(p),k);
    push_up(p);
    return;
}
int query_sum(int l,int r,int s,int t,int p)
{
    if(s>=l&&t<=r)
        return sum[p];
    push_down(p);
    int mid=(s+t)>>1,res=0;
    if(mid>=l)res+=query_sum(l,r,s,mid,ls(p));
    if(mid<r)res+=query_sum(l,r,mid+1,t,rs(p));
    return res;
}
int query_max(int l,int r,int s,int t,int p)
{
    if(s>=l&&t<=r)
        return maxx[p];
    push_down(p);
    int mid=(s+t)>>1,res=-114514;
    if(mid>=l)res=max(res,query_max(l,r,s,mid,ls(p)));
    if(mid<r)res=max(res,query_max(l,r,mid+1,t,rs(p)));
    return res;
}
int query_min(int l,int r,int s,int t,int p)
{
    if(s>=l&&t<=r)
        return minn[p];
    push_down(p);
    int mid=(s+t)>>1,res=114514;
    if(mid>=l)res=min(res,query_min(l,r,s,mid,ls(p)));
    if(mid<r)res=min(res,query_min(l,r,mid+1,t,rs(p)));
    return res;
}
void upd_range(int u,int v)
{
    while(top[u]!=top[v])
    {
        if(dep[top[u]]<dep[top[v]])swap(u,v);
        update(dfn[top[u]],dfn[u],1,n,1);
        u=fa[top[u]];
    }
    if(dep[u]>dep[v])swap(u,v);
    update(dfn[u]+1,dfn[v],1,n,1);
    return;
}
int query_sum_range(int u,int v)
{
    int sum=0;
    while(top[u]!=top[v])
    {
        if(dep[top[u]]<dep[top[v]])swap(u,v);
        sum+=query_sum(dfn[top[u]],dfn[u],1,n,1);
        u=fa[top[u]];
    }
    if(dep[u]>dep[v])swap(u,v);
    if(u!=v)sum+=query_sum(dfn[u]+1,dfn[v],1,n,1);
    return sum;
}
int query_max_range(int u,int v)
{
    int res=-1919810;
    while(top[u]!=top[v])
    {
        if(dep[top[u]]<dep[top[v]])swap(u,v);
        res=max(res,query_max(dfn[top[u]],dfn[u],1,n,1));
        u=fa[top[u]];
    }
    if(dep[u]>dep[v])swap(u,v);
    if(u!=v)res=max(res,query_max(dfn[u]+1,dfn[v],1,n,1));
    return res;
}
int query_min_range(int u,int v)
{
    int res=1919810;
    while(top[u]!=top[v])
    {
        if(dep[top[u]]<dep[top[v]])swap(u,v);
        res=min(res,query_min(dfn[top[u]],dfn[u],1,n,1));
        u=fa[top[u]];
    }
    if(dep[u]>dep[v])swap(u,v);
    if(u!=v)res=min(res,query_min(dfn[u]+1,dfn[v],1,n,1));
    return res;
}
signed main()
{
    // freopen("P1505_1.in","r",stdin);
    // freopen("P1505.out","w",stdout);
    n=read();
    for(int i=1;i<n;i++)
    {
        int u=read(),v=read(),w=read();
        u++,v++;
        add_edge(u,v,w);add_edge(v,u,w);
        e[i].from=u,e[i].to=v;
    }
    dfs1(1);
    dfs2(1,1);
    build(1,n,1);
    m=read();
    for(int i=1;i<=m;i++)
    {
        string str;
        cin>>str;
        int u=read(),v=read();
        if(str=="C")
        {
            int tmp;
            if(dep[e[u].from]>dep[e[u].to])tmp=e[u].from;
            else tmp=e[u].to;
            change(dfn[tmp],1,n,1,v);
        }
        if(str=="N")
        {
            u++,v++;
            upd_range(u,v);
        }
        if(str=="SUM")
        {
            u++,v++;
            cout<<query_sum_range(u,v)<<endl;
        }
        if(str=="MAX")
        {
            u++,v++;
            cout<<query_max_range(u,v)<<endl;
        }
        if(str=="MIN")
        {
            u++,v++;
            cout<<query_min_range(u,v)<<endl;
        }
    }
    system("pause");
    return 0;
}   
2022/2/12 13:36
加载中...