题解:

并不知道题目顺序就按照难度排序了

[JXOI2017]加法

这是一道很简单的贪心

最小值最大二分答案

然后我们可以从左向右考虑每一个位置

如果他还需要+A

我们就从能覆盖它的区间中挑一个最右的

正确性比较显然

暴力是n^2logn*T的 可能比较虚

会发现覆盖操作可以用线段树维护,查询最右可以使用堆

n*logn^2*T

[JXOI2017]颜色

写的复杂了。。

正解比较简单

枚举右端点i,确定左端点j的可行位置

我们会发现,

对于maxv<=i,那么maxv>=j>=minv是不可行的

对于maxv>i,那么1<=j<=minv是不可行的

于是问题就变成了区间+1,区间-1,查询为0的个数

网上好像都是利用这个是1-x的所以变成从左到右枚举然后优先队列解决的

其实我们可以通过维护最小值个数,最小值来直接实现

我的方法是对于每一种颜色

我们可行的方案是在两个颜色空当之中,或者1个在最左边,1个在最右边

于是问题变成了n次覆盖一个矩形,最后查询矩形中为k的个数(其实查为0就和上面一样了)

注意区间2-1这样的是不符合的 所以可以先给不符合的-1

然后我们可以利用扫描线+线段树解决

// luogu-judger-enable-o2
#include <bits/stdc++.h>
using namespace std;
#define ll long long
#define rint register int
#define IL inline
#define rep(i,h,t) for (rint i=h;i<=t;i++)
#define dep(i,t,h) for (rint i=t;i>=h;i--)
#define me(x) memset(x,0,sizeof(x))
#define mid ((h+t)/2)
char ss[<<],*A=ss,*B=ss;
IL char gc()
{
return A==B&&(B=(A=ss)+fread(ss,,<<,stdin),A==B)?EOF:*A++;
}
template<class T>IL void read(T &x)
{
rint f=,c; while (c=gc(),c<||c>) if (c=='-') f=-; x=(c^);
while (c=gc(),c>&&c<) x=(x<<)+(x<<)+(c^); x*=f;
}
const int N=4e5+;
const int N2=N*;
int cnt;
struct re{
int a,b,c,d;
}p[N*];
int maxa[N2],lazy[N2],data[N2],a[N];
vector<int> ve[N];
IL void change(int h1,int t1,int h2,int t2,int k)
{
p[++cnt].a=h1,p[cnt].b=h2,p[cnt].c=t2,p[cnt].d=k;
p[++cnt].a=t1+,p[cnt].b=h2,p[cnt].c=t2,p[cnt].d=-k;
}
IL bool cmp(re x,re y)
{
return(x.a<y.a);
}
void build(int x,int h,int t)
{
maxa[x]=; data[x]=t-h+; lazy[x]=;
if (h==t) return;
build(x*,h,mid); build(x*+,mid+,t);
}
int cnt2=;
void insert(int x,int h,int t,int h1,int t1,int k)
{
if (h1>t1) return;
if (h1<=h&&t<=t1)
{
maxa[x]+=k; lazy[x]+=k; return;
}
if (lazy[x])
{
maxa[x*]+=lazy[x]; maxa[x*+]+=lazy[x];
lazy[x*]+=lazy[x]; lazy[x*+]+=lazy[x];
lazy[x]=;
}
if (h1<=mid) insert(x*,h,mid,h1,t1,k);
if (mid<t1) insert(x*+,mid+,t,h1,t1,k);
int t11=maxa[x*],t22=maxa[x*+];
if (t11<t22) maxa[x]=t22,data[x]=data[x*+];
else if (t11>t22) maxa[x]=t11,data[x]=data[x*];
else maxa[x]=t11,data[x]=data[x*+]+data[x*];
}
int main()
{
int T,n;
read(T);
rep(ttt,,T)
{
read(n);
rep(i,,n) ve[i].clear();
int m=;
rep(i,,n)
{
read(a[i]);
m=max(a[i],m);
ve[a[i]].push_back(i);
}
int k=m; cnt=;
rep(i,,m)
{
if (!ve[i].size())
{
k--; continue;
}
change(,ve[i][],ve[i][ve[i].size()-],n,);
int tmp=(int)(ve[i].size())-;
rep(j,,tmp)
change(ve[i][j]+,ve[i][j+]-,ve[i][j]+,ve[i][j+]-,);
change(,ve[i][]-,,ve[i][]-,);
change(ve[i][ve[i].size()-]+,n,ve[i][ve[i].size()-]+,n,);
}
rep(i,,n)
{
change(i,i,,i-,-);
}
sort(p+,p+cnt+,cmp);
ll ans=;
build(,,n);
rint j=;
rep(i,,n)
{
while (j<=cnt&&p[j].a<=i) insert(,,n,p[j].b,p[j].c,p[j].d),j++;
if (maxa[]==k) ans+=data[];
}
printf("%lld\n",ans);
}
return ;
}

