P2305 求调 WA on #3#9#10
  • 板块学术版
  • 楼主Zi_Gao
  • 当前回复0
  • 已保存回复0
  • 发布时间2023/3/7 20:06
  • 上次更新2023/10/23 22:45:17
查看原帖
P2305 求调 WA on #3#9#10
554698
Zi_Gao楼主2023/3/7 20:06

k=3的都错了

#include<cstdio>
#include<cstring>
#include<algorithm>
#include<stack>
// #define ONLINE_JUDGE
// #define int long long
// #define long long long long
#define INPUT_DATA_TYPE long long
#define OUTPUT_DATA_TYPE long long
INPUT_DATA_TYPE read(){register INPUT_DATA_TYPE x=0;register char f=0,c=getchar();while(c<'0'||'9'<c)f=(c=='-'),c=getchar();while('0'<=c&&c<='9')x=(x<<3)+(x<<1)+(c&15),c=getchar();return f?-x:x;}void print(OUTPUT_DATA_TYPE x){register char stack[40];register int i=0;if(x<0){x=-x;putchar('-');}if(x==0){putchar('0');return;}while(x){stack[i++]=x%10;x/=10;}while(i){putchar(stack[--i]+'0');}return;}

struct EDGE{
    int to,next;
    long long w;
    EDGE(){
        next=-1;
        return;
    }
}e[200010];

int tot,path[200010],fir[200010];
long long sum[200010],p[200010],q[200010],l[200010],dp[200010];

void addEdge(int u,int v,long long w){
    e[tot].to=v;
    e[tot].w=w;
    e[tot].next=fir[u];
    fir[u]=tot;
    ++tot;
    return;
}

long long Y(int j){return dp[path[j]];}
long long X(int j){return sum[j];}
long long K(int i){return p[path[i]];}
long long B(int i){return -sum[i]*p[path[i]]-q[path[i]];}
bool checkslope(int a,int b,long long k){return Y(a)-Y(b)>k*(X(a)-X(b));}
// bool check(int a,int b,int c,int d){return ((((__int128)Y(a)-Y(b))*(X(c)-X(d))))<=((((__int128)Y(c)-Y(d))*1.0*(X(a)-X(b))));}
long double slope(int i,int j){return (X(i)-X(j)==0)?(1e9):((Y(i)-Y(j))*1.0/(X(i)-X(j)));}
bool check(int a,int b,int c,int d){return slope(a,b)<slope(c,d);}

struct S_NODE{
    int tail,pos,point;
};

struct BST_NODE{
    int *points,tail;
    std::stack<S_NODE> backs;

    void build(int len){
        points=new int[len+2];
        return;
    }

    BST_NODE(){
        points=NULL;
        return;
    }

    ~BST_NODE(){
        if(points!=NULL) delete(points);
        points=NULL;
        return;
    }

    void back(){
        S_NODE q=backs.top();
        backs.pop();
        points[q.pos]=q.point;
        tail=q.tail;
        return;
    }

    void insert(int i){
        if(tail==0){
            points[++tail]=i;
            backs.push((S_NODE){0,1,0});
        }else{
            register int l=1,r=tail,mid;
            while(l<r){
                mid=(l+r)>>1;
                if(check(points[mid],points[mid+1],points[mid],i)) l=mid+1;
                else r=mid;
            }
            backs.push((S_NODE){tail,l+1,points[l+1]});
            points[l+1]=i;
            tail=l+1;
        }
        return;
    }

    int getPoint(int i){
        register int l=1,r=tail,mid;
        while(l<r){
            mid=(l+r)>>1;
            if(checkslope(points[mid],points[mid+1],K(i))) l=mid+1;
            else r=mid;
        }
        return points[l];
    }
};

struct BST{
    BST_NODE tree[200010];
    int size;

    inline int lowbit(int x){
        return x&-x;
    }

    void insert(register int pos,int point){
        pos=size-pos+1;
        while(pos<=size){
            if(tree[pos].points==NULL)
                tree[pos].build(lowbit(pos));
            tree[pos].insert(point);
            pos+=lowbit(pos);
        }
        return;
    }

    void backto(register int pos){
        pos=size-pos+1;
        while(pos<=size){
            tree[pos].back();
            pos+=lowbit(pos);
        }
        return;
    }

    long long getAns(register int pos,int i){
        long long ans=0x7fffffffffffffffll;
        pos=size-pos+1;
        register int point;
        while(pos){
            if(tree[pos].points!=NULL){
                point=tree[pos].getPoint(i);
                ans=std::min(ans,Y(point)-K(i)*X(point)-B(i));
            }
            pos-=lowbit(pos);
        }
        return ans;
    }
}bit;

// int searchPoint(register int l,register int r,long long k){
//     if(l==r) return l;
//     register int mid;
//     while(l<r){
//         mid=(l+r)>>1;
//         if(checkslope(Q[mid],Q[mid+1],k)) l=mid+1;
//         else r=mid;
//     }

// 	return l;
// }

void dfs(int u,int i){
    register int j,head;
    path[i]=u;
    head=std::lower_bound(sum+1,sum+i,sum[i]-l[u])-sum;
    if(u==1){
        dp[u]=0;
    }else{
        dp[u]=bit.getAns(head,i);
    }

    bit.insert(i,i);

    for(j=fir[u];~j;j=e[j].next){
        sum[i+1]=sum[i]+e[j].w;
        dfs(e[j].to,i+1);
    }

    bit.backto(i);
    return;
}

signed main(){
    // freopen("C:\\Users\\Administrator\\Downloads\\ticket6.in", "r", stdin);
	// freopen("name.out", "w", stdout);
	#ifndef ONLINE_JUDGE
	freopen("name.in", "r", stdin);
	freopen("name.out", "w", stdout);
	#endif

    memset(fir,-1,sizeof(fir));
    register int i,t;
    register long long t2;
    int n=read();
    bit.size=n;
    int T=read();
    for(i=2;i<=n;++i){
        t=read();
        t2=read();
        addEdge(t,i,t2);
        p[i]=read();
        q[i]=read();
        l[i]=read();
    }

    dfs(1,1);

    for(i=2;i<=n;++i){
        print(dp[i]);
        putchar('\n');
    }

	#ifndef ONLINE_JUDGE
	fclose(stdin);
	fclose(stdout);
	#endif
    return 0;
}
2023/3/7 20:06
加载中...