poj2828 Buy Tickets
逆序维护区间和
import java.util.*; import java.math.*; public class Main { static int MAXN = 220010; static int[] sum = new int[MAXN << 2]; static int[] a = new int[200010]; static int[] b = new int[200010]; static int[] vis = new int[200010]; static int mk; public static void pushup(int rt) { sum[rt] = sum[rt << 1] + sum[rt << 1 | 1]; } public static void bulid(int l, int r, int rt) { sum[rt] = r - l + 1; if (r == l) { return; } int m = (l + r) >> 1; bulid(l, m, rt << 1); bulid(m + 1, r, rt << 1 | 1); // pushup(rt); } public static void update(int pos, int add, int l, int r, int rt) { sum[rt]--; if (l == r) { mk = l; return; } int m = (l + r) >> 1; if (pos <= sum[rt << 1]) { update(pos, add, l, m, rt << 1); } else { update(pos - sum[rt << 1], add, m + 1, r, rt << 1 | 1); } pushup(rt); } public static void main(String[] args) { Scanner cin = new Scanner(System.in); int n; while (cin.hasNext()) { n = cin.nextInt(); bulid(1, n, 1); int sum = 0; for (int i = 0; i < n; ++i) { a[i] = cin.nextInt(); b[i] = cin.nextInt(); } for (int i = n - 1; i >= 0; i--) { update(a[i] + 1, b[i], 0, n - 1, 1); vis[mk] = b[i]; } System.out.print(vis[0]); for (int i = 1; i < n; ++i) { System.out.print(" " + vis[i]); } System.out.print("\n"); } cin.close(); } }
poj2886 Who Gets the Most Candies?
import java.util.*; import java.math.*; public class Main { static int MAXN = 500010; static int[] tree = new int[MAXN << 2]; static int[] ans = new int[MAXN]; static String[] str = new String[MAXN]; static int[] val = new int[MAXN]; public static void pushup(int rt) { tree[rt] = tree[rt << 1] + tree[rt << 1 | 1]; } public static void bulid(int l, int r, int rt) { if (r == l) { tree[rt] = 1; return; } int m = (l + r) >> 1; bulid(l, m, rt << 1); bulid(m + 1, r, rt << 1 | 1); pushup(rt); } public static int update(int add, int l, int r, int rt) { if (l == r) { tree[rt]--; return l; } int m = (l + r) >> 1; int pos; if (tree[rt << 1] >= add) { pos = update(add, l, m, rt << 1); } else { pos = update(add - tree[rt << 1], m + 1, r, rt << 1 | 1); } pushup(rt); return pos; } static int id; public static void init(int n) { Arrays.fill(ans, 0); for (int i = 1; i <= n; i++) { ans[i]++; for (int j = 2 * i; j <= n; j += i) ans[j]++; } int max = ans[1]; id = 1; for (int i = 2; i <= n; i++) if (ans[i] > max) { max = ans[i]; id = i; } } public static void main(String[] args) { Scanner cin = new Scanner(System.in); int n, k; while (cin.hasNext()) { n = cin.nextInt(); k = cin.nextInt(); init(n); bulid(1, n, 1); for (int i = 1; i <= n; ++i) { str[i] = cin.next(); val[i] = cin.nextInt(); } int cnt = id; int mod = n; val[0] = 0; int pos = 0; while (cnt > 0) { cnt--; if (val[pos] > 0) k = ((k - 1 + val[pos] - 1) % mod + mod) % mod + 1; else k = ((k - 1 + val[pos]) % mod + mod) % mod + 1; pos = update(k, 1, n, 1); // System.out.println(pos); mod = tree[1]; } System.out.println(str[pos] + " " + ans[id]); } cin.close(); } }
- 版权声明:本文基于《知识共享署名-相同方式共享 3.0 中国大陆许可协议》发布,转载请遵循本协议
- 文章链接:http://www.carlstedt.cn/archives/654 (转载时请注明本文出处及文章链接)
发表评论
快来吐槽一下吧!