Ural1521-War Games 2
2016-11-22 15:56
351 查看
给定n和k求约瑟夫环中每次出圈的人的编号。
利用树状数组可以得到每个人的相对编号(在他之前有几个人)。
每次通过二分查找找到对应编号出圈的人,然后在他们的编号位置上-1.
利用树状数组可以得到每个人的相对编号(在他之前有几个人)。
每次通过二分查找找到对应编号出圈的人,然后在他们的编号位置上-1.
#include <cstdio> #include <vector> using namespace std; const int maxn = 100000+5; int fw[maxn]; int n, k; inline int lowbit(int x) { return x & -x; } void add(int x, int delta) { for (int i = x; i <= n; i += lowbit(i)) { fw[i] += delta; } } int sum(int x) { int ret = 0; for (int i = x; i > 0; i -= lowbit(i)) { ret += fw[i]; } return ret; } int search(int x) { int lb = 1, ub = n; while (lb < ub) { int mid = (lb + ub) / 2; if (sum(mid) >= x) { ub = mid; } else { lb = mid + 1; } } return ub; } vector<int> v; int main(int argc, char const *argv[]) { scanf("%d%d", &n, &k); for (int i = 1; i <= n; i++) { add(i, 1); } int cur = 1; for (int i = n; i >= 1; i--) { cur = (cur + k - 1) % i; if (cur == 0) { cur = i; } int x = search(cur); v.push_back(x); add(x, -1); } for (int i = 0; i < v.size(); i++) { if (i) { putchar(' '); } printf("%d", v[i]); } putchar('\n'); return 0; }
相关文章推荐
- ural 1521. War Games 2 约瑟夫环 SBT实现
- URAL 1521 War Games 2 树状数组解决约瑟夫环,输出离队顺序
- Ural 1521. War Games 2
- SBT解决约瑟夫环问题(URAL1521)
- 1521. War Games 2(线段树解约瑟夫)
- ural 1803
- ural 1519 Formula 1 插头dp 一条回路
- POJ 1521 Entropy 优先队列/multiset
- URAL 1013 K-based Numbers. Version 3
- URAL 1846. GCD 2010
- URAL 1322. Spy
- URAL 1348 Goat in the Garden 2(点到线段的距离)
- URAL 1640 Circle of Winter
- Ural 1146 Maximum Sum(DP)
- ural 1119. Metro(dp)
- Ural1094 && Ural1038(简单字符串)
- Ural 1183 Brackets Sequence(区间DP+记忆化搜索)
- ural 1907 Coffee and Buns
- URAL 1736 Chinese Hockey 网络流+建图
- URAL 1109 Conference