「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分,居然是中山市第一--(中山市太弱了?) 其实我觉得我没考好. 比赛时第二题(计算机存储数据的基本单位是 ...
随机推荐
- McGan: Mean and Covariance Feature Matching GAN
目录 概 主要内容 Mean Matching IPM prime dual Covariance Feature Matching IPM prime dual 算法 代码 Mroueh Y, Se ...
- N-Empress
全排列 基本思想:递归.散列 代码实现 #include<cstdio> const int maxn = 11; int n, P[maxn], hashTable[11] = {fal ...
- 【】JSON语法RFC4627
Network Working Group D. Crockford Request for Comments: 4627 JSON.org Category: Informational July ...
- Zookeeper基础教程(一):认识Zookeeper
引用百度百科的话 ZooKeeper是一个分布式的,开放源码的分布式应用程序协调服务,是Google的Chubby一个开源的实现,是Hadoop和Hbase的重要组件.它是一个为分布式应用提供一致性服 ...
- VUE3 之 键盘事件
1. 概述 老话说的好:宁愿自己吃亏,也不让他人吃亏. 言归正传,今天我们来聊聊 VUE3 的 键盘事件. 2. 键盘事件 2.1 敲击任意键触发事件 <body> <div id= ...
- Docker下安装Elasticsearch、ik分词器、kibana
1:使用docker拉取Elasticsearch镜像 docker pull elasticsearch:7.12.0(不加版本号默认是最新版本) 2:查看是否成功下载镜像 docker image ...
- sqlserver - 查出的结果集,集成为json串放在一个字段里
1.效果 2.sql SELECT top 20 (select [name] as [名字] from staffBasicInfo For JSON PATH,ROOT('第一级key')) k ...
- spring security 动态 修改当前登录用户的 权限
1.前言 spring security 可以获取当前登录的用户信息,同时提供了接口 来修改权限列表信息 , 使用这个方法 ,可以动态的修改当前登录用户权限. 那么问题来了... 如果我是管理员 ,如 ...
- 微信小程序开发 --- 小白之路 --- 心得
1.前言 今天 ,发现我的饭卡不见了....悲催 ,看了一下学校的微信小程序,查了下我这饭卡的流水记录,嗯...最后出现的地方在洗澡房... 好吧,扯远了,虽然没找到,可是突发奇想 ,小程序挺方便的, ...
- Cookie.Session到Token和JWT
一.session和cookie: 现在一般都是session和cookie一起用,一起提.但是他们俩其实不是一定要在一起. session的产生原因是,http协议是无状态的 这就导致了,不同的用户 ...