codeforces 173E 組隊 線段樹 離線

2021-07-26 02:53:20 字數 1623 閱讀 5952

bsny所在的精靈社群有n個居民,每個居民有一定的地位和年齡,ri表示第i個人的地位,ai表示第i個人的年齡。

最近社群裡要舉行活動,要求幾個人分成乙個小組,小組中必須要有乙個隊長,要成為隊長有這樣的條件:

1、隊長在小組中的地位應該是最高的(可以並列第一);

2、小組中其他成員的年齡和隊長的年齡差距不能超過k。

有些人想和自己親密的人組在同乙個小組,同時希望所在的小組人越多越好。比如x和y想在同乙個小組,同時希望它們所在的小組人越多越好,當然,它們也必須選乙個符合上述要求的隊長,那麼問你,要同時包含x和y的小組,最多可以組多少人?

n<=

100000,a

,r<=109

可以先預處理出所有人當隊長時的隊伍最多有多少人,那麼可以把每個人按照低位排序然後用線段樹維護年齡即可完成。

然後對於乙個詢問x y,若乙個人i能當x,y的隊長必然滿足r[i]>=max(r[x],r[y])且abs(a[i]-a[x]),abs(a[i]-a[y])<=k

那麼我們可以離線處理,把每個詢問按照max(r[x],r[y])排序,然後用線段樹維護區間最大值即可。

#include

#include

#include

#include

#include

#define n 100005

#define maxn 1000000000

using namespace std;

int n,m,q,sz,root,gro[n],r[n],a[n];

struct peoplepeo[n];

struct queryq[n];

struct treet[n*30];

intread()

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

return

x*f;

}bool cmpr(people a,people b)

int find(int d,int l,int r,int

x,int

y)void ins1(int &d,int l,int r,int

x,int

y) t[d].s=max(t[d].s,y);

if (l==r) return;

int mid=(l+r)/2;

if (x

<=mid) ins1(t[d].l,l,mid,x,y);

else ins1(t[d].r,mid+1,r,x,y);

}int query(int d,int l,int r,int

x,int

y)int main()

q=read();

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

sort(q+1,q+q+1,cmpval);

int now1=n,now2=q;

sz=root=0;

while (now2>0)

while (now2>0&&(q[now2].val>peo[now1].r||!now1))

}sort(q+1,q+q+1,cmpid);

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

return

0;}

Codeforces 976E 題解報告

1 當把所有的倍數2 a都加到同一health上,health增加的最多 2 先計算每乙個creature的hp dmg,按該值對所有的creature排序 再求和,i include using namespace std const int n 200 1000 9 int hp n dmg n...

codeforces 1030E 暴力 思維)

題目 題意 給定一些數,可將區間 l r 中某些數的二進位制位的1的位置更換,使得最終區間所有數異或和為0,求這樣的區間個數。思路 在那裡瞎dp了好久,wa的很徹底,借鑑了一下別人的思路。區間合法的條件是 這個區間1的個數為偶數,並且區間中二進位制位1最多的乙個數的二進位制個數小於等於和的一半。我們...

Codeforces 1270E 構造 數學

有 n 個二維平面上的點,每兩個點之間連一條線段,將這些點劃分為兩個非空的集合 a b 同乙個集合內的兩點之間線段用黃色標註,不同集合的兩點之間線段用藍色標註,使距離相同的線段顏色相同。先將所有點的座標以其中乙個點作為原點轉化一下,使其中必定有乙個點是 0,0 然後將所有點按奇偶分為四組 0代表偶數...