POJ 2182Lost Cows
Posted evenbao
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了POJ 2182Lost Cows相关的知识,希望对你有一定的参考价值。
【题目链接】
http://poj.org/problem?id=2182
【算法】
树状数组 + 二分
【代码】
#include <algorithm> #include <bitset> #include <cctype> #include <cerrno> #include <clocale> #include <cmath> #include <complex> #include <cstdio> #include <cstdlib> #include <cstring> #include <ctime> #include <deque> #include <exception> #include <fstream> #include <functional> #include <limits> #include <list> #include <map> #include <iomanip> #include <ios> #include <iosfwd> #include <iostream> #include <istream> #include <ostream> #include <queue> #include <set> #include <sstream> #include <stdexcept> #include <streambuf> #include <string> #include <utility> #include <vector> #include <cwchar> #include <cwctype> #include <stack> #include <limits.h> using namespace std; #define MAXN 8010 int i,n; int a[MAXN],ans[MAXN],c[MAXN]; inline int lowbit(int x) { return x & (-x); } inline void modify(int pos,int val) { int i; for (i = pos; i <= n; i += lowbit(i)) c[i] += val; } inline int query(int pos) { int i; int ret = 0; for (i = pos; i; i -= lowbit(i)) ret += c[i]; return ret; } inline int get(int k) { int l = 1,r = n,mid; int ret; while (l <= r) { mid = (l + r) >> 1; if (query(mid) >= k) { ret = mid; r = mid - 1; } else l = mid + 1; } return ret; } int main() { scanf("%d",&n); for (i = 2; i <= n; i++) scanf("%d",&a[i]); for (i = 1; i <= n; i++) c[i] = lowbit(i); for (i = n; i >= 1; i--) { ans[i] = get(a[i]+1); modify(ans[i],-1); } for (i = 1; i <= n; i++) printf("%d ",ans[i]); return 0; }
以上是关于POJ 2182Lost Cows的主要内容,如果未能解决你的问题,请参考以下文章