POJ 2886 Who Gets the Most Candies?

来源:互联网 发布:电脑网络接口类型 编辑:程序博客网 时间:2024/05/20 22:29

线段树 + 反素数。写的很挫。。。不过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 500006int n, k;char a[N][100];int b[N];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;}


0 0
原创粉丝点击