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的区间区间加上 ...
随机推荐
- CodeForces 931C Laboratory Work 水题,构造
*这种题好像不用写题解... 题意: 一个人要改动别人的实验记录,实验记录记录是一个集合 实验记录本身满足:$max(X)-min(X)<=2$ 改动结果要求: 1.新的集合平均值和之前的一样 ...
- Oracle服务器定位CPU使用率高的瓶颈(SQL)
1.首先用TOP命令监控系统资源,如果是AIX系统,就用topas,进入TOP命令的滚动刷新数据时,发现userCPU高达98%!! 保持top的状态下,按shift+p,可以将所有进程按CPU使用率 ...
- 关于flock
昨天在研究dropbear实现时,看到初始化脚本/etc/init.d/dropbear中有关于文件锁lock的内容,如下: lock /tmp/.switch2jffs mkdir -p /e ...
- centos7 docker使用https_proxy 代理配置
centos7 docker使用https_proxy 代理配置 背景: 内网的centos主机不能上网,通过同网段的windows设置代理上网,yum.conf配置http代理是可以的,但是dock ...
- configure.*和Makefile.*之间的关系
现在很多项目都在使用GUI编译器,Kdevelop\Eclipse等等,诚然它给我们提供了极大地便利,但我们仍需要简单了解编译的过程.本文旨在简单叙述由源码(*.cpp & *.h)经过编译得 ...
- ios中input获取焦点时的问题
1.获取焦点时,input会变大 解决办法是:font-size设置为32px以上 还有就是要在header里面加这一行代码:<meta name="viewport" co ...
- Confluence 6 尝试从 XML 备份中恢复时解决错误
错误可能是因为数据库突然不可访问而产生.也有可能是你备份文件有问题,你需要找到你 XML 备份文件中违反数据库规定的记录修改这个记录后再创建一个新的 XML 备份: 在实例开始恢复的时候,请按照下面的 ...
- ionic3 点击输入 框弹出白色遮罩 并把 界面顶到上面
这个蛋疼 问题 ,在android 上面遇到这种情况 ,键盘弹出的时候 总有一个白色的遮罩在后面出现,网上查了很久都没发现原因. 偶然发现一个方法 ,试下了下 问题解决了. 代码如下: IonicMo ...
- 1,环境的搭建,angular
也是学习一些皮毛,只是把这些经验记录下来而已. 至于angular有什么好处,或者有什么是什么,我就不多做介绍,自己可以去百度,肯定能找到更为详细的. 我使用的是google提供的angualr-cl ...
- JavaScript(JS)之Javascript对象
简介: 在JavaScript中除了null和undefined以外其他的数据类型都被定义成了对象,也可以用创建对象的方法定义变量,String.Math.Array.Date.RegExp都是Jav ...