BZOJ 3938 Robot(超哥線段樹)

2021-08-15 23:03:27 字數 2425 閱讀 3116

題目大意:一條數軸上有n個機械人,對其進行m次操作。操作t_i commond k_i x_i (1≤k_i≤n)表示ti時刻將第ki個機械人的速度變為正方向上xi格每秒;操作t_i query則是詢問ti時刻離原點最遠的機械人到原點的距離(t1≤t2≤t3≤…≤tm,若同一時間發生多次操作,則按讀入順序依次執行)

題解:以時間為x軸,位置座標為y軸,commond操作相當於在其中加入一段直線,query操作就是詢問某一橫座標對應的y的最大值或最小值的絕對值。離散時間建兩棵線段樹,分別維護最上方和最下方的線段。超哥線段樹簡單題。

code(第一棵超哥線段樹,**參考大神咯t^t,加了一點注釋,算是我自己對超哥線段樹(標記永久化?)的理解)

#include

#include

#include

#include

#include

#define n 600005

using namespace std;

inline int

read()

while (c>='0'&&c<='9')

return num*f;

}inline long long readl()

while (c>='0'&&c<='9')

return num*f;

}struct optq[n];

long long tagk[n<<2],tagb[n<<2],tagk[n<<2],tagb[n<<2];

long long nowk[100005],nowb[100005],b[n],ans1,ans2;

int a[100005],n,m,cnt,num;

bool flag[n<<2],flag[n<<2];

double cross(long long k1,long long b1,long long k2,long long b2) //求兩條直線(斜截式)的交點的橫座標

void ins_mx(int now,int l,int r,int l,int r,long long b,long long k) //維護最上方的直線

long long f1=b+k*b[l],f2=tagb[now]+tagk[now]*b[l]; //新插入直線和當前覆蓋該區間的直線的左端點的值

long long f3=b+k*b[r],f4=tagb[now]+tagk[now]*b[r]; //新插入直線和當前覆蓋該區間的直線的右端點的值

if (f1<=f2&&f3<=f4) return; //新直線完全在當前直線之下,丟棄

if (f1>=f2&&f3>=f4) //新直線完全在當前直線之上,替換

double xx=cross(k,b,tagk[now],tagb[now]);

if (f1>=f2) //交點左側新直線更高,右側當前直線更高

else /*同理*/

return;

}if (l<=mid) ins_mx(now<<1,l,mid,l,r,b,k);

if (r>mid) ins_mx(now<<1|1,mid+1,r,l,r,b,k);

}void ins_mn(int now,int l,int r,int l,int r,long long b,long long k)

long long f1=b+k*b[l],f2=tagb[now]+tagk[now]*b[l];

long long f3=b+k*b[r],f4=tagb[now]+tagk[now]*b[r];

if (f1>=f2&&f3>=f4) return;

if (f1<=f2&&f3<=f4)

double xx=cross(k,b,tagk[now],tagb[now]);

if (f1<=f2)

else

return;

}if (l<=mid) ins_mn(now<<1,l,mid,l,r,b,k);

if (r>mid) ins_mn(now<<1|1,mid+1,r,l,r,b,k);

}void query_mx(int now,int l,int r,int

pos) //查詢最大值

void query_mn(int now,int l,int r,int

pos)

int main()

num=m; b[++num]=0; sort(b+1,b+num+1); cnt=unique(b+1,b+num+1)-b-1;

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

if (q[i].op==1)

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

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

if (q[i].op==0)

return

0;}

bzoj3938 Robot(超哥線段樹)

小q有n只機械人,一開始他把機械人放在了一條數軸上,第i只機械人在ai的位置上靜止,而自己站在原點。在這之後小q會執行一些操作,他想要命令乙個機械人向左或者向右移動x格。但是機械人似乎聽不清小q的命令,事實上它們會以每秒x格的速度勻速移動。看著自己的機械人越走越遠,小q很著急,他想知道當前離他 原點...

bzoj3280 小R的煩惱

description 小r最近遇上了 煩,他的程式設計掛科了。於是他只好找程設老師求情。善良的程設老師答應不掛他,但是要求小r幫助他一起解決乙個難題。問題是這樣的,程設老師最近要進行一項 的實驗來證明p np,這個實驗一共持續n天,第i天需要a i 個研究生來給他搬磚。研究生畢竟也是人,所以僱傭研...

bzoj 3280 小R的煩惱

題意 n天,m個學校,k個醫院。每天需要a i 個人,這a i 個人工作後處於瀕死狀態,你可以選擇把瀕死狀態的人送去醫院,治好後還可以繼續工作。每個醫院i救治乙個人需要d i 天,費用q i 元。學校 i 中乙個人工作一天薪酬為p i 思路 時間為乙個天然序,第i天的決策為從健康的人中選擇a i 個...