FZU 2163 多米诺骨牌(线段树)
来源:互联网 发布:全自动手机降温软件 编辑:程序博客网 时间:2024/05/29 16:21
题目链接:
FZU 2163 多米诺骨牌
题意:
一条水平线上竖直放置
数据范围:
分析:
用
#include <stdio.h>#include <string.h>#include <algorithm>#include <math.h>#include <climits>#define lson(x) (x << 1)#define rson(x) ((x << 1) | 1)using namespace std;typedef long long ll;const int MAX_N = 100010;int n, top;int ans[MAX_N], sta[MAX_N], extra[MAX_N];struct Domino { int x, y, id; bool operator < (const Domino& rhs) const { return x < rhs.x; }}domino[MAX_N];struct SegTree { int left, right, value;}segtree[MAX_N << 2];void build(int left, int right, int cur){ segtree[cur].left = left, segtree[cur].right = right; if (left == right) { segtree[cur].value = left + 1; return; } int mid = (left + right) >> 1; build(left, mid, lson(cur)); build(mid + 1, right, rson(cur)); segtree[cur].value = max(segtree[lson(cur)].value, segtree[rson(cur)].value);}int query(int a, int b, int cur){ int left = segtree[cur].left, right = segtree[cur].right; if (left == a && right == b) { return segtree[cur].value; } int mid = (left + right) >> 1; if (b <= mid) return query(a, b, lson(cur)); else if (a > mid) return query(a, b, rson(cur)); else { return max(query(a, mid, lson(cur)), query(mid + 1, b, rson(cur))); }}void update(int goal, int cur, int value){ int left = segtree[cur].left, right = segtree[cur].right; if (left == right) { segtree[cur].value = value; return; } int mid = (left + right) >> 1; if (goal <= mid) update(goal, lson(cur), value); else update(goal, rson(cur), value); segtree[cur].value = max(segtree[lson(cur)].value, segtree[rson(cur)].value);}int main(){ while (~scanf("%d", &n)) { for (int i = 0; i < n; ++i) { scanf("%d%d", &domino[i].x, &domino[i].y); domino[i].id = i; } sort(domino, domino + n); build(0, n - 1, 1); for (int i = 0; i < n; ++i) { extra[i] = domino[i].x; } top = 0; ans[domino[n - 1].id] = 1; int x, y, pos, last, cur, value; for (int i = n - 2; i >= 0; --i) { x = domino[i].x, y = domino[i].y, cur = domino[i].id; if (x + y > extra[n - 1]) pos = n - 1; else { pos = lower_bound(extra, extra + n, x + y) - extra - 1; } ans[cur] = query(i, pos, 1) - i; update(i, 1, ans[cur] + i); //printf("i = %d pos = %d cur = %d ans[cur] = %d\n", i, pos, cur, ans[cur]); } for (int i = 0; i < n; ++i) { if (i) printf(" "); printf("%d", ans[i]); } printf("\n"); } return 0;}
0 0
- FZU 2163 多米诺骨牌(线段树)
- FZU 2163 多米诺骨牌
- FZU 2163 多米诺骨牌(单调栈)
- ZOJ 3650(多米诺骨牌 dp + 线段树优化)
- FZU-1921+线段树
- FZU 2105 线段树
- FZU 2136 线段树+思路
- FZU 2176 经典线段树
- FZU(2184)线段树
- fzu 2277 Change 线段树
- fzu 2105 Digits Count 线段树
- 【FZU】2171 防守阵地 II 线段树
- 【线段树】 FZU 2105 Digits Count
- FZU 2171 防守阵地 II 线段树
- 【FZU】2105 Digits Count 线段树
- FZU 2136 取糖果(线段树)
- fzu 2136 取糖果(线段树)
- 【线段树】 FZU 2105 Digits Count
- Ajax实现简易的三级联动
- Ajax验证用户名和密码
- [BZOJ2754] 喵星球上的点名 - AC自动机/后缀数组/后缀自动机/玄学♂暴力
- html5的视频音频放置方法
- 二分查找
- FZU 2163 多米诺骨牌(线段树)
- Bitnami部署redmine下如何设置发送邮件地址(redmine之一)
- 多行文本溢出显示省略号(…)全攻略
- python中str与list效率对比
- 乐观锁和悲观锁
- Android ICS(SDK4.0)新特性 及 GridLayout/GridView/TableLayout的一些比较
- 题目122 Triangular Sums
- linux下创建、修改、删除用户,用户组以及ACL
- HDU5270Wool (区间扫描)