Zip-line Codeforces - 650D || 风筝
https://codeforces.com/contest/650/problem/D
原题?
http://210.33.19.103/contest/1024/problem/2
4s 520M


题解很明白了:

当初想错了,想用stormwind的做法去做,发现要维护
给出数组a,f,g
j<i<k,a[j]<a[k]
对于每个i,求f[j]+g[k]最大值
维护了极其长的时间,啥也没维护出来。。。
错误记录:
1.第一次用lower_bound离散化,出了一些奇怪的小错误(关键是小数据根本测不出错..)
2.主席树卡空间,只好强行改成不可持久化的
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<vector>
#include<set>
using namespace std;
#define fi first
#define se second
#define mp make_pair
#define pb push_back
typedef long long ll;
typedef unsigned long long ull;
typedef pair<int,int> pii;
int ld,rd;
namespace S
{ #define lc (num<<1)
#define rc (num<<1|1)
const int N=;
int maxn[N];
void clr(){memset(maxn,,sizeof(maxn));}
int qmax(int L,int R,int l,int r,int num)
{
if(L<=l&&r<=R) return maxn[num];
int mid=l+((r-l)>>);int ans=ld;
if(L<=mid) ans=max(ans,qmax(L,R,l,mid,lc));
if(mid<R) ans=max(ans,qmax(L,R,mid+,r,rc));
return ans;
}
void setmaxx(int L,int x,int l,int r,int num)
{
if(l==r)
{
maxn[num]=max(maxn[num],x);
return;
}
int mid=l+((r-l)>>);
if(L<=mid) setmaxx(L,x,l,mid,lc);
else setmaxx(L,x,mid+,r,rc);
maxn[num]=max(maxn[lc],maxn[rc]);
} }
int f[],g[];
int an1[];
int a[];
bool onlis[];
int n,m;
int lis;
int tmp[];
struct QQ
{
int fi,se,n;
}q[];
bool c1(const QQ &a,const QQ &b){return a.fi<b.fi;}
bool c3(const QQ &a,const QQ &b){return a.n<b.n;}
int tt[],t1[],t2[];
int main()
{
int i,j;
scanf("%d%d",&n,&m);
//n=400000;m=400000;
for(i=;i<=n;i++)
{
scanf("%d",&a[i]);
//a[i]=rand();
tt[++tt[]]=a[i];
}
for(i=;i<=m;i++)
{
scanf("%d%d",&q[i].fi,&q[i].se);
//q[i].fi=rand()%n+1;q[i].se=rand();
q[i].n=i;
tt[++tt[]]=q[i].se;
}
sort(tt+,tt+tt[]+);tt[]=unique(tt+,tt+tt[]+)-tt-;
for(i=;i<=n;i++) a[i]=lower_bound(tt+,tt+tt[]+,a[i])-tt;
for(i=;i<=m;i++) q[i].se=lower_bound(tt+,tt+tt[]+,q[i].se)-tt;
/*
for(i=1;i<=n;i++)
if(a[i]<=0||a[i]>tt[0])
exit(-1);
*/
ld=;rd=tt[]+;
//printf("6t%d %d\n",ld,rd);
sort(q+,q+m+,c1);
for(i=,j=;i<=n;i++)
{
//printf("1t%d %d %d %d\n",ld,a[i]-1,ld,rd);
f[i]=S::qmax(ld,a[i]-,ld,rd,)+;
while(j<=m&&q[j].fi<=i)
{
t1[q[j].n]=S::qmax(ld,q[j].se-,ld,rd,)+;
++j;
}
S::setmaxx(a[i],f[i],ld,rd,);
}
S::clr();
for(i=n,j=m;i>=;i--)
{
g[i]=S::qmax(a[i]+,rd,ld,rd,)+;
while(j>&&q[j].fi>=i)
{
t2[q[j].n]=S::qmax(q[j].se+,rd,ld,rd,)+;
--j;
}
S::setmaxx(a[i],g[i],ld,rd,);
}
for(i=;i<=n;i++)
lis=max(lis,f[i]);
//for(i=1;i<=n;i++)
// printf("ft%d\n",f[i]);
//for(i=1;i<=n;i++)
// printf("gt%d\n",g[i]);
S::clr();
for(i=n;i>=;i--)
{
onlis[i]=(S::qmax(a[i]+,rd,ld,rd,)+f[i])==lis;
if(onlis[i])
{
++tmp[f[i]];
S::setmaxx(a[i],g[i],ld,rd,);
}
}
for(i=;i<=n;i++)
if(onlis[i]&&tmp[f[i]]==)
an1[i]=lis-;
else
an1[i]=lis;
sort(q+,q+m+,c3);
for(i=;i<=m;i++)
{
//printf("1t%d %d\n",t1[i],t2[i]);
printf("%d\n",max(t1[i]+t2[i]-,an1[q[i].fi]));
}
return ;
}
Zip-line Codeforces - 650D || 风筝的更多相关文章
- CodeForces - 650D:Zip-line (LIS & DP)
Vasya has decided to build a zip-line on trees of a nearby forest. He wants the line to be as long a ...
- Psychos in a Line CodeForces - 319B (单调栈的应用)
Psychos in a Line CodeForces - 319B There are n psychos standing in a line. Each psycho is assigned ...
- codeforces 650D D. Image Preview (暴力+二分+dp)
题目链接: http://codeforces.com/contest/651/problem/D D. Image Preview time limit per test 1 second memo ...
- Day8 - A - Points on Line CodeForces - 251A
Little Petya likes points a lot. Recently his mom has presented him n points lying on the line OX. N ...
- Codeforces 650D - Zip-line(树状数组)
Codeforces 题目传送门 & 洛谷题目传送门 我怕不是个 nt--一开始忽略了"询问独立"这个条件--然后就一直在想有什么办法维护全局 LIS--心态爆炸 首先离散 ...
- codeforces 650D. Zip-line 线段树
题目链接 题目的意思很简单, 就是给你n个数, m个询问, 每次询问修改某一个位置的值, 然后问你修改完之后数列的lis是多少. 询问独立. 对于原数列, 我们将它离散化, 令dp1[i]为以i为结尾 ...
- Codeforces Round #345 (Div. 1) D. Zip-line 上升子序列 离线 离散化 线段树
D. Zip-line 题目连接: http://www.codeforces.com/contest/650/problem/D Description Vasya has decided to b ...
- codeforces #345 (Div. 1) D. Zip-line (线段树+最长上升子序列)
Vasya has decided to build a zip-line on trees of a nearby forest. He wants the line to be as long a ...
- 【Linux】解压分卷压缩的zip文件
例如linux.zip.001, linux.zip.002, linux.zip.003. 1. cat linux.zip* > linux.zip #合并为一个zip包. 2. unzip ...
随机推荐
- 2U网络机箱的尺寸是多少,4U网络机箱的尺寸是多少
厚度以4.445cm为基本单位.1U就是4.445cm,2U则是1U的2倍为8.89cm.48.26cm=19英寸,如果是标准的机架式设备,宽应该是满足这个标准的.纵深的话 有600mm或者800mm ...
- centos 7 / 6 smokeping安装
官网 值得拥有:http://oss.oetiker.ch/smokeping/doc/reading.en.html 安装依赖包 1 2 yum -y install perl perl-Net-T ...
- servlet理论学习
servlet是和凭条无关的服务器端的组件,它运行在servlet容器中,servlet容器负责servlet和客户的通信以及调用servlet方法.servlet和客户的通信是采用“请求和响应的模式 ...
- BZOJ-2257:瓶子和燃料(裴蜀定理)
jyy就一直想着尽快回地球,可惜他飞船的燃料不够了. 有一天他又去向火星人要燃料,这次火星人答应了,要jyy用飞船上的瓶子来换.jyy的飞船上共有 N个瓶子(1<=N<=1000) ,经过 ...
- kali本機安裝openvas的血淚史復盤
安裝openvas的血淚史 因爲學習的需要,需要裝openvas,但是在虛擬機裏面,無論怎麼更新跟新源,總是會有問題,一氣之下,便不用虛擬機了,將自己的物理機刷成了kali機,從此便進了一個大坑. 安 ...
- [LeetCode] Longest Valid Parentheses -- 挂动态规划羊头卖stack的狗肉
(Version 1.3) 这题在LeetCode上的标签比较有欺骗性,虽然标签写着有DP,但是实际上根本不需要使用动态规划,相反的,使用动态规划反而会在LeetCode OJ上面超时.这题正确的做法 ...
- ADB命令小结
)adb devices //查看启动的所有设备 )adb kill-server //重启设备 )adb start-server //启动设备 )adb -s emulator-(通过 adb d ...
- Cube 数据 与 DW 数据对应不上
场景: 时间维度表:字段(日期) 收费事实表:字段(金额,收费日期,就诊编号) 管理:使用维度表的 日期字段与事实表的 收费日期字段 进行关联,建立多维度数据集. 问题: DW : 9月份 ...
- ununtu 下安装 Nvidia 显卡驱动
本人电脑硬件配置:CPU : AMD Athlon(tm) II X2 215 Processor × 2 显示卡 : GeForce 6150SE nForce 430/integrated/SSE ...
- $.ajax数据传输成功却执行失败的回调函数
这个问题迷惑了我好几天,都快要放弃了,功夫不负有心人,最终成功解决,下面写一下我的解决方法. 我传的数据是json类型的,执行失败的回调函数是因为从后台传过来的数据不是严格的json类型,所以才会不执 ...