题目链接

题解

不包含所有颜色
就强制不选一个颜色

图中圆点颜色相同
矩形越大,包括的点一定不比其一小部分少
如图所示,最大矩形只有3种

离散化\(x\)坐标

然后按\(y\)排序
每次取出颜色的前驱和后继, 算出所围矩形内点的个数,取\(max\)

对于第\(3\)种,扫一遍\(set\)即可

Code

#include<bits/stdc++.h>

#define LL long long
#define RG register

using namespace std;

inline int gi() {
    RG int x = 0; RG char c = getchar(); bool f = 0;
    while (c != '-' && (c < '0' || c > '9')) c = getchar();
    if (c == '-') c = getchar(), f = 1;
    while (c >= '0' && c <= '9') x = x*10+c-'0', c = getchar();
    return f ? -x : x;
}
const int N = 100010;
set<int> s[N];
struct node {
    int x, y, z;
    bool operator <(node z) const {
        return y < z.y;
    }
}a[N];
int n, m, b[N], ans;

int t[N];
#define lowbit(x) (x&(-x))
void add(int x, int k) {
    while (x <= n)
        t[x] += k, x += lowbit(x);
    return ;
}
inline int sum(int x) {
    int s = 0;
    while (x > 0) s += t[x], x -= lowbit(x);
    return s;
}

void solve() {
    memset(t, 0, sizeof(t));
    for (int i = 1; i <= m; i++) s[i].clear(), s[i].insert(0), s[i].insert(n+1);
    for (int i = 1,j = 1; i <= n; i = j) {
        while (j <= n && a[i].y == a[j].y) j++;
        for (int k = i; k < j; k++) ans = max(ans, sum(*s[a[k].z].lower_bound(a[k].x)-1)-sum(*--s[a[k].z].upper_bound(a[k].x)));
        for (int k = i; k < j; k++) add(a[k].x, 1), s[a[k].z].insert(a[k].x);
    }
    return ;
}

int main() {
    //freopen(".in", "r", stdin);
    //freopen(".out", "w", stdout);
    int T = gi();
    while (T--) {
        n = gi(), m = gi();
        for (int i = 1; i <= n; i++) a[i].x = gi(), a[i].y = gi(), a[i].z = gi(), b[i] = a[i].x;
        sort(a+1, a+1+n), sort(b+1, b+1+n);
        for (int i = 1; i <= n; i++)
            a[i].x = lower_bound(b+1, b+1+n, a[i].x) - b;
        ans = 0;
        solve();
        for (int i = 1; i <= n>>1; i++) swap(a[i], a[n-i+1]);
        solve();
        for (int i = 1; i <= m; i++)
            for (set<int> :: iterator it = s[i].begin(); it != s[i].end();) {
                int j = *(it++);
                ans = max(ans, sum(*it-1) - sum(j));
                if (j == n+1) break;
            }
        printf("%d\n", ans);
    }
    return 0;
}

