jxoi2017
题解:
并不知道题目顺序就按照难度排序了
[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的更多相关文章
- 【BZOJ5321】[JXOI2017]加法(贪心)
[BZOJ5321][JXOI2017]加法(贪心) 题面 BZOJ 洛谷 题解 显然二分答案,算一下每个点至少要覆盖的次数.从左往右考虑如果这个点覆盖次数不够,就会选择覆盖这个点的.右端点最大的线段 ...
- JXOI2017颜色 解题报告
JXOI2017颜色 首先记录每个位置上颜色在序列中上次出现的位置 开两颗线段树,第一棵维护区间最大值,实际上是维护当前必须被删去的颜色的位置的最大值,第二棵则是维护区间和 首先倒着扫一遍,对于当前颜 ...
- [JXOI2017]颜色 线段树求点对贡献
[JXOI2017]颜色 题目链接 https://www.luogu.org/problemnew/show/P4065 题目描述 可怜有一个长度为 n 的正整数序列 Ai,其中相同的正整数代表着相 ...
- [BZOJ5011][JXOI2017]颜色
5011: [Jx2017]颜色 Time Limit: 30 Sec Memory Limit: 512 MBSubmit: 84 Solved: 46[Submit][Status][Disc ...
- 洛谷P4065 [JXOI2017]颜色(线段树)
题意 题目链接 Sol 线段树板子题都做不出来,真是越来越菜了.. 根据题目描述,一个合法区间等价于在区间内的颜色没有在区间外出现过. 所以我们可以对于每个右端点,统计最长的左端点在哪里,刚开始以为这 ...
- 洛谷P4064 [JXOI2017]加法(贪心 差分)
题意 题目链接 Sol 这题就是一个很显然的贪心... 首先二分一个答案,然后check是否可行.check的时候我们需要对每个位置\(i\),维护出所有左端点在\(i\)左侧,右端点在\(i\)右侧 ...
- 洛谷P4063 [JXOI2017]数列(dp)
题意 题目链接 Sol 这题想还是不难想的,就是写起来很麻烦,然后去看了一下loj的最短代码表示只能Orz 首先不难发现一条性质:能够选择的区间一定是不断收缩的,而且新的可选区间一定是旧区间的某个位置 ...
- JXOI2017颜色
题面 loj 分析 这道题非常妙啊 对于可保留区间[l, r] 枚举右端点r 考虑l的取值范围有两重约数 记颜色i出现的最右侧位置是\(max_i\) 最左侧位置是\(min_i\) r前最后一次出现 ...
- 洛谷P4064 加法 [JXOI2017] 贪心
正解:贪心 解题报告: 传送门! 首先最小值最大显然考虑二分?然后就二分一个值mid,从左往右考虑,对于小于等于mid的点显然可以求出这个点至少要加几次,然后找到覆盖这个点的右端点max的区间区间加上 ...
随机推荐
- button 去掉原生边框
button按钮触发 hover 时,自带边框会显示,尤其是 button 设置圆角时,如图: 解决办法: outline: 0;
- linux c 时间函数
1. time() 函数提供了 秒 级的精确度 time_t time(time_t * timer) 函数返回从UTC1970-1-1 0:0:0开始到现在的秒数 2. struct timespe ...
- web@前端--html,css,javascript简介、第一个页面(常用标签简介)
1.什么是标签#1.在HTML中规定标签使用英文的的尖括号即`<`和`>`包起来,如`<html>`.`<head>`.`<body>`都是标签,#2. ...
- Go学习笔记(只有链接)
Go学习笔记 link: https://blog.csdn.net/u011304970/article/details/69908641 仅作为记录使用.
- ios中input获取焦点时的问题
1.获取焦点时,input会变大 解决办法是:font-size设置为32px以上 还有就是要在header里面加这一行代码:<meta name="viewport" co ...
- python --------------网络(socket)编程
一.网络协议 客户端/服务器架构 1.硬件C/S架构(打印机) 2.软件C/S架构(互联网中处处是C/S架构):B/S架构也是C/S架构的一种,B/S是浏览器/服务器 C/S架构与socket的关系: ...
- mysql where和having的区别
简单描述:需要查询一个数量count,于是做分组查询后,发现有的数据没有过滤掉,于是就想加上过滤条件,就在group by后边写了where ,发现不好使,直接就报错了,查了一下,where只能写在g ...
- ZenMap扫描笔记
1.软件界面如下,ZenMap 扫描工具是kali linu中对WEB渗透扫描的一款工具
- linux 将自己的服务添加到系统service服务
前言 我们在linux上要启动一个程序得时候, 往往都是要写一堆路径, 找到要启动得服务程序, 再用 ./*** 启动服务. 那么我们有没有快速启动方法吗, 答案是肯定得 service 介绍 官方介 ...
- linux把程序做成系统服务并自启动
chkconfig命令主要用来更新(启动或停止)和查询系统服务的运行级信息.谨记chkconfig不是立即自动禁止或激活一个服务,它只是简单的改变了符号连接. 一.chkconfig 的使用语法1.c ...