POJ 2886 Who Gets the Most Candies?
2014-04-25 10:18
176 查看
线段树 + 反素数。写的很挫。。。不过1A,嘿嘿。
#include <cstdio> #include <iostream> #include <cstring> #include <algorithm> #include <cmath> using namespace std; #define lson l, m, rt << 1 #define rson m + 1, r, rt << 1 | 1 #define N 500006 int n, k; char a [100]; int b ; int pri[20] = {2, 3, 5, 7, 11, 13, 17, 23, 29}; __int64 bestnum; __int64 bestsum; int id; void getNum(__int64 num, __int64 k, __int64 sum){ if(num > n)return ; if(sum > bestsum){ bestsum = sum; bestnum = num; } else if(sum == bestsum && num < bestnum){ bestnum = num; } if(k > 7)return ; for(int i = 1; num <= n; i++){ num *= pri[k]; getNum(num, k + 1, sum * (i + 1)); } } int s[N << 2]; void build(int l, int r, int rt){ s[rt] = r - l + 1; if(l == r)return ; int m = (l + r) >> 1; build(lson); build(rson); } void query(int d, int l, int r, int rt){ if(l == r){id = l; return;} int m = (l + r) >> 1; if(s[rt << 1] >= d)query(d, lson); else query(d - s[rt << 1], rson); } int position(int d, int l, int r, int rt){ if(l == r)return s[rt]; int m = (l + r) >> 1; if(d <= m)return position(d, lson); else return s[rt << 1] + position(d, rson); } void dec(int d, int l, int r, int rt){ s[rt]--; if(l == r) return ; int m = (l + r) >> 1; if(d <= m)dec(d, lson); else dec(d, rson); } int main(){ while(scanf("%d%d", &n, &k) != EOF){ getNum(1, 0, 1); for(int i = 1; i <= n; i++){ scanf("%s%d", a[i], &b[i]); } build(1, n, 1); int p = k; int v = k; for(int i = 1; i < bestnum; i++){ dec(p, 1, n, 1); if(b[p] > 0)b[p] += v - 1; else b[p] += v; b[p] %= s[1]; if(b[p] <= 0)b[p] += s[1]; query(b[p], 1, n, 1); p = id; v = position(p, 1, n, 1); } printf("%s %I64d\n", a[id], bestsum); } return 0; }
相关文章推荐
- poj 2886 Who Gets the Most Candies?
- poj 2886 Who Gets the Most Candies?
- POJ 2886 Who Gets the Most Candies? 单点更新
- (中等) POJ 2886 Who Gets the Most Candies? , 反素数+线段树。
- POJ 2886 Who Gets the Most Candies?
- POJ2886-Who Gets the Most Candies?
- poj 2886 Who Gets the Most Candies? (线段树单点更新应用)
- POJ 2886 Who Gets the Most Candies?【线段树单点更新+反素数打表】【好题】
- POJ 2886 Who Gets the Most Candies?(反素数+线段树)
- poj 2886 Who Gets the Most Candies?
- POJ 2886 Who Gets the Most Candies? (三种姿势点草动态求第k大)
- poj-2886 Who Gets the Most Candies?
- POJ 2886 Who Gets the Most Candies?
- POJ 2886 Who Gets the Most Candies?(单点更新 + 约瑟夫环)
- POJ 2886 Who Gets the Most Candies?(树状数组+二分)
- POJ - 2886 Who Gets the Most Candies? (反素数+线段树)
- poj 2886 Who Gets the Most Candies?(线段树-单点更新)
- POJ 2886 - Who Gets the Most Candies?
- poj 2886 Who Gets the Most Candies?
- POJ 2886 Who Gets the Most Candies? 线段树