以下内容来自ShallWe's Blog

题目

4548: 小奇的糖果

Description

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

Input

包含多组测试数据,第一行输入一个正整数\(T\)表示测试数据组数。
接下来\(T\)组测试数据,对于每组测试数据,第一行输入两个正整数\(N\),\(K\),分别表示点数和颜色数。
接下来\(N\)行,每行描述一个点,前两个数\(x\),\(y\)(\(|x|,|y|≤2^30-1\))描述点的位置,最后一个数\(z\)\((1≤z≤k)\)描述点的颜色。
对于\(100%\)的数据,\(N≤100000,K≤100000,T≤3\)

Output

对于每组数据在一行内输出一个非负整数\(ans\),表示答案

解题报告

考场上光彩爆零->写了一个很长很长的臭程序,先讲一下考场上的思路:
很容易看出,可以把合法的线段造成的收益看做矩形内部节点数,矩形内部节点数很好求,所以就是要找出矩形.
矩形显然有三类,一类是枚举\(x\)相邻的相同颜色\(star\),之间通天遁地的矩形,一类是下边贴一个\(star\),两边各贴一个相同颜色的\(star\),上边贴顶的矩形,第三类和第二类相似;
所以我就将问题转化成求一个点两端的比它高(低)的第一对点的横坐标;
我现场是用单调栈来搞的,每一个颜色维护上方一个单调递减的栈,每次弹栈就形成矩形,这样每个点可以形成上下两个矩形,加上第一类矩形,一共是\(3n\)个矩形;


上面那个方法难写难调细节很多;学习了hzwer的姿势,使用双向链表实际上作用就是维护两边最近的相同颜色的点,考虑如果当前的点是该颜色点中最高的那么双向链表所指的横坐标就能确定矩形左右边界,当这个矩形确定后,这个最高点会对两侧点造成干扰,删掉就好。这样下矩形就确定好了,上矩形将纵坐标上下翻转就好了,
提一句:求矩形内部节点个数->扫描线+树状数组/树套树随便做。

代码

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cstdlib>
using namespace std;
const int N=100001;
struct poi{int x,y,color,id; poi(){}poi(int x,int y,int color,int id):x(x),y(y),color(color),id(id){}
}   point[N];
int T,n,k,ans;
int l[N],r[N],bit[N],vec[N],pre[N],w[N];
inline void in(int &x){char ch=getchar(); int f=1; for (;ch<'0'||ch>'9';ch=getchar())if (ch=='-') f=-1; for (x=0;ch>='0'&&ch<='9';ch=getchar())x=x*10+ch-48; x=x*f;
}
inline void init(){ans=0;
}
bool cmpx(poi a,poi b){return a.x<b.x;
}
bool cmpy(poi a,poi b){return a.y<b.y;
}
inline void add(int x,int val){for (;x<=n+1;x+=x&-x)bit[x]+=val;
}
inline int query(int x,int tmp=0){for (;x;x-=x&-x)tmp+=bit[x]; return tmp;
}
inline void up(int l,int r){if (l>r) return;int tmp=query(r)-query(l-1); ans=max(tmp,ans);
}
void solve(){memset(bit,0,sizeof(bit));memset(pre,0,sizeof(pre)); w[0]=0,w[n+1]=n+1;sort(point+1,point+1+n,cmpx); for (int i=1;i<=n;i++) add(point[i].x,1); int y,x;for (int i=1;i<=n;i++){x=point[i].id,y=pre[point[i].color];l[x]=y,r[x]=n+1; if (y) r[y]=x; up(w[y]+1,w[x]-1); pre[point[i].color]=x;}for (int i=1;i<=k;i++){up(w[pre[i]]+1,n+1); }sort(point+1,point+1+n,cmpy); for (int i=1,j=1;i<=n;i++){x=point[i].id; while (j<=n&&point[j].y==point[i].y){add(point[j].x,-1);j++;}l[r[x]]=l[x],r[l[x]]=r[x];up(w[l[x]]+1,w[r[x]]-1); }
}
int main(){
//  freopen("candy.in","r",stdin);
//  freopen("candy.out","w",stdout); in(T);int x,y,z;while (T--){init();in(n),in(k); for (int i=1;i<=n;i++){in(x),in(y),in(z); point[i]=poi(x,y,z,i);}for (int i=1;i<=n;i++) vec[i]=point[i].x; sort(vec+1,vec+1+n); for (int i=1;i<=n;i++){ point[i].x=lower_bound(vec+1,vec+1+n,point[i].x)-vec;w[i]=point[i].x;} solve(); for (int i=1;i<=n;i++)point[i].y=-point[i].y; solve(); printf("%d\n",ans); }return 0;
}

