「LOJ 6373」NOIP2017 普及组题目大融合
NOIP2017 普及组题目大融合
每个读者需要有某个后缀的书,可以暴力map,复杂度\(o(9*nlog(n))\),也可以反串建trie树,复杂度\(o(9*n)\)。
故可以求出需要的最少的RMB数目。
显然直接求花费金币的最小值是不容易的,那么可以二分最小值。
问题变为判断性的了。
实际上S就等于一个机器人最多可以得到的RMB数...
先将行列拆开统计。
能转移到一个点的区间实际上是已知而且单调的,故可以利用单调队列来维护。
由于同种颜色的转移能多1RMB,因此每个颜色都要维护。
需要4个单调队列,复杂度$ o(n^2) $。
复杂度\(o(n^2)\)。
总的复杂度$o(n^2) $,优秀。
#include<bits/stdc++.h>
#define rep(q,a,b) for(int q=a,q##_end_=b;q<=q##_end_;++q)
#define dep(q,a,b) for(int q=a,q##_end_=b;q>=q##_end_;--q)
#define mem(a,b) memset(a,b,sizeof a )
using namespace std;
typedef long long ll;
void in(int &r) {
static char c;
r=0;
bool flag=0;
while(c=getchar(),!isdigit(c))c=='-'&&(flag=1);
do r=(r<<1)+(r<<3)+(c^48);
while(c=getchar(),isdigit(c));
flag&&(r=-r);
}
const int mn=1005;
set<int> fi;
int n,m,Q,d;
int cl[mn][mn],val[mn][mn];
ll dp[mn][mn];
ll nd;
int l_top[2],l_top1[2],r_top[2][mn],r_top1[2][mn];
int l_sta[2][mn],r_sta[2][mn][mn];
void check(ll &a,ll b) {
if(a<b)a=b;
}
bool check(int v) {
rep(q,1,n)rep(w,1,n)dp[q][w]=-1e18;
rep(q,1,n)r_top[0][q]=r_top[1][q]=0,r_top1[0][q]=r_top1[1][q]=0;
dp[1][1]=0;
int l=max(1,d-v),r=min(n-1,d+v);
ll ans=0;
rep(q,1,n) {
l_top[0]=l_top[1]=0;
l_top1[0]=l_top1[1]=0;
rep(w,1,n) {
int d=cl[q][w];
if(l_top[d]>l_top1[d])check(dp[q][w],dp[q][l_sta[d][l_top1[d]+1]]+val[q][w]+1);
if(l_top[!d]>l_top1[!d])check(dp[q][w],dp[q][l_sta[!d][l_top1[!d]+1]]+val[q][w]);
if(r_top[d][w]>r_top1[d][w])check(dp[q][w],dp[r_sta[d][w][r_top1[d][w]+1]][w]+val[q][w]+1);
if(r_top[!d][w]>r_top1[!d][w])check(dp[q][w],dp[r_sta[!d][w][r_top1[!d][w]+1]][w]+val[q][w]);
if(w-r>0) {
d=cl[q][w-r];
if(l_top[d]>l_top1[d]&&l_sta[d][l_top1[d]+1]==w-r)++l_top1[d];
}
if(q-r>0){
d=cl[q-r][w];
if(r_top[d][w]>r_top1[d][w]&&r_sta[d][w][r_top1[d][w]+1]==q-r)++r_top1[d][w];
}
if(w-l+1>0){
d=cl[q][w-l+1];
while(l_top[d]>l_top1[d]&&dp[q][l_sta[d][l_top[d]]]<dp[q][w-l+1])--l_top[d];
l_sta[d][++l_top[d]]=w-l+1;
}
if(q-l+1>0){
d=cl[q-l+1][w];
while(r_top[d][w]>r_top1[d][w]&&dp[r_sta[d][w][r_top[d][w]]][w]<dp[q-l+1][w])--r_top[d][w];
r_sta[d][w][++r_top[d][w]]=q-l+1;
}
ans=max(ans,dp[q][w]);
}
}
return ans>=nd;
}
int main() {
int a,b,c;
in(n),in(m),in(Q),in(d);
rep(q,1,m) {
in(a);
ll e=1;
while(e<=a)e*=10,fi.insert(a%e);
}
rep(q,1,Q) {
in(a),in(b),in(c);
if(fi.find(b)==fi.end())nd+=c;
}
rep(q,1,n)rep(w,1,n)in(cl[q][w]),--cl[q][w];
rep(q,1,n)rep(w,1,n)in(val[q][w]);
int l=0,r=n,ans=-1;
while(l<=r) {
int mid=l+r>>1;
if(check(mid))r=mid-1,ans=mid;
else l=mid+1;
}
printf("%d\n",ans);
return 0;
}
「LOJ 6373」NOIP2017 普及组题目大融合的更多相关文章
- 「LOJ#10051」「一本通 2.3 例 3」Nikitosh 和异或(Trie
题目描述 原题来自:CODECHEF September Challenge 2015 REBXOR 1≤r1<l2≤r2≤N,x⨁yx\bigoplus yx⨁y 表示 ...
- 「LOJ#10056」「一本通 2.3 练习 5」The XOR-longest Path (Trie
#10056. 「一本通 2.3 练习 5」The XOR-longest Path 题目描述 原题来自:POJ 3764 给定一棵 nnn 个点的带权树,求树上最长的异或和路径. 输入格式 第一行一 ...
- [NOIP2017普及组]跳房子(二分,单调队列优化dp)
[NOIP2017普及组]跳房子 题目描述 跳房子,也叫跳飞机,是一种世界性的儿童游戏,也是中国民间传统的体育游戏之一. 跳房子的游戏规则如下: 在地面上确定一个起点,然后在起点右侧画 nn 个格子, ...
- P3956 [NOIP2017 普及组] 棋盘
P3956 [NOIP2017 普及组] 棋盘 题目 题目描述 有一个 m×m 的棋盘,棋盘上每一个格子可能是红色.黄色或没有任何颜色的.你现在要从棋盘的最左上角走到棋盘的最右下角. 任何一个时刻,你 ...
- NOIP2017普及组比赛总结
期中考总结&NOIP2017总结 2017年11月11日,我第二次参加NOIP普及组复赛.上一年,我的得分是250分,只拿到了二等奖.我便把目标定为拿到一等奖,考到300分以上. 早上8点多, ...
- NOIP2017普及组解题报告
刚参加完NOIP2017普及,只考了210,于是心生不爽,写下了这篇解题报告...(逃 第一次写博,望dalao们多多指导啊(膜 第一题score,学完helloworld的人也应该都会吧,之前好多人 ...
- NOIP2017普及组T2题解
还是神奇的链接 上面依然是题目. 这道题依然很简单,比起2015年的普及组t2好像还是更水一些. 不过这道题能讲的比第一题多. 我们一起来看一下吧! 这一题,我们首先将书的编号全部读入,存在一个数组里 ...
- noip2017普及组
过了这么久才来写博客,也是我这么一段时间都很低迷吧.... 老实来说,今年应该是要打提高组的...可还是打了普及组... 其实最猥琐的还是我连普及都写挂了,作为一个学了两年的人,图论,进阶dp都写过的 ...
- NOIP2017普及组初赛总结
去年,我普及组复赛翻车,居然没进一等奖,于是,今年,我只能再做一次普及组. 这次初赛我93.5分,居然是中山市第一--(中山市太弱了?) 其实我觉得我没考好. 比赛时第二题(计算机存储数据的基本单位是 ...
随机推荐
- 一行代码完成定时任务调度,基于Quartz的UI可视化操作组件 GZY.Quartz.MUI
前言 之前发布过第一个版本,有兴趣的可以去看看: NET Core 基于Quartz的UI可视化操作组件 GZY.Quartz.MUI 简介 GitHub开源地址:l2999019/GZY.Quart ...
- idea解决springboot项目中log4j漏洞升级问题
最近阿里云团队发现log4j漏洞,危险级别:严重,相关资讯 https://m.sohu.com/coo/hsdt/506958086_355140 https://www.sohu.com/a/50 ...
- Linux的基本目录结构
- 元宇宙(metaverse)中文社区-工程实践
欢迎访问元宇宙中文社区,在这里大家可以提问,回答,分享,诉说,一起构建一个元宇宙社区. 2021年"元宇宙"的这个词的火热程度在业内绝对不亚于疫情,趁着这个热度,本文记录了如何搭建 ...
- 编写Java程序,实现简单的五子棋博弈游戏(美和易思Java练习习题)
package com.qq.gb; import java.util.Scanner; public class GoBang { Scanner sc = new Scanner(System.i ...
- 1.spring系列之优雅的实现接口统一返回
好处 现在公司开发基本上都是以前后分离模式为主,所以要有个统一的数据格式,这样有什么好处呢? 能够提高前后端对接的效率(特别重要) 代码更加优雅和简洁 对于前端和后端维护更方便容易 实现(直接上代码) ...
- docker 容器大小查看及清理docker磁盘空间
本文为博主原创,转载请注明出处: 今天打开服务器下载文件时,发现服务器内存不足,并开始清理服务器内存,排查及清理方法如下: 1. 查看服务器内存大小: df -h 通过 df - ...
- 2 - 基于ELK的ElasticSearch 7.8.x技术整理 - java操作篇 - 更新完毕
3.java操作ES篇 3.1.摸索java链接ES的流程 自行创建一个maven项目 3.1.1.依赖管理 点击查看代码 <properties> <ES-version>7 ...
- CSS基础-5 伪类
一.伪类 我们以a标签为例 伪类标签分为4类 1. 设置超链接默认的样式 a:link {属性:值;.....} 或者 a { 属性: 值;} 推荐使用这种方式 2 ...
- Python_getattr+__import__ 实现动态加载模块、类对象或函数
__import__() 语法 __import__(name[, globals[, locals[, fromlist[, level]]]]) 参数 name -- 字符串,模块的导入路径 说明 ...