栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

zoj 3169 Shift By 7

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

zoj 3169 Shift By 7

#include <set>#include <cstdio>#include <vector>#include <utility>#include <algorithm>using namespace std;const int MAXN = 65536;inline int F(int x) { return x >> 1; }inline int L(int x) { return x << 1; }inline int R(int x) { return (x << 1) ^ 1; }inline int LR(int x) { return x ^ 1; }int n, cur;int h[MAXN], s[MAXN];int a[MAXN * 2];void mark(int p) {    p += MAXN;    a[p] = 1;    while (p > 1) {        if (a[p] == 1 && a[LR(p)] == 1) { a[F(p)] = 1;        } else { a[F(p)] = -1;        }        p = F(p);    }}bool check(int p, int l, int r, int ll, int rr) {    if (a[p] != -1) {        return a[p] == 1;    } else if (l == ll && r == rr) {        return false;    } else {        int m = (l + r) / 2;        if (rr <= m) { return check(L(p), l, m, ll, rr);        } else if (ll >= m) { return check(R(p), m, r, ll, rr);        } else { return check(L(p), l, m, ll, m) && check(R(p), m, r, m, rr);        }    }}bool check(int l, int r) {    if (l == r) {        return true;    } else if (l > r) {        return check(l, n) && check(0, r);    } else {        return check(1, 0, MAXN, l, r);    }}int main() {    while (scanf("%d", &n) != EOF) {        set<pair<int, int> > todo;        vector<int> ans;        set<int> st;        for (int i = 0; i < n; ++i) { st.insert(i); scanf("%d", &h[i]); s[i] = (h[i] + 7) % n; if (h[i] > 0 && s[i] == i) {     todo.insert(make_pair(h[i], i)); }        }        fill(a, a + MAXN * 2, 0);        for (int i = n; i < MAXN; ++i) { mark(i);        }        while (!todo.empty()) { ans.push_back(todo.begin()->first); cur = todo.begin()->second; todo.erase(todo.begin()); h[cur] = 0; mark(cur); st.erase(cur); if (st.lower_bound(cur) == st.end()) {     cur = *st.begin(); } else {     cur = *st.lower_bound(cur); } if (h[cur] > 0 && check(s[cur], cur)) {     todo.insert(make_pair(h[cur], cur)); }        }        for (int i = 0; i < ans.size(); ++i) { printf("%d%c", ans[i], (i == ans.size() - 1) ? 'n' : ' ');        }    }    return 0;}
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/370158.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号