jxoi2017的更多相关文章

  1. 【BZOJ5321】[JXOI2017]加法(贪心)

    [BZOJ5321][JXOI2017]加法(贪心) 题面 BZOJ 洛谷 题解 显然二分答案,算一下每个点至少要覆盖的次数.从左往右考虑如果这个点覆盖次数不够,就会选择覆盖这个点的.右端点最大的线段 ...

  2. JXOI2017颜色 解题报告

    JXOI2017颜色 首先记录每个位置上颜色在序列中上次出现的位置 开两颗线段树,第一棵维护区间最大值,实际上是维护当前必须被删去的颜色的位置的最大值,第二棵则是维护区间和 首先倒着扫一遍,对于当前颜 ...

  3. [JXOI2017]颜色 线段树求点对贡献

    [JXOI2017]颜色 题目链接 https://www.luogu.org/problemnew/show/P4065 题目描述 可怜有一个长度为 n 的正整数序列 Ai,其中相同的正整数代表着相 ...

  4. [BZOJ5011][JXOI2017]颜色

    5011: [Jx2017]颜色 Time Limit: 30 Sec  Memory Limit: 512 MBSubmit: 84  Solved: 46[Submit][Status][Disc ...

  5. 洛谷P4065 [JXOI2017]颜色(线段树)

    题意 题目链接 Sol 线段树板子题都做不出来,真是越来越菜了.. 根据题目描述,一个合法区间等价于在区间内的颜色没有在区间外出现过. 所以我们可以对于每个右端点,统计最长的左端点在哪里,刚开始以为这 ...

  6. 洛谷P4064 [JXOI2017]加法(贪心 差分)

    题意 题目链接 Sol 这题就是一个很显然的贪心... 首先二分一个答案,然后check是否可行.check的时候我们需要对每个位置\(i\),维护出所有左端点在\(i\)左侧,右端点在\(i\)右侧 ...

  7. 洛谷P4063 [JXOI2017]数列(dp)

    题意 题目链接 Sol 这题想还是不难想的,就是写起来很麻烦,然后去看了一下loj的最短代码表示只能Orz 首先不难发现一条性质:能够选择的区间一定是不断收缩的,而且新的可选区间一定是旧区间的某个位置 ...

  8. JXOI2017颜色

    题面 loj 分析 这道题非常妙啊 对于可保留区间[l, r] 枚举右端点r 考虑l的取值范围有两重约数 记颜色i出现的最右侧位置是\(max_i\) 最左侧位置是\(min_i\) r前最后一次出现 ...

  9. 洛谷P4064 加法 [JXOI2017] 贪心

    正解:贪心 解题报告: 传送门! 首先最小值最大显然考虑二分?然后就二分一个值mid,从左往右考虑,对于小于等于mid的点显然可以求出这个点至少要加几次,然后找到覆盖这个点的右端点max的区间区间加上 ...

随机推荐

  1. 使用cstdiofile在vs2010中无法写入中文的问题

    在VC2010环境下, 以下代码无法实现使用CStdioFile向文本文件中写入中文(用notepad.exe查看不到写入的中文) CStdioFile file; file.Open(…); fil ...

  2. AIX系统下sed的用法与实例——查询/打印/替换字符串并生成文件/删除

    sed是AIX中非常重要的文本流编辑器,它对输入的文本进行查询/打印/替换/删除等操作,并将结果写到标准输出.sed 命令包含很多功能,用于选择要修改的行,并只对选择的行作更改. 首先,使用sed命令 ...

  3. Android Day2

    紧接前一篇日记: 2.增加文本域 在<LinearLayout>中增加<EditText>元素,无格式设置的时候如下. <EditText android:id=&quo ...

  4. python连接kafka生产者,消费者脚本

    # -*- coding: utf-8 -*- ''''' 使用kafka-Python 1.3.3模块 # pip install kafka==1.3.5 # pip install kafka- ...

  5. svn:Item ‘XXXXXX’ is out of date

    问题描述:     工作副本没有更新到最新版本 svn: 提交失败(细节如下): svn: 目录 "D:\develop\workspace\gxcjx\src\main\resources ...

  6. 【原创】大数据基础之Benchmark(1)HiBench

    HiBench 7官方:https://github.com/intel-hadoop/HiBench 一 简介 HiBench is a big data benchmark suite that ...

  7. 用puttygen工具把私钥id_rsa转换成公钥id_rsa.ppk

    1 前言 有时候需要ppk格式的公钥,可以用putty来处理 2 步骤 1. 产生密钥 可以参考Gitlab的SSH配置(linux和windows双版本) $ ssh-keygen -t rsa - ...

  8. LuoGu P1541 乌龟棋

    题目传送门 乌龟棋我并不知道他为啥是个绿题0.0 总之感觉思维含量确实不太高(虽然我弱DP)(毛多弱火,体大弱门,肥胖弱菊,骑士弱梯,入侵弱智,沙华弱Dp) 总之,设计出来状态这题就很简单了 设 f[ ...

  9. 后RCNN时代的物体检测及实例分割进展

    https://mp.weixin.qq.com/s?__biz=MzA3MzI4MjgzMw==&mid=2650736740&idx=3&sn=cdce446703e69b ...

  10. day03 变量 运算符 基本数据类型 输出功能 格式化输出

    变量补充 变量的命名 1变量名的命名的大前提:应该能够反映出变量值所记录的状态 具体的1.变量名由字母数字下划线组成 2.不能以数字开头 3.不能使用关键字命名为变量名 两种写法 1.驼峰体(由字母组 ...