CTSC2016 時空旅行

2022-07-13 19:18:12 字數 1960 閱讀 4075

鏈結

題解首先要發現答案要我們求這個式子:

\[ans=min\bigl((x_i-x)^2+c_i\bigr)

\]顯而易見的是這種時空嫁接的關係會形成一棵樹。但是我們並不能像\(noi2014\)購票那樣直接在樹上維護一條鏈的棧,因為每個點代表的既有可能是加入乙個點,又有可能是刪除乙個點。

考慮每個點的存在時間都是一些連續區間,所以就可以在尤拉序或者\(dfs\)序上分治了。

至於詢問的方式,我們可以先把線段樹上的每個節點把凸包維護出來,然後用標記永久化的思想進行查詢。

如果空間利用的不當會\(mle\),可以考慮先用棧做凸包,然後再扔進\(vector\)裡做查詢用,這樣可以省空間。

**

#include#include#include#include#include#define ls tr[cnt].l

#define rs tr[cnt].r

#define n 500009

#define inf 1e16

using namespace std;

typedef long long ll;

int tot,head[n],num,val[n],n,sta[n<<1],root,dfn[n],_tag[n],m,totp;

ll ans;

ll c[n];

int pos[n];

struct edgee[n];

inline void add(int u,int v)

struct segtr[n<<1];

struct node;}

inline node operator -(const node &b)const;}

inline ll operator *(const node &b)const

inline bool operator <(const node &b)const

while(isdigit(c))

return f?-x:x;

}inline double getk(node x,node y)

void build(int &cnt,int l,int r)

inline void _query(int cnt,ll x)

ans=min(ans,vec[cnt][now].y-1ll*vec[cnt][now].x*x+x*x);

}void upd(int cnt,int l,int r,int l,int r,int x));return;}

int mid=(l+r)>>1;

if(mid>=l)upd(ls,l,mid,l,r,x);

if(mid1&&(xx-st[tp-1])*(st[tp]-st[tp-1])>=0)tp--;

st[++tp]=xx;

} vec[cnt].clear();

for(int i=1;i<=tp;++i)vec[cnt].push_back(st[i]);

if(l==r)return;

int mid=(l+r)>>1;

solve(tr[cnt].l,l,mid);solve(tr[cnt].r,mid+1,r);

}void query(int cnt,int l,int r,int x,int y)

void work(int tim,int now,int tag)

else

} void dfs(int u)

int main()

else val[i]=-id;

} build(root,1,n);

dfs(0);

for(int i=0;i<=n;++i)

if(sta[i])upd(root,1,n,sta[i],n,i);

solve(root,1,n);

int s;

for(int i=1;i<=m;++i)

return 0;

}

CTSC2016時空旅行

當時看這道題ac的人數比較多,就開了這道題。很容易發現是這是乙個有關凸包的題。然後不知道怎麼維護凸包,一直在想cdq,感覺複雜度不行,於是被這玩意難住了 幸好有親學長yyh造福人類的題解 十分詳細,而且相對容易看懂些,腦迴路跟我差不多。發現主要是我沒學線段樹標記永久化,所以去學了一下這個東西 大概就...

JZOJ4878 時空傳送

給定乙個 n 個點 m條邊的有向無環圖,問刪掉某個點後最長路最小變成多少。data constraint n 7500,m 100000 因為是dag,先考慮構出圖的拓補序。設f i 表示第1層的點到 i 最長路為fi gi 表示最後一層的點到 i 最長路為gi 在原圖中,那麼我們一條邊 u v 對...

BZOJ 3434 Wc2014 時空穿梭

題意 n維座標中要找c個點使得c個點在一條線上且每一維的座標單調遞增且不能超過每一維限定的值m i n 11,2 c 20,m i 100000 include using namespace std const int n 100005,md 10007 int c n 19 g 21 n f 2...