線段樹題集

2022-05-24 08:48:09 字數 1545 閱讀 4309

poj - 2886 

反素數 + 線段樹

題意:有n個人圍成一圈,遊戲的起點是k,每個人持有乙個數字(非編號)num,每次當前的人退出圈,下乙個人是他左邊的第num個(也就是說下乙個退出的是k+num, k可以為負數,表示右邊的第num個), 現在一直如果乙個人是第i個推出的,那麼他的得分就是i的因數的個數,球得分最高的那個人的編號

題解:先求出小於等於n的裡面所有的數字裡面應該獲得最高分的那個出圈id,按照區間人數建立線段樹,依次出圈

#include#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

using

namespace

std;

#define inf 0x3f3f3f3f3f3f3f3f

#define inf 0x3f3f3f3f

#define eps 1e-4

#define bug printf("*********\n")

#define debug(x) cout<

long

long

ll;typedef

long

long

ll;const

int maxn = 5e5 + 5

;int p[16] = ;

intans,n;

intbest;

void dfs(int dept,int tmp,int

num)

//當因子個數相同時,取值最小的

if (num == best && ans > tmp) ans =tmp;

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

}int a[maxn],num[maxn],st[maxn << 2

];char name[maxn][20

];void build(int o, int l, int

r) }

int query(int pos,int o,int l,int

r)

return

ans;

}int solve(int

x)

else

if(x % i == 0

) ans += 1

; }

return

ans;

}int

main()

build(

1, 1

, n);

intret;

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

printf(

"%s %d\n

",name[ret],solve(ans));

}return0;

}

view code

線段樹 題集

扶蘇學長給我們講了線段樹 樹狀陣列 主席樹等資料結構 並發布了練習題單 題目 a 只需將maketag函式更改為異或和即可 然後tag的更新方式更改 include include include using namespace std const long long k 5e5 5 long lo...

線段樹 模板題

problem description 已知乙個數列,你需要進行下面兩種操作 1.將某區間每乙個數加上x 2.求出某區間每乙個數的和 input 第一行包含兩個整數n m,分別表示該數列數字的個數和操作的總個數。第二行包含n個用空格分隔的整數,其中第i個數字表示數列第i項的初始值。接下來m行每行包含...

線段樹(模板題)

對於一條數鏈,二分,然後二分,然後再二分 給定一數列,規定有兩種操作,一是修改某個元素,二是求區間的連續和。數列元素初始化為0 輸入 輸入資料第一行包含兩個正整數n,m n 100000,m 500000 以下是m行,每行有三個正整數k,a,b k 0或1,a,b n k 0時表示將a處數字加上b,...