这题真是太神了!

考试的时候冲着四十分写了个$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. Ubuntu 16.04: How to install OpenCV

    参考:https://www.pyimagesearch.com/2016/10/24/ubuntu-16-04-how-to-install-opencv/ 步骤# 1:安装opencv的依赖项 本 ...

  2. YARN Architecture

    The fundamental idea of YARN is to split up the functionalities of resource management and job sched ...

  3. Reading table information for completion of table and column names

    mysql> use ad_detail_page;Reading table information for completion of table and column namesYou c ...

  4. mysql获取下一篇和上一篇文章的ID

    mysql获取上一篇和下一篇文章的ID只要在当前页面读取上一个和下一个的ID就可以了.假设当前ID为10:搜索上一个的ID:select  id  from table where id<10 ...

  5. 【Python】用Python打开csv和xml文件

    一.csv文件的读取1 #coding=utf-8 import csv with open("F:\\script\\py_scripts\\test2.csv","r ...

  6. 【Python】小练习

    1.python爬虫 (1)抓取一个新闻网上含有某一关键字的新闻,http://internasional.kompas.com/就是这个网站上面所有内容含有THAAD这个关键词的新闻 (2)爬取大众 ...

  7. SQL SERVER - 谁更改了SQL登录密码?

    转自:https://blog.sqlauthority.com/2016/04/03/sql-server-changed-password-sql-login-interview-question ...

  8. matlab常用方法

    1:matlab进行符号的虚数运算 直接使用符号 a+b*j运算,结果是一个角度值,不是复数. 可以使用  a+b*(1j)    进行运算. 如下 position(index,)=radius; ...

  9. 一行代码彻底禁用WordPress缩略图自动裁剪功能

    记得在博客分享七牛缩略图教程的时候,提到过 WordPress 默认会将上传的图片裁剪成多个,不但占用磁盘空间,也会拖慢网站性能,相当闹心! 当时也提到了解决办法: ①.关闭主题自带缩略图裁剪功能(若 ...

  10. 因子分析(Factor Analysis)

    原文地址:http://www.cnblogs.com/jerrylead/archive/2011/05/11/2043317.html 1 问题 之前我们考虑的训练数据中样例的个数m都远远大于其特 ...