Description

见上帝动了恻隐之心,天后也想显示一下慈悲之怀,随即从口袋中取出一块魔术方巾,让身边的美神维纳斯拿到后堂的屏风上去试试,屏风是正方形的,高和宽方向上各划有m条鱼屏风的边平行的直线,平行直线间的距离为1厘米。这2m条直线共有m*m个交点,在某些交点上镶嵌着宝石。如果魔术方巾的边与屏风的边平行且魔术方巾触碰到屏风上镶嵌着的宝石,就将与这些宝石等值的金银送给人们。维纳斯想让魔术方巾触碰到的宝石的价值最多,可要在短短的1秒钟之内解决问题,也感到力不从心,你能帮帮她吗?

Input

输入文件gem.in的第一行有三个正整数m,n,k,数与数之间用一个空格分隔。其中m为屏风在高和宽方向上被划分出的直线数。魔术方巾为正方形的,它的边长为k厘米。N为屏风上宝石的个数。

接下来的n行,每行三个正整数,依次表示宝石所在直线的行号、列号、宝石的价值,数与数之间用一个空格分隔。

Output

输出文件gem.out只有一个正整数,为魔术方巾触碰到的宝石的最大价值总数。

Hint

30%的数据,1≤m≤500,1≤n≤10000,1≤k≤100;

60%的数据,1≤m≤3000,1≤n≤10000,1≤k≤1000;

100%的数据,1≤m≤50000,1≤n≤50000,1≤k≤10000;

Solution

这题在比赛的时候就想到了60分的暴力,所以就都来讲讲吧

对于60%

(由于时间不够,也没实现,仅供参考)这题我主要是想通过二维前缀和的方式去实现,对于每一个点,维护一个以该点为右下角的大小为k*k的矩阵价值和。n和m的大小应该勉强可以卡过去

对于100%

考后看题解,上面写着扫描线。我以为是什么很高深的算法,顿时凉一半。然后听了听大佬解释,我在这就翻译一下。

就是先将点按横坐标排序,然后1~n扫一遍。而因为我们只需要k*k的矩阵,所以我们只需要维护当前点到及前面k个点的价值就行了。那如何维护呢?我们考虑线段树。设第x个点表示纵坐标从x往上k个单位的贡献。然后我们枚举横坐标时,每次遇到一个点,就对线段树区间修改即可.。

Code

#include <cstdio>
#include <algorithm>
using namespace std;
int n,m,k,i,l,pl,pr,b1,b2,ans,bz[200001],tree[200001];
struct node{
int x,y,w;
}a[50001];
bool cmp(node a,node b){return a.x<b.x;}
void lazy(int x,int y,int z)
{
if (!bz[z]) return;
tree[z]+=bz[z];
if (x==y)
{
bz[z]=0;
return;
}
bz[z*2]+=bz[z];bz[z*2+1]+=bz[z];
bz[z]=0;
}
void add(int x,int y,int z,int l,int r,int s)
{
if (x==l && y==r)
{
bz[z]+=s;
lazy(x,y,z);
return;
}
int mid=(x+y)/2;
lazy(x,mid,z*2);
lazy(mid+1,y,z*2+1);
if (mid>=r) add(x,mid,z*2,l,r,s);else
if (mid<l) add(mid+1,y,z*2+1,l,r,s);else
{
add(x,mid,z*2,l,mid,s);
add(mid+1,y,z*2+1,mid+1,r,s);
}
tree[z]=max(tree[z*2],tree[z*2+1]);
}
int main()
{
freopen("gemstone.in","r",stdin);
scanf("%d%d%d",&m,&n,&k);
for (i=1;i<=n;i++)
{
scanf("%d%d%d",&a[i].x,&a[i].y,&a[i].w);
}
sort(a+1,a+n+1,cmp);
l=1;pl=1;pr=1;
for (i=1;i<=m;i++)
{
if (i>k+1)
{
while (a[pl].x<=l && pl<=n)
{
b1=max(a[pl].y-k,1);
b2=a[pl].y;
lazy(1,m,1);
add(1,m,1,b1,b2,-a[pl].w);
pl++;
}
l++;
}
while (a[pr].x<=i && pr<=n)
{
b1=max(a[pr].y-k,1);
b2=a[pr].y;
lazy(1,m,1);
add(1,m,1,b1,b2,a[pr].w);
pr++;
}
ans=max(ans,tree[1]);
}
printf("%d",ans);
}

