poj - 2886
反素數 + 線段樹
題意:有n個人圍成一圈,遊戲的起點是k,每個人持有乙個數字(非編號)num,每次當前的人退出圈,下乙個人是他左邊的第num個(也就是說下乙個退出的是k+num, k可以為負數,表示右邊的第num個), 現在一直如果乙個人是第i個推出的,那麼他的得分就是i的因數的個數,球得分最高的那個人的編號
題解:先求出小於等於n的裡面所有的數字裡面應該獲得最高分的那個出圈id,按照區間人數建立線段樹,依次出圈
#include#includeview code#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;
}
線段樹 題集
扶蘇學長給我們講了線段樹 樹狀陣列 主席樹等資料結構 並發布了練習題單 題目 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,...