这题真是太神了!

考试的时候冲着四十分写了个$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的更多相关文章

  1. 【洛谷比赛】[LnOI2019]长脖子鹿省选模拟赛 T1 题解

    今天是[LnOI2019]长脖子鹿省选模拟赛的时间,小编表示考的不怎么样,改了半天也只会改第一题,那也先呈上题解吧. T1:P5248 [LnOI2019SP]快速多项式变换(FPT) 一看这题就很手 ...

  2. 「HGOI#2019.4.19省选模拟赛」赛后总结

    t1-Painting 这道题目比较简单,但是我比较弱就只是写了一个链表合并和区间DP. 别人的贪心吊打我的DP,嘤嘤嘤. #include <bits/stdc++.h> #define ...

  3. 省选模拟赛第四轮 B——O(n^4)->O(n^3)->O(n^2)

    一 稍微转化一下,就是找所有和原树差距不超过k的不同构树的个数 一个挺trick的想法是: 由于矩阵树定理的行列式的值是把邻接矩阵数值看做边权的图的所有生成树的边权乘积之和 那么如果把不存在于原树中的 ...

  4. NOI2019省选模拟赛 第五场

    爆炸了QAQ 传送门 \(A\) \(Mas\)的童年 这题我怎么感觉好像做过--我记得那个时候还因为没有取\(min\)结果\(100\to 0\)-- 因为是个异或我们肯定得按位考虑贡献了 把\( ...

  5. NOI2019省选模拟赛 第六场

    传送门 又炸了-- \(A\) 唐时月夜 不知道改了什么东西之后就\(A\)掉了\(.jpg\) 首先,题目保证"如果一片子水域曾经被操作过,那么在之后的施法中,这片子水域也一定会被操作&q ...

  6. 省选模拟赛 arg

    1 arg (arg.cpp/in/out, 1s, 512MB)1.1 Description给出一个长度为 m 的序列 A, 请你求出有多少种 1...n 的排列, 满足 A 是它的一个 LIS. ...

  7. 【NOI省选模拟】小奇的花园

    「题目背景」 小奇在家中的花园漫步时,总是会思考一些奇怪的问题. 「问题描述」 小奇的花园有n个温室,标号为1到n,温室以及以及温室间的双向道路形成一棵树. 每个温室都种植着一种花,随着季节的变换,温 ...

  8. [JZOJ6257] 【省选模拟8.9】修路

    题目 题目大意 有一堆点,每个点都有其权值\(c_i\). 每次插入边\((u,v)\),\(u\)和\(1\)连通,\(v\)和\(1\)不连通.最后保证形成一棵树. 每次插入的时候询问\(1\)到 ...

  9. @省选模拟赛03/16 - T3@ 超级树

    目录 @description@ @solution@ @accepted code@ @details@ @description@ 一棵 k-超级树(k-SuperTree) 可按如下方法得到:取 ...

随机推荐

  1. Eigen中的基本函数 及其对应的matlab函数

    原文地址C++矩阵库 Eigen 快速入门 不仅有函数的基本形式,还有对应的matlab函数,用起来很方便. Eigen 矩阵定义 #include <Eigen/Dense> Matri ...

  2. angular2新建的项目上传github

    前提1.git配置好,参见博文 git常用操作 2.angular2安装配置好,这个网上有很多教程,就不多说了,参见angular2快速起步 需要注意的是,大部分问题都是网络问题. 3.新建一个ng项 ...

  3. Qt Creator 4.3.0,Quick Designer里面也看以同时看到和编辑qml code了(Qt5.9的配套IDE)

    作者:Summer Fang链接:https://www.zhihu.com/question/60486611/answer/177584284来源:知乎著作权归作者所有.商业转载请联系作者获得授权 ...

  4. pyqt5核心-信号与槽(第二弹)

    果: from PyQt5 import QtCore, QtGui, QtWidgets class Ui_Form(object): def setupUi(self, Form): Form.s ...

  5. 64位windows 7下配置TortoiseGit(转)

    原文:http://our2848884.blog.163.com/blog/static/146854834201152325233854/ 最近感觉自己电脑上的代码太乱了,东一块.西一块……于是决 ...

  6. util date 转 sql date

    JAVA 处理时间 - java.sql.Date.java.util.Date与数据库中的Date字段的转换方法,以及util包下的Date类与字符串的相互转换在java环境中使用的Date时间类通 ...

  7. Idempotent --------幂等

    1.在某二元运算下,幂等元素是指被自己重复运算的结果等于它自己的元素.例如,乘法下唯一两个幂等实数为0和1.

  8. sql server作业管理查看/进程管理查看命令

    一.作业管理 (1) select * from msdb.dbo.sysjobhistory   可以查看作业的历史记录 (2) select * from msdb.dbo.sysjobs   查 ...

  9. cocos2d-x教程3:用php或DOS批处理命令来转换文件和解压缩zip

    在cocos2d-x使用中,须要不停的转换文件和压缩或解压文件.假设全人工来做,太麻烦了,且easy出错. 我如今把一些用的到批处理贴出来,供大家使用 自己主动把dat文件按数字排序重命名gz.DOS ...

  10. iOS10网络权限数据

    参考地址:1.http://www.cocoachina.com/ios/20180723/24274.html   https://blog.csdn.net/wang_bo_justone/art ...