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的区间区间加上 ...
随机推荐
- ACM Computer Factory POJ - 3436 网络流拆点+路径还原
http://poj.org/problem?id=3436 每台电脑有$p$个组成部分,有$n$个工厂加工电脑. 每个工厂对于进入工厂的半成品的每个组成部分都有要求,由$p$个数字描述,0代表这个部 ...
- <杂记>Android Studio 3.0-3.1 汉化包 (转载)
JetBrains 系列软件汉化包 关键字: Android Studio 3.0-3.1 汉化包 CLion 2018.1 汉化包 GoLand 2017.3.2-2018.1 汉化包 Intell ...
- mysqlfrm初步使用
这个工具也就是读取frm文件生成建表语句默认的模式是再生个实例,使用--basedir选项或指定--server选项来连接到已经安装的实例.这种过程不会改变原始的.frm文件.该模式也需要指定--po ...
- python学习第38天
mysql的存储引擎(innodb,myisam)mysql支持的数据类型约束表的创建\删除\修改\查看表结构表与表之间的关系
- jmeter4.0的汉化
一,刚刚安装好,我们看到的是这个界面: 二,option-——>choose language -——>Chinese simplified,然后就可以啦!
- Day7--------------IP地址与子网划分
1.ip地址:32位 172.16.45.10/16 网络位:前十六位是网络位 主机位:后16位是主机位 网络地址:172.16.0.0 主机地址:172.16.45.10 A类: 0NNNNN ...
- linux命令tar压缩解压
tar -c: 建立压缩档案-x:解压-t:查看内容-r:向压缩归档文件末尾追加文件-u:更新原压缩包中的文件 这五个是独立的命令,压缩解压都要用到其中一个,可以和别的命令连用但只能用其中一个.下面的 ...
- Jenkins二 安装gitlab及其使用
git --version 如果没有安装git直接源码安装即可,如果安装了先删除原来的git. yum -y remove git先安装编译git需要的包. yum install zlib-deve ...
- PHP7运行环境搭建(Windows7)
注:本文来源于< PHP7运行环境搭建(Windows7) > php7号称能直追facebook的HHVM,为了体验一把传说中的高性能,我特意在本地电脑上尝试着安装了php7, ...
- Confluence 6 恢复一个站点
这个页面对如何从一个 XML 导出文件中恢复到一个已经存在的 Confluence 站点进行描述. 如果你希望导入数据倒一个新的站点,请参考 restoring from backup during ...