HDU 5714 (离散化 树状数组)
来源:互联网 发布:数据分析规划 编辑:程序博客网 时间:2024/05/19 15:43
#include <cstdio>#include <cstring>#include <cmath>#include <algorithm>#include <iostream>#include <map>#include <vector>using namespace std;#define maxn 21111int a[maxn][3], b[maxn][3];int cnt1, cnt2;int c[maxn], x[maxn], Max[maxn];int n;int cnt;int lowbit (int x) { return x&(-x);}void add (int pos, int num, bool op) { for (int i = pos; i <= cnt; i += lowbit (i)) { if (!op) c[i] += num; else x[i] += num; }}int sum (int pos, int op) { int ans = 0; for (int i = pos; i > 0; i -= lowbit (i)) { if (!op) ans += c[i]; else ans += x[i]; } return ans;}vector <int> num, l1, r1, l2, r2;map <int, int> gg;void init () { gg.clear (); sort (num.begin (), num.end ()); int Max = num.size (); cnt = 1; for (int i = 0; i < Max; i++) { if (!i || num[i] != num[i-1]) { gg[num[i]] = cnt++; } }}int solve () { num.clear (); l1.clear (), l2.clear(), r1.clear (), r2.clear (); memset (c, 0, sizeof c); for (int i = 0; i < cnt1; i++) { int r = a[i][0]+a[i][2], l = a[i][1]-a[i][2]; if (r >= l) { l1.push_back (l); r1.push_back (r); num.push_back (l); num.push_back (r); } } memset (x, 0, sizeof x); for (int i = 0; i < cnt2; i++) { int r = b[i][0]+b[i][2], l = b[i][1]-b[i][2]; if (r >= l) { l2.push_back (l); r2.push_back (r); num.push_back (l); num.push_back (r); } } init (); for (int i = 0; i < l1.size (); i++) { int l = gg[l1[i]], r = gg[r1[i]]; add (l, 1, 0); add (r+1, -1 , 0); } for (int i = 0; i < l2.size (); i++) { int l = gg[l2[i]], r = gg[r2[i]]; add (l, 1, 1); add (r+1, -1, 1); } Max[1] = x[1]; for (int i = 2; i <= cnt; i++) { int cur = sum (i, 1); Max[i] = max (Max[i-1], cur); } int ans = 0; for (int i = 1; i <= cnt; i++) { ans = max (ans, sum (i, 0) + Max[i]); } return ans;}int main () { //freopen ("in.txt", "r", stdin); int t, kase = 0; scanf ("%d", &t); while (t--) { scanf ("%d", &n); printf ("Case #%d:\n", ++kase); cnt1 = 0, cnt2 = 0; for (int i = 1; i <= n; i++) { int x, y, d, op; scanf ("%d%d%d%d", &x, &y, &d, &op); if (op == -1) { a[cnt1][0] = x, a[cnt1][1] = y, a[cnt1][2] = d; cnt1++; } else { b[cnt2][0] = x, b[cnt2][1] = y, b[cnt2][2] = d; cnt2++; } } int ans = solve (); printf ("%d\n", ans); } return 0;}
0 0
- HDU 5714 (离散化 树状数组)
- HDU 5714 树状数组 + 离散化
- HDU-4358-树状数组+离散化
- hdu 3874 树状数组+离散化
- HDU 5101 Select --离散化+树状数组
- hdu 4605(树状数组+离散化)
- HDU 3743 (树状数组,离散化)
- HDU 5654 (树状数组 离散化)
- HDU 5372 (树状数组 离散化)
- hdu 5372 离散化加树状数组
- hdu 5792 离散化+树状数组
- 树状数组+离散化(hdu 5862)
- hdu 5877 dfs+离散化+树状数组
- Hdu 4325 Flowers 树状数组+离散化
- hdu 5877 树状数组 +离散化 +树
- hdu 5877(树状数组+离散化)
- hdu 5862(离散化+树状数组)
- 反向树状数组 + 离散化 HDU 5372
- 腾讯17年实习生编程试题--构造回文
- iOS9创建PCH文件
- Javax.comm安装和使用 (Java串口通讯)
- SpringMVC中Freemarker获取项目根目录
- Android Studio --“Cannot resolve symbol” 解决办法
- HDU 5714 (离散化 树状数组)
- STM32L和STM32F函数库区别之GPIO
- hibernate中使用@Transient
- 面向程序员的数据库访问性能优化法则
- 使元素e左右震动
- 大白话解析模拟退火算法
- Form表单中method为get或post的编码区别
- ioctl函数
- html5打开视频摄像头源码