bzoj4548: 小奇的糖果 题解的更多相关文章

  1. 【题解】BZOJ4548 小奇的糖果(树状数组)

    [题解]BZOJ4548 小奇的糖果(树状数组) 说在前面:我有个同学叫小奇,他有一个朋友叫达达,达达特爱地理和旅游,初中经常AK地理,好怀恋和他已经达达一起到当时初中附近许多楼盘的顶楼逛的时光... ...

  2. 【题解】 BZOJ4548 小奇的糖果

    本文同步在学弟ZCDHJ的个人博客发布,审核需要一段时间. 传送门 考虑题目中获得的糖果并不包含所有的颜色这句话,发现相当于我们可以直接选取某一个颜色强制不能选(这样子一定最优). 然后就可以考虑分开 ...

  3. BZOJ4548 小奇的糖果

    本文版权归ljh2000和博客园共有,欢迎转载,但须保留此声明,并给出原文链接,谢谢合作. 本文作者:ljh2000作者博客:http://www.cnblogs.com/ljh2000-jump/转 ...

  4. Bzoj4548 小奇的糖果(链表+树状数组)

    题面 Bzoj 题解 很显然,我们只需要考虑单独取线段上方的情况,对于下方的把坐标取反再做一遍即可(因为我们只关心最终的答案) 建立树状数组维护一个横坐标区间内有多少个点,维护双向链表实现查询一个点左 ...

  5. 【BZOJ4548】小奇的糖果 set(链表)+树状数组

    [BZOJ4548]小奇的糖果 Description 有 N 个彩色糖果在平面上.小奇想在平面上取一条水平的线段,并拾起它上方或下方的所有糖果.求出最多能够拾起多少糖果,使得获得的糖果并不包含所有的 ...

  6. 【BZOJ4548】小奇的糖果

    →原题传送门←(by Hzwer) 「题目背景」 小奇不小心让糖果散落到了地上,它对着满地的彩色糖果胡思乱想. 「问题描述」 有 N 个彩色糖果在平面上.小奇想在平面上取一条水平的线段,并拾起它上方或 ...

  7. 【BZOJ-4548&3658】小奇的糖果&Jabberwocky 双向链表 + 树状数组

    4548: 小奇的糖果 Time Limit: 10 Sec  Memory Limit: 256 MBSubmit: 103  Solved: 47[Submit][Status][Discuss] ...

  8. 小奇的糖果(candy)

    [题目背景]小奇不小心让糖果散落到了地上,它对着满地的彩色糖果胡思乱想.[问题描述]有 N 个彩色糖果在平面上. 小奇想在平面上取一条水平的线段,并拾起它上方或下方的所有糖果.求出最多能够拾起多少糖果 ...

  9. 【bzoj4548】小奇的糖果 STL-set+树状数组

    题目描述 平面上有n个点,每个点有一种颜色.对于某一条线段,选择所有其上方或下方的点.求:在不包含所有颜色的点的前提下,选择的点数最多是多少.(本题中如果存在某颜色没有相应的点,那么选择任何线段都不算 ...

随机推荐

  1. win32多线程 (一) 线程创建与结束等待

    #include "stdafx.h"#include <Windows.h>#include <iostream> using namespace std ...

  2. CopyOnWriteArrayList原理

    http://blog.csdn.net/chayangdz/article/details/76347465 总结的很到位: http://www.cnblogs.com/java-zhao/p/5 ...

  3. HttpAnalyzerStdV7安装教程

    相关链接:HttpAnalyzerStdV7使用教程 安装步骤:   1.解压压缩包   2.双击运行安装文件   3.根据向导提示点击Next   4.选择接受协议,点击Next   5.修改安装路 ...

  4. 干掉MessageBox,自定义弹出框JMessbox (WindowsPhone)

    先上效果图                                               QQ退出效果                                           ...

  5. vs2015编译ffmpeg 出现错误rtmp.lib(rtmp.obj) : error LNK2001: 无法解析的外部符号 ___iob_func

    vs2015编译ffmpeg(版本3.0.2)引用外部库文件librtmp出现以下错误: rtmp.lib(rtmp.obj) : error LNK2001: 无法解析的外部符号 __imp__st ...

  6. 关于使用idea的一些小技巧

    1:idea与git同步以后查看修改变化: file --setting--versioncontorller

  7. C#截取验证码图片

    使用Graphics类中的DrawImage方法,这个方法有30种重载方式,这里只介绍一种,也是我认为最直观的一种,代码如下: using System.Drawing; namespace kq.U ...

  8. spring @Async 线程池使用

    最近公司项目正逐渐从dubbo向springCloud转型,在本次新开发的需求中,全部使用springcloud进行,在使用时线程池,考虑使用spring封装的线程池,现将本次使用心得及内容记录下来 ...

  9. [转]解读Unity中的CG编写Shader系列1——初识CG

    CG=C for Graphics  用于计算机图形编程的C语言超集 前提知识点: 1.CG代码必须用 CGPROGRAM ... ENDCG括起来 2.顶点着色器与片段着色器的主函数名称可随意,但需 ...

  10. Java bean与Spring、Spring MVC关系

    Java Bean Java语言欠缺属性.事件.多重继承功能.所以,如果要在Java程序中实现一些面向对象编程的常见需求,只能手写大量胶水代码.Java Bean正是编写这套胶水代码的惯用模式或约定. ...