CTSC2016時空旅行

2022-06-03 21:00:10 字數 2076 閱讀 7560

當時看這道題ac的人數比較多,就開了這道題。

很容易發現是這是乙個有關凸包的題。

然後不知道怎麼維護凸包,一直在想cdq,感覺複雜度不行,於是被這玩意難住了……

幸好有親學長yyh造福人類的題解:十分詳細,而且相對容易看懂些,腦迴路跟我差不多。

發現主要是我沒學線段樹標記永久化,所以去學了一下這個東西:

大概就是,為了懶得pushdown,就做乙個標記,每次詢問的時候,拿到這個標記,就直接更新答案……

應用到這道題上,我們發現所有詢問都是單點詢問,就是說會每次都會走到線段樹的最底層。

這樣就有個好處:我們往線段樹的一段區間的凸包加乙個點時,只有走到線段樹上被區間完全包含的點的時候,在這裡的凸包上加點,然後return

中途沒被修改區間完全覆蓋的線段樹上的地方,就不用在凸包上加點。

然後這道題的主要特點是,用了很多排序,讓凸包的優秀性質,最大得發揮。

具體參考學長yyh的題解

bz上又卡常,我是真的卡不過去,yyh的**也要t……

//serene

#include#include#include#include#include#include#includeusing namespace std;

#define ll long long

#define db double

#define for(i,a,b) for(int i=(a);i<=(b);++i)

#define rep(i,a,b) for(int i=(a);i>=(b);--i)

const int maxn=5e5+7;

const ll inf=1e18+7;

ll n,m,c0,ans[maxn];//don't forget the earth

char cc; ll ff;

templatevoid read(t& aa)

int fir[maxn],nxt[maxn],to[maxn],e=0;

void add(int x,int y)

int dfn[maxn],end[maxn],dfn_clock=-1;

void dfs(int pos)

struct plt

plt(ll id,ll x,ll y,ll pos):id(id),x(x),y(y),pos(pos){}

bool operator < (const plt& b) const

}ask[maxn];

struct node

node(ll x,ll y):x(x),y(y){}

}o,d;

struct seg

void push(node x)

void pop()

}seg[4*maxn];

ll ql,qr,qa,qb;

ll get_ans(ll k,ll b,node s)

void get_push(int pos)

seg[pos].push(o);}

void chge(int pos,int l,int r)

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

if(ql<=mid) chge(pos<<1,l,mid);

if(qr>mid) chge(pos<<1|1,mid+1,r);}

void get_insert(int i)

if(ld<=rd) }

#define np seg[pos].p

ll ud_ans(int pos)

return rs;}

ll q(int pos,int l,int r)

int main()

else del[id].push_back(i);

}dfs(0);

sort(plt+1,plt+totp+1);

for(i,1,totp) get_insert(i);

for(i,1,m)

sort(ask+1,ask+m+1);

for(i,1,m)

for(i,1,m) printf("%lld\n",ans[i]);

return 0;

}

CTSC2016 時空旅行

鏈結 題解首先要發現答案要我們求這個式子 ans min bigl x i x 2 c i bigr 顯而易見的是這種時空嫁接的關係會形成一棵樹。但是我們並不能像 noi2014 購票那樣直接在樹上維護一條鏈的棧,因為每個點代表的既有可能是加入乙個點,又有可能是刪除乙個點。考慮每個點的存在時間都是一...

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...