BZOJ 1012 [JSOI2008]最大数maxnumber=听说是线段树

来源:互联网 发布:学通网络红尘ai教程 编辑:程序博客网 时间:2024/06/05 10:43

题目传送门:23333


听说是线段树标算,但我不知道为毛写了一个黑科技。


--------------------------

黑科技

维护一个递减栈,每次增加元素时,如果栈顶元素小于新增则弹出来保持递减性。

并且同时存下栈中元素的号码。

查询时从栈顶往下找,找到一个在L以内最大的输出即可。


--------------------------

以下论线段树标算

开始有n个元素,后来加入m个,于是以【1,n+m】为总区间建树。

加入元素变成了单点修改。

查询结尾变成了区间查询。

然后就会发现世界是那么美好!!


附黑科技代码:


#include <cstdio>#include <algorithm>#include <iostream>#include <windows.h>#define rep(j,k,l) for (int j=k;j<=l;j++)using namespace std;int a[200005],st[200005];int main(){int n,m,ans=0,l=0,ll=0;scanf("%d%d",&n,&m);while (n--){char ch=getchar();while (ch!='A'&&ch!='Q') ch=getchar();int k;scanf("%d",&k);if (ch=='A'){k=(k+ans)%m;ll++;a[ll]=k;while (l>0&&k>a[st[l]]) l--;l++;st[l]=ll;}else{int p=l;while (p>0&&k>=ll-st[p]+1)p--;ans=a[st[p+1]];printf("%d\n",ans);}}return 0;}


0 0
原创粉丝点击