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的区间区间加上 ...
随机推荐
- C# 对话框使用整理
1.保存文件对话框 SaveFileDialog saveFile = new SaveFileDialog(); saveFile.Title = "save file"; sa ...
- 二、消息队列之如何在C#中使用RabbitMQ
1.什么是RabbitMQ.详见 http://www.rabbitmq.com/. 作用就是提高系统的并发性,将一些不需要及时响应客户端且占用较多资源的操作,放入队列,再由另外一个线程,去异步处理这 ...
- CodeVs 3150 (大数 + 递推)
#include<iostream> #include<cstdio> #include<cstring> #include<string> #incl ...
- js获取当前星期几
使用Date对象的getDay方法可以获取当前日期的星期数. getDay() 方法可返回表示星期的某一天的数字. 示例: var date = new Date(); alert(date.getD ...
- python-包及日志模块使用
一.包 1.包就是一个保护有__init__.py文件的文件夹,包的本质就是一种模块,即包是用来导入使用的,包内部包含的文件也都是用来被导入使用的.包是为了更好组织好模块,就是一个文件夹. 注:在py ...
- Win10 SQL Server 2017安装教程
Win10 SQL Server 2017安装教程 1:下载地址 2:开始安装 1:安装环境预备说明 还要注意就是要先下载这个VC++的更新,可以解决服务器安装不上的问题,下载链接 :Microsof ...
- ORACL内部异常:
ORACL内部异常: ORA-00001: 违反唯一约束条件 (.) ORA-00017: 请求会话以设置跟踪事件 ORA-00018: 超出最大会话数 ORA-00019: 超出最大会话许可数 OR ...
- Ehcache
前言:设计一套缓存框架需要关注的要素 本文来源:RayChase 的<设计一套缓存框架需要关注的要素> 最近关注了一些缓存框架的特性和实现,包括OSCache.JCS.Ehcache.M ...
- 使用应用链接来连接 Jira 和 Confluence 6
请参考 Linking to Another Application 页面中的内容来设置如何让 Confluence 连接到你的 Jira 应用,这个过程只需要一次就可以了. 如果你计划使用 Jira ...
- Confluence 6 修改站点图标(favicon)
你也可以修改你站点的图标(这个站点图标将会在你浏览器的标签页上显示).你需要 Confluence 的管理员权限才能进行修改. 进入 > 基本配置(General Configuration) ...