JZOJ1495 宝石的更多相关文章

  1. jzoj1495 宝石 解题报告[扫描线]

    Description 见上帝动了恻隐之心,天后也想显示一下慈悲之怀,随即从口袋中取出一块魔术方巾,让身边的美神维纳斯拿到后堂的屏风上去试试,屏风是正方形的,高和宽方向上各划有m条鱼屏风的边平行的直线 ...

  2. BZOJ1190[HNOI2007]梦幻岛宝石

    Description 给你N颗宝石,每颗宝石都有重量和价值.要你从这些宝石中选取一些宝石,保证总重量不超过W,且总价值最大为,并输出最大的总价值.数据范围:N<=100;W<=2^30, ...

  3. BZOJ-1625 宝石手镯 01背包(傻逼题)

    傻逼题,懒得打,复制蛋蛋的.. 1625: [Usaco2007 Dec]宝石手镯 Time Limit: 5 Sec Memory Limit: 64 MB Submit: 1076 Solved: ...

  4. BZOJ_1625_ [Usaco2007_Dec]_宝石手镯_(01背包)

    描述 http://www.lydsy.com/JudgeOnline/problem.php?id=1625 01背包裸题. p.s.随便点开一道就是水题... 分析 ... #include &l ...

  5. BZOJ 1625: [Usaco2007 Dec]宝石手镯( dp )

    最裸的01背包.... --------------------------------------------------------------------- #include<cstdio ...

  6. PHP SPL他们留下的宝石

    Rafael Dohms 上面的篇文章 让我为之惊艳,忍不住就翻译了下来,同一时候补充了部分内容. SPL,PHP 标准库(Standard PHP Library) ,此从 PHP 5.0 起内置的 ...

  7. Linux:闪光的宝石,智慧 (在)

    Linux:闪光的宝石,智慧的结晶(上) 老实说,这十几天以来.因为我违反了"家规",又被断网处罚(拔掉网线).没收手机与老年证(不许出家门). 因此.我平日里仅仅能面对一篇文章& ...

  8. Linux:闪光的宝石,智慧(下一个)

    2005年4月7日.Linus Torvalds公布了一款新型通用工具软件包,叫做"Git"(the Git source code management system).&quo ...

  9. [Usaco2007 Dec]宝石手镯[01背包][水]

    Description 贝茜在珠宝店闲逛时,买到了一个中意的手镯.很自然地,她想从她收集的 N(1 <= N <= 3,402)块宝石中选出最好的那些镶在手镯上.对于第i块宝石,它的重量为 ...

随机推荐

  1. C#LeetCode刷题之#590-N叉树的后序遍历(N-ary Tree Postorder Traversal)

    问题 该文章的最新版本已迁移至个人博客[比特飞],单击链接 https://www.byteflying.com/archives/4092 访问. 给定一个 N 叉树,返回其节点值的后序遍历. 例如 ...

  2. 关于Dapper实现读写分离的个人思考

    概念相关     为了确保多线上环境数据库的稳定性和可用性,大部分情况下都使用了双机热备的技术.一般是一个主库+一个从库或者多个从库的结构,从库的数据来自于主库的同步.在此基础上我们可以通过数据库反向 ...

  3. Jmeter(二十一) - 从入门到精通 - JMeter断言 - 上篇(详解教程)

    1.简介 最近由于宏哥在搭建自己的个人博客可能更新的有点慢.断言组件用来对服务器的响应数据做验证,常用的断言是响应断言,其支持正则表达式.虽然我们的通过响应断言能够完成绝大多数的结果验证工作,但是JM ...

  4. 分享一个Flink checkpoint失败的问题和解决办法

    本文来自: PerfMa技术社区 PerfMa(笨马网络)官网 接触Flink一段时间了,遇到了一些问题,其中有一个checkpoint失败导致作业重启的问题,遇到了很多次,重启之后一般也能恢复正常, ...

  5. Spring事务专题(五)聊聊Spring事务到底是如何实现的

    前言 本专题大纲: 本文为本专题倒数第二篇文章. 在上篇文章中我们一起学习了Spring中的事务抽象机制以及动手模拟了一下Spring中的事务管理机制,那么本文我们就通过源码来分析一下Spring中的 ...

  6. jraft日志复制

    jraft的日志复制是指从leader往follower复制logEntry的过程. 日志复制从节点成为leader开始.在nodeImpl的becomeLeader中 private void be ...

  7. SpringBoot --- 自定义 Starter

    SpringBoot --- 自定义 Starter 创建 1.需要创建一个新的空工程 2.新的工程需要引入两个模块 一个Maven 模块 作为启动器 一个SpringBoot 模块 作为自动配置模块 ...

  8. Burp Suite 爆破high级别的DVWA

    Step1:调整 DVWA 为 high 级别,然后点击进入 Brute Force . Step2:输入正确的账号,和一个假的密码,使用BP进行拦包. Step3:Ctrl+i 将拦到的包发送到 I ...

  9. 编译原理根据项目集规范族构造LR(0)分析表

    转载于https://blog.csdn.net/Johan_Joe_King/article/details/79058597?utm_medium=distribute.pc_relevant.n ...

  10. python基础 Day8

    python Day8 文件操作的识 利用python代码写一个脚本操作文件的过程 文件的路径:path 打开方式:读,写,追加,读写,写读 编码方式:utf-8,gbk,gb2312 简单文件读取( ...