[省选模拟]array
这题真是太神了!
考试的时候冲着四十分写了个$O(\frac{N^3logN}{32})$的制杖算法。
然后就狠狠的T掉了。如果没有充分的理解单调性和应用单调性就只有10分的傻逼分拿了。
首先考虑枚举两维,那么随着第二维的递增,第三维必定不上升,搞个指针瞎贪贪就是$O(N^2)$了(而我却SB的硬上了个二分)
然后考虑再优化掉一维,我们把值离散化后求出每个值在A,B,C的第一次出现位置,然后按在A的出现位置递减排序。
那么我们枚举A,这样就只用考虑枚举到的之前的情况了,因为枚举到的后面已经被覆盖了。
接着考虑如果一个点的B和C都同时小于另一个点,那么这个点显然是没有用的。
这样的话我们先考虑一个脑残点的算法,每次枚举A的时候把剩下的元素按B排序,这样的话每次把B放到单调队列里同时剔除没有用的元素,这样就必定得到一个B不递减,C不递增的单调队列。
而且这个单调队列里和枚举到的点相邻的点的B和C就构成了答案。
那么显然不能按照上面来,太暴力了。我们开一个set来维护单调队列,开一个multiset来维护答案即可。
//array
//by Cydiater
//2017.2.17
#include <iostream>
#include <queue>
#include <map>
#include <cstring>
#include <string>
#include <algorithm>
#include <cstdio>
#include <cstdlib>
#include <iomanip>
#include <cmath>
#include <ctime>
#include <bitset>
#include <set>
#include <vector>
#include <complex>
using namespace std;
#define ll long long
#define up(i,j,n) for(int i=j;i<=n;i++)
#define down(i,j,n) for(int i=j;i>=n;i--)
#define cmax(a,b) a=max(a,b)
#define cmin(a,b) a=min(a,b)
#define pii pair<int,int>
#define FILE "array"
const int MAXN=1e6+5;
const int oo=1e7+5;
inline int read(){
char ch=getchar();int x=0,f=1;
while(ch>'9'||ch<'0'){if(ch=='-')f=-1;ch=getchar();}
while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();}
return x*f;
}
int N,A[MAXN],B[MAXN],C[MAXN],top=0,num[MAXN],ans=oo;
struct Array{
int a,b,c;
Array(){a=b=c=oo-1;}
}d[MAXN];
multiset<int>ANS;
set<pii>Q;
namespace solution{
bool cmp(Array x,Array y){return x.a>y.a;}
void Insert(pii now){
set<pii>::iterator i,j,k;
cout<<(*ANS.begin())<<endl;
k=Q.lower_bound(now);
if(k->second>=now.second)return;
Q.insert(now);i=Q.find(now);j=i;j--;
ANS.erase(ANS.find(j->first+k->second));
ANS.insert(now.first+k->second);
ANS.insert(j->first+now.second);
//cout<<(*ANS.begin())<<endl;
while(j->second<=now.second){
i=j;j--;
ANS.erase(ANS.find(j->first+i->second));
ANS.erase(ANS.find(i->first+now.second));
Q.erase(i);
ANS.insert(j->first+now.second);
//cout<<(*ANS.begin())<<endl;
}
}
void Prepare(){
N=read();
up(i,1,N)num[++top]=A[i]=read();
up(i,1,N)num[++top]=B[i]=read();
up(i,1,N)num[++top]=C[i]=read();
sort(num+1,num+top+1);
top=unique(num+1,num+top+1)-(num+1);
up(i,1,N)A[i]=lower_bound(num+1,num+top+1,A[i])-num;
up(i,1,N)B[i]=lower_bound(num+1,num+top+1,B[i])-num;
up(i,1,N)C[i]=lower_bound(num+1,num+top+1,C[i])-num;
down(i,N,1)d[A[i]].a=i;
down(i,N,1)d[B[i]].b=i;
down(i,N,1)d[C[i]].c=i;
sort(d+1,d+top+1,cmp);
}
void Solve(){
Q.insert(make_pair(0,oo));
Q.insert(make_pair(oo,0));
ANS.insert(0);
cmin(ans,d[1].a);
d[top+1].a=0;
up(i,1,top){
Insert(make_pair(d[i].b,d[i].c));
//cout<<d[i+1].a<<' '<<(*ANS.begin())<<endl;
cmin(ans,d[i+1].a+(*ANS.begin()));
}
cout<<ans<<endl;
}
}
int main(){
freopen(FILE".in","r",stdin);
//freopen(FILE".out","w",stdout);
using namespace solution;
Prepare();
Solve();
return 0;
}
[省选模拟]array的更多相关文章
- 【洛谷比赛】[LnOI2019]长脖子鹿省选模拟赛 T1 题解
今天是[LnOI2019]长脖子鹿省选模拟赛的时间,小编表示考的不怎么样,改了半天也只会改第一题,那也先呈上题解吧. T1:P5248 [LnOI2019SP]快速多项式变换(FPT) 一看这题就很手 ...
- 「HGOI#2019.4.19省选模拟赛」赛后总结
t1-Painting 这道题目比较简单,但是我比较弱就只是写了一个链表合并和区间DP. 别人的贪心吊打我的DP,嘤嘤嘤. #include <bits/stdc++.h> #define ...
- 省选模拟赛第四轮 B——O(n^4)->O(n^3)->O(n^2)
一 稍微转化一下,就是找所有和原树差距不超过k的不同构树的个数 一个挺trick的想法是: 由于矩阵树定理的行列式的值是把邻接矩阵数值看做边权的图的所有生成树的边权乘积之和 那么如果把不存在于原树中的 ...
- NOI2019省选模拟赛 第五场
爆炸了QAQ 传送门 \(A\) \(Mas\)的童年 这题我怎么感觉好像做过--我记得那个时候还因为没有取\(min\)结果\(100\to 0\)-- 因为是个异或我们肯定得按位考虑贡献了 把\( ...
- NOI2019省选模拟赛 第六场
传送门 又炸了-- \(A\) 唐时月夜 不知道改了什么东西之后就\(A\)掉了\(.jpg\) 首先,题目保证"如果一片子水域曾经被操作过,那么在之后的施法中,这片子水域也一定会被操作&q ...
- 省选模拟赛 arg
1 arg (arg.cpp/in/out, 1s, 512MB)1.1 Description给出一个长度为 m 的序列 A, 请你求出有多少种 1...n 的排列, 满足 A 是它的一个 LIS. ...
- 【NOI省选模拟】小奇的花园
「题目背景」 小奇在家中的花园漫步时,总是会思考一些奇怪的问题. 「问题描述」 小奇的花园有n个温室,标号为1到n,温室以及以及温室间的双向道路形成一棵树. 每个温室都种植着一种花,随着季节的变换,温 ...
- [JZOJ6257] 【省选模拟8.9】修路
题目 题目大意 有一堆点,每个点都有其权值\(c_i\). 每次插入边\((u,v)\),\(u\)和\(1\)连通,\(v\)和\(1\)不连通.最后保证形成一棵树. 每次插入的时候询问\(1\)到 ...
- @省选模拟赛03/16 - T3@ 超级树
目录 @description@ @solution@ @accepted code@ @details@ @description@ 一棵 k-超级树(k-SuperTree) 可按如下方法得到:取 ...
随机推荐
- 计蒜客 30990 - An Olympian Math Problem - [简单数学题][2018ICPC南京网络预赛A题]
题目链接:https://nanti.jisuanke.com/t/30990 Alice, a student of grade 6, is thinking about an Olympian M ...
- Oracle核心技术之 SQL TRACE
1.SQL TRACE说明: 参数类型 布尔型 缺省值 false 参数类别 动态 取值范围 True|false 2.类型 1)sql trace参数:alter system改变对全局进程影响,如 ...
- 学习计划 mysql 用户管理与权限
最近在学习数据库的 主从复制 里面涉及到了关于用户及其管理权限的赋予,之前一直没有认真的学习这个. 现在想具体的学习一下. -- 为什么 数据库 要实现多用户管理? 举个最简单的例子,你需要和第三方做 ...
- 单例模式:Qt本身就提供了专门的宏 Q_GLOBAL_STATIC 通过这个宏不但定义简单,还可以获得线程安全性
标题起的是有点大 主要是工作和学习中,遇到些朋友,怎么说呢,代码不够Qt化 可能是由于他们一开始接触的是 Java MFC 吧 接触 Qt 7个年头了 希望我的系列文章能抛砖引玉吧 单例模式 很多人洋 ...
- 【linux & &&命令】&后台(并行)命令 &&串行命令
& 放在一个命令末尾,可以将这个命令放到后台执行.放到后台后主进程将继续向下执行,后台命令将与主进程并行执行. && 放在一个命令末尾,与什么都没有单纯换行实际效果相同,等待 ...
- json数据爬虫。requests实现
get请求 import json import requests # url = "https://www.mamalaile.cn/mamalailegw/page/waiterList ...
- PHP解决搜索时在URL地址栏输入中文字符搜索结果出现乱码
这 个问题的出现的前提是本站代码采用utf-8格式,php空间当页面停留在搜索页面时,在浏览器的地址栏输入中文的关键字进行搜索时会出现乱码,在网上查找资料说 明,是因为浏览器默认将url中的中文字符编 ...
- github多人协同使用。
点击 一:自己跟随别人的项目进行开发 1:首先登陆github,找到自己协同开发的项目. 例如:CrossMountain 的we-pay项目 ,点击 fork,该项目就在自己的账号下面了. 2:在 ...
- jquery closest & parent比较
.closest() .parents() 从当前元素开始 从父元素开始 沿 DOM 树向上遍历,直到找到已应用选择器的一个匹配为止. 沿 DOM 树向上遍历,直到文档的根元素为止,将每个祖先元素添加 ...
- java selenium webdriver处理JS操作窗口滚动条
未经作者允许,禁止转载!!! java selenium webdriver处理JS操作窗口滚动条 java selenium webdriver处理JS操作窗口滚动条 import org.open ...