NOI2017模擬4 2 查詢 線段樹

2021-07-30 04:37:14 字數 1428 閱讀 4356

給出若干條線段,用(x1,y1),(x2,y2)表示其兩端點座標,現在要求支援兩種操作:

0 x1 y1 x2 y2

表示加入一條新的線段,(x1,y1)-(x2,y2)

1 x0

詢問所有線段中,x座標在x0處的最高點的y座標是什麼,如果對應位置沒有線段,則輸出0。o(

nlog

2n) 的

#include

#include

#include

#include

#include

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

using namespace std;

const int maxn=2e5+7,mxx=1e6+maxn,inf=0x7fffffff;

typedef double db;

struct nodt[mxx*4];

int i,j,k,l,n,m,num,x,y,xx,yy,ha,da;

bool bz[maxn];

db ans,kk,o,yi,er;

void change(int

x,int l,int r,int

y,int z,db p,db q)

if(l==r||(db)(t[x].p-p)*(t[x].p+(r-l)*t[x].q-p-(r-l)*q)>0.0)

int mid=(l+r)/2;

yi=(db)t[x].p+(mid-l)*t[x].q;

er=(db)p+(mid-l)*q;

if((t[x].p-p)*(yi-er)>0)

else

}else

else

}return;

}int mid=(l+r)/2;

if(z<=mid)change(x

*2,l,mid,y,z,p,q);

else

if(y>mid)change(x

*2+1,mid+1,r,y,z,p,q);

else

}void find(int

x,int l,int r,int

y) int mid=(l+r)/2;

if(y

<=mid)find(x

*2,l,mid,y);

else find(x

*2+1,mid+1,r,y);

}int main()

fo(i,1,m)

x+=da,xx+=da;ha=x;

if(xx==x)kk=inf;else kk=(db)(yy-y)/(xx-x);

if(kk==inf)y=yy,kk=0;

change(1,1,2

*da,x,xx,y,kk);

}else

}}

noi2017 整數 線段樹or模擬

orzyyb 題目大意 你需要維護乙個有 3 times 10 7 個二進位制位的數,有一種修改方式和一種詢問方式 對這個數加上 a times2 b 其中 a 10 9 b 3 times 10 7 保證需要維護的這個數始終非負 詢問這個數第k個二進位制位的值 總共有 10 6 次詢問 修改操作 ...

noi2017 整數 線段樹or模擬

orzyyb 題目大意 你需要維護乙個有 3 times 10 7 個二進位制位的數,有一種修改方式和一種詢問方式 對這個數加上 a times2 b 其中 a 10 9 b 3 times 10 7 保證需要維護的這個數始終非負 詢問這個數第k個二進位制位的值 總共有 10 6 次詢問 修改操作 ...

NOI2017模擬6 29 呵呵

考慮乙個特定形態的樹的貢獻,設點i的度數為d i 那麼答案就是 wdii?di 考慮prufer序,乙個度數為d i 的點出現的次數是d i 1,那麼就可以得到乙個很顯然的dp,f i j 表示前i個點的度數為i j fi,j d 0jfi?1,j?d?dn?2?j?d wd 1i?d 1 這個dp...