CodeForces 551E 二分查詢

2021-08-21 18:03:59 字數 1348 閱讀 4801

題目鏈結

題目大意

給乙個數量級為5*10^5的long long陣列,進行5*10^4次操作,操作分為兩種:

1、令序號在【l,r】區間的數值增加x

2、找到陣列內等於y值的兩個數的最大距離

主要思想

分塊+二分查詢

每sqrt(n)個數分一組

**塊:

# include

using namespace std;

const int maxn=5*1e5+10;

int n, q;

long long a[maxn], b[maxn];

int block, t;///每個資料塊的個數及資料塊的總量

int l[maxn], r[maxn];///記錄每個分區間的左右序號

long long add[maxn];

void init(int data)

void change(int l, int r, long long x)/*首先看要修改的區間是否在乙個資料塊中,如果在暴力維護;

否則先暴力維護左右兩邊不完整的資料塊,其次維護中間完整的資料塊,把每塊資料所要增加的值記錄到

add陣列中;(需要同時維護a、b兩個陣列,並對b陣列進行排序)*/

if(l==l[numl])///如果要修改的區間的左邊界剛好等於整個區間所在資料塊的左資料塊的左邊界

l=numl;

else///否則維護左邊不完整的資料塊

if(r==r[numr])

r=numr;

else

for(int i=l;i<=r;i++)

add[i]+=x;

} int find(int l, int r, long long x)///二分查詢,乾貨

return -1;

} int query(long long y) }

break;///按照資料塊序號查詢,找到即退出,找到最左邊的key值所在序號

} for(int i=t;i>=1;i--)///從右往左找 }

break;

} if(ansl>ansr)return -1;

return ansr-ansl;

} int main()

r[t]=n;

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

init(i);

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

else if(data==2) }

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