給出若干條線段,用(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...