蒟蒻需要奆佬的帮助
查看原帖
蒟蒻需要奆佬的帮助
455490
Sharpsmile楼主2022/1/20 14:16

rt

调了一上午了只过了个普通版,到加强这里就只有44了QAQ

//#include <bits/stdc++.h>
#include <iostream>
#include <cstdio>
#include <math.h>
#include <algorithm>
#include <istream>
#include <string>
#include <queue>
#include <deque>
#include <stack>
#include <set>
#include <string.h>
#include <map>
#include <unordered_map>
#include <bitset>
#define int long long
#define double long double
#define ild inline void
#define ill inline bool
#define ilt inline int
#define ilc inline char
#define ils inline string
#define ildo inline double
#define mem0(a) memset(a,0,sizeof(a))
#define memf(a) memset(a,0x3f,sizeof(a))
#define mem_f(a) memset(a,-0x3f,sizeof(a))
#define mem_1(a) memset(a,-1,sizeof(a))
#define pb(a,b) a.push_back(b)
#define pp(a,b) a.push_pront(b)
#define mp(a,b) make_pair(a,b)
#define p1(x) x.first
#define p2(x) x.second
#define lc(x) fhq[x].lc
#define rc(x) fhq[x].rc
#define enter putchar('\n')
#define space putchar(' ')
#define inl(x) x^=lastans
using namespace std;
ild re(int &x){
    x=0;
    int w=getchar();
    bool p=0;
    while(w<'0'||w>'9')p^=w=='-',w=getchar();
    while(w<='9'&&w>='0')x=(x<<3)+(x<<1)+w-'0',w=getchar();
    if(p)x=-x;
}
ild re(int &x1,int &x2){re(x1),re(x2);}
ild re(int &x1,int &x2,int &x3){re(x1),re(x2),re(x3);}
ild re(int &x1,int &x2,int &x3,int &x4){re(x1),re(x2),re(x3),re(x4);}
ild re(int &x1,int &x2,int &x3,int &x4,int &x5){re(x1),re(x2),re(x3),re(x4),re(x5);}
ild wr(int x){
    if(x<0)putchar('-'),x=-x;
    if(x>9)wr(x/10);
    putchar(x%10+'0');
}
struct subway{int u,v,p,q;}s[1000300];
ill cmp(subway x,subway y){
    return x.p!=y.p?x.p<y.p:x.q<y.q;
}
struct dat{int ti,c,id;
    bool operator <(const dat &x)const{
        return x.ti<ti;
    }
};
struct node{int x,y;
    
};
vector<dat>dp[100030];
vector<node>da[100300];
priority_queue<dat>ukev[100300];
int rl[100030];
struct stk{vector<int>t;
    int hd;
    ild push(int x){pb(t,x);}
    ild pop(){t.pop_back();}
    ilt siz(){return t.size()-hd;}
    ill empty(){return siz()<=0;}
}st[100030];
int n,m;
int A,B,C;
inline pair<double,int> sl(int v,int a,int b){
    if(da[v][a].x==da[v][b].x)return mp(0,-9999999999999999ll);
    return mp((double)(da[v][a].y-da[v][b].y)/(da[v][a].x-da[v][b].x),0);}
ild ins(int v,int loc){
while(st[v].siz()>=2  ){
    auto k1=sl(v,loc,st[v].t[st[v].t.size()-1]),k2=sl(v,st[v].t[st[v].t.size()-1],st[v].t[st[v].t.size()-2]);
    auto e1=p1(k1)?p1(k1):p2(k1),e2=p1(k2)?p1(k2):p2(k2);
    if(e1<e2)break;
    st[v].pop();
}
    st[v].push(loc);
}
ilt gt(int v,int k){
    if(st[v].empty())return -1;
    while(st[v].siz()>=2){
        pair<double ,int>g=sl(v,st[v].hd,st[v].hd+1);
        auto e=p1(g)?p1(g):p2(g);
        if(e>k) break;
        st[v].hd++;}
    return st[v].t[st[v].hd];
}
signed main() {
    freopen("/Users/noip2019/Desktop/ZZZZZZZZZZZZCW/CW‘s\ code/CW‘s\ code/datain.in","r",stdin);
    re(n,m,A,B,C);
    for(int i=1;i<=m;i++)re(s[i].u,s[i].v,s[i].p,s[i].q);
    sort(s+1,s+m+1,cmp);
    dp[1].push_back({0,0});
    da[1].push_back({0,0});
    ukev[1].push({0,0,0});
    for(int i=1;i<=m;i++){
        int u=s[i].u,v=s[i].v,p=s[i].p,q=s[i].q;
        while(!ukev[u].empty()&&ukev[u].top().ti<=p){
            
            ins(u,ukev[u].top().id);ukev[u].pop();
        }
        int k=2*A*p;
        int j=gt(u,k);
        if(j==-1) continue;
        int x=q;
        int b=da[u][j].y-k*da[u][j].x;
         int y=(b+A*p*p+B*p+C+q)+A*q*q-B*q-q;
        dp[v].push_back({q,b+A*p*p+B*p+C+q});
        da[v].push_back({x,y});
        ukev[v].push({q,b+A*p*p+B*p+C+q,(int)da[v].size()-1});
    }
    int ans=99999999999999999ll;
    for(int i=0;i<dp[n].size();i++){
        ans=min(dp[n][i].c,ans);
      
    }
    cout<<ans;
    return 0;
}

2022/1/20 14:16
加载中...