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代表偶數...