双倍经验:3658: Jabberwocky

转载于:https://www.cnblogs.com/ShallWe2000/p/5776598.html

Bzoj 4548: 小奇的糖果(双向链表+排序+树状数组)相关推荐

  1. bzoj 4548: 小奇的糖果 bzoj 3658: Jabberwocky(双向链表+树状数组)

    3658: Jabberwocky Time Limit: 20 Sec  Memory Limit: 1024 MB Submit: 263  Solved: 107 [Submit][Status ...

  2. [乱搞 树状数组] BZOJ 4548 小奇的糖果 BZOJ 3658 Jabberwocky

    跟悬线法有点像 #include<cstdio> #include<cstdlib> #include<algorithm> #include<cstring ...

  3. 小沙的remake(牛客)排序+ 树状数组 + dp

    原题链接:登录-专业IT笔试面试备考平台_牛客网 把a[i]先排序(带着下标排),然后从小到大每次先找下标在范围之内 [ i − b i , i ) 的所有种数,然后加一就是以a[i]为最后一个元素的 ...

  4. BZOJ.2738.矩阵乘法(整体二分 二维树状数组)

    题目链接 BZOJ 洛谷 整体二分.把求序列第K小的树状数组改成二维树状数组就行了. 初始答案区间有点大,离散化一下. 因为这题是一开始给点,之后询问,so可以先处理该区间值在l~mid的修改,再处理 ...

  5. bzoj 4372 烁烁的游戏——动态点分治+树状数组

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=4372 和 bzoj 3070 震波 是一个套路.注意区间修改的话,树状数组不能表示 dis ...

  6. bzoj 4372 烁烁的游戏 —— 动态点分治+树状数组

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=4372 本以为和 bzoj3730 一样,可以直接双倍经验了: 但要注意一下,树状数组不能查询 ...

  7. BZOJ 3289 Mato的文件管理(莫队+树状数组)

    [题目链接] http://www.lydsy.com/JudgeOnline/problem.php?id=3289 [题目大意] 求静态区间逆序对. [题解] 我们对查询进行莫队操作,对于区间的删 ...

  8. bzoj 3356: [Usaco2004 Jan]禁闭围栏(扫描线+树状数组)

    3356: [Usaco2004 Jan]禁闭围栏 Time Limit: 10 Sec  Memory Limit: 128 MB Submit: 45  Solved: 26 [Submit][S ...

  9. 【51nod P3121】小陶与杠铃片【树状数组】

    linklinklink 分析: 逆序对个数 要去重 CODE: #include<iostream> #include<cstdio> #include<cstring ...

最新文章

  1. jsp网站访问次数统计
  2. android连接sqlite进行简单的增删改查和事务管理
  3. JAVA编程思想学习笔记——第一章 对象导论
  4. 动态添加控件及将某XML动态加入到Activity显示
  5. 在Linux PC上查看arm交叉编译的可执行文件依赖的动态库
  6. Log4j的组件和配置文件介绍
  7. Flink 状态管理:算子状态、键值分区状态、状态后端、有状态算子的扩缩容
  8. mysql oa数据库设计_OA项目1:环境搭建之数据库创建与环境添加
  9. python列表操作符_python——列表操作符
  10. Unity3D Shader 入门之控制语句
  11. 使用python进行数据抽样
  12. 苹果麦克风设置在哪里_这一份 iOS 14 安全和隐私设置指南,请收好
  13. springboot自带的线程池ThreadPoolTaskExecutor、ThreadPoolTaskScheduler的深入应用——异步任务监听回调,任务中断案例
  14. Android 10.0 媒体音乐,铃声,闹钟,通知等设置默认音量为最大音量80%
  15. 【Java】 实现一个简单文件浏览器(1)
  16. 纯干货:docker可视化管理界面
  17. P1967 货车运输 题解
  18. 最优化在供应链网络设计中的应用:基于Python
  19. SimpleDateFormat替换方案
  20. cf Educational Codeforces Round 77 E. Tournament

热门文章

  1. android 缩放透明动画,Android旋转、平移、缩放和透明度渐变的补间动画
  2. java异常的总接口_重构:Java特别的接口修改:在throws子句中添加一个异常?
  3. pymysql语法_pymysql的用法
  4. 打印字符串(C语言,全排列)
  5. 旋转图像Python解法
  6. java解析表字段_从SQL / HQL Java解析表和列名
  7. hibernate mysql分页_求struts+hibernate实现mysql分页的详细代码
  8. java找出一组数据缺少最小数组_Java获取一维数组的最小值实现方法
  9. html表格美化代码,分享:记录一次使用纯CSS美化table表格的代码
  10. Android打电话功能权限报错,从打电话权限报错看Android6.0权限变化