bzoj4548: 小奇的糖果 题解
题目链接
题解
不包含所有颜色
就强制不选一个颜色

图中圆点颜色相同
矩形越大,包括的点一定不比其一小部分少
如图所示,最大矩形只有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: 小奇的糖果 题解的更多相关文章
- 【题解】BZOJ4548 小奇的糖果(树状数组)
		[题解]BZOJ4548 小奇的糖果(树状数组) 说在前面:我有个同学叫小奇,他有一个朋友叫达达,达达特爱地理和旅游,初中经常AK地理,好怀恋和他已经达达一起到当时初中附近许多楼盘的顶楼逛的时光... ... 
- 【题解】 BZOJ4548 小奇的糖果
		本文同步在学弟ZCDHJ的个人博客发布,审核需要一段时间. 传送门 考虑题目中获得的糖果并不包含所有的颜色这句话,发现相当于我们可以直接选取某一个颜色强制不能选(这样子一定最优). 然后就可以考虑分开 ... 
- BZOJ4548 小奇的糖果
		本文版权归ljh2000和博客园共有,欢迎转载,但须保留此声明,并给出原文链接,谢谢合作. 本文作者:ljh2000作者博客:http://www.cnblogs.com/ljh2000-jump/转 ... 
- Bzoj4548 小奇的糖果(链表+树状数组)
		题面 Bzoj 题解 很显然,我们只需要考虑单独取线段上方的情况,对于下方的把坐标取反再做一遍即可(因为我们只关心最终的答案) 建立树状数组维护一个横坐标区间内有多少个点,维护双向链表实现查询一个点左 ... 
- 【BZOJ4548】小奇的糖果 set(链表)+树状数组
		[BZOJ4548]小奇的糖果 Description 有 N 个彩色糖果在平面上.小奇想在平面上取一条水平的线段,并拾起它上方或下方的所有糖果.求出最多能够拾起多少糖果,使得获得的糖果并不包含所有的 ... 
- 【BZOJ4548】小奇的糖果
		→原题传送门←(by Hzwer) 「题目背景」 小奇不小心让糖果散落到了地上,它对着满地的彩色糖果胡思乱想. 「问题描述」 有 N 个彩色糖果在平面上.小奇想在平面上取一条水平的线段,并拾起它上方或 ... 
- 【BZOJ-4548&3658】小奇的糖果&Jabberwocky     双向链表 + 树状数组
		4548: 小奇的糖果 Time Limit: 10 Sec Memory Limit: 256 MBSubmit: 103 Solved: 47[Submit][Status][Discuss] ... 
- 小奇的糖果(candy)
		[题目背景]小奇不小心让糖果散落到了地上,它对着满地的彩色糖果胡思乱想.[问题描述]有 N 个彩色糖果在平面上. 小奇想在平面上取一条水平的线段,并拾起它上方或下方的所有糖果.求出最多能够拾起多少糖果 ... 
- 【bzoj4548】小奇的糖果  STL-set+树状数组
		题目描述 平面上有n个点,每个点有一种颜色.对于某一条线段,选择所有其上方或下方的点.求:在不包含所有颜色的点的前提下,选择的点数最多是多少.(本题中如果存在某颜色没有相应的点,那么选择任何线段都不算 ... 
随机推荐
- laravel中的模型关联之(一对一)
			一对一 一对一的关联关系就相当于,赞和文章之间的关系,一个用户只能赞一次一个文章,只能和文章发生一次关系, 用户和赞的文章是唯一的一份,这里举得是判断用户是否赞过某个文章 一个参数都是你要获取的模型, ... 
- datatables01 安装、数据源、选中行事件、新增一行数据、删除一行数据
			1 安装 1.1 引入必要文件 要在项目中使用datatables需要引入三个文件 >DataTables CSS >jQuery >DataTables JS <!-- Da ... 
- 633. Sum of Square Numbers 是否由两个完全平方数构成
			[抄题]: Given a non-negative integer c, your task is to decide whether there're two integers a and b s ... 
- Docker 学习笔记_安装和使用MongoDB
			一.准备 1.宿主机OS:Win10 64 2.虚拟机OS:Ubuntu18.04 3.账号:docker 二.安装 1.搜索MongoDB镜像 ... 
- jQuery--修改表单数据并提交
			目的: 点击'编辑',弹出对话框,修改数据. 主要知识点: prevAll(),获取同级别本元素前面的所有元素. 代码: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 ... 
- $.post()参数及返回值
			JQuery中的$.post()函数 先看一个例子:$.post("adduser.ashx", { "name": name, "sex" ... 
- 学习PDO啦
			通过查找资料对PDO有了一定的了解,PDO(PHP Data Object )为PHP数据对象,为PHP访问数据库提供了一个轻量级的借口,但PDO本生不能实现访问数据库的任何功能,只能通过数据库的PD ... 
- hdu 4768 Flyer (异或操作的应用)
			2013年长春网络赛1010题 继巴斯博弈(30分钟)签到后,有一道必过题(一眼即有思路). 思路老早就有(40分钟):倒是直到3小时后才被A掉.期间各种换代码姿态! 共享思路: unlucky st ... 
- javascript总结13:循环语句
			1 While循环 While(条件表达式){ 只要条件表达式结果为true,循环一直执行,当条件表达式结果为false的时候,循环终止 } While循环语句需现在循环体外定义变量. 2 for循环 ... 
- 获取下标实现导航切换jquery代码
			var lis = $(".proDetail_contentnav li");for(var i = 0; i < lis.length; i++) { lis[i].in ... 
