BZOJ 1636: [Usaco2007 Jan]Balanced Lineup
2016-07-24 13:12
507 查看
方法很多
倍增,线段树,树状数组都是可以的,似乎还可以用splay?
维护区间最大值和最小值
推荐用倍增
虽然我写了树状数组。。。。
倍增,线段树,树状数组都是可以的,似乎还可以用splay?
维护区间最大值和最小值
推荐用倍增
虽然我写了树状数组。。。。
#include<cstdio> #include<cstring> #include<algorithm> #define g getchar() #define ll long long #define inf 0x3f3f3f3f using namespace std; inline ll read(){ ll x=0,f=1;char ch=g; for(;ch<'0'||ch>'9';ch=g)if(ch=='-')f=-1; for(;ch>='0'&&ch<='9';ch=g)x=x*10+ch-'0'; return x*f; } inline void out(ll x){ int a[25],wei=0; if(x<0)putchar('-'),x=-x; for(;x;x/=10)a[++wei]=x%10; if(wei==0){puts("0");return;} for(int j=wei;j>=1;--j)putchar('0'+a[j]); putchar('\n'); } int n,b[50005],a[50005],c[50005],Q; int init1(){ for(int i=1;i<=n;++i){ b[i]=a[i]; for(int j=1;j<i&-i;j<<=1) b[i]=max(b[i],b[i-j]); } } int query1(int l,int r){ int ans=a[r]; for(;;){ ans=max(ans,a[r]); if(r==l)break; for(r-=1;r-l>=r&-r;r-=r&-r) ans=max(ans,b[r]); } return ans; } int init2(){ for(int i=1;i<=n;++i){ c[i]=a[i]; for(int j=1;j<i&-i;j<<=1) c[i]=min(c[i],c[i-j]); } } int query2(int l,int r){ int ans=a[r]; for(;;){ ans=min(a[r],ans); if(l==r)break; for(r-=1;r-l>=r&-r;r-=r&-r) ans=min(ans,c[r]); } return ans; } int main(){ // freopen("","r",stdin); // freopen("","w",stdout); n=read();Q=read(); for(int i=1;i<=n;++i)a[i]=read(); init1(); init2(); for(;Q--;){ int l=read(),r=read(); out(query1(l,r)-query2(l,r)); } return 0; }
相关文章推荐
- LightOJ 1275 Internet Service Providers <一元二次函数的最值>
- Fragment里嵌套Fragment,父fragment有缓存布局加载不出来的问题
- java关键字static
- osx + win7 双系统安装
- 三人行之C从零开始
- javaweb
- NAT原理
- 卡方检验(Chi-square test/Chi-Square Goodness-of-Fit Test)
- 1029. 旧键盘(20)
- Source Insight 常用设置和快捷键大全
- JAVA实践并查集
- LeetCode 9. Palindrome Number
- [LEETCODE] 287. Find the Duplicate Number
- BestCoder Round #84
- javaweb
- 搜索树判断
- File类的使用1
- UVALive 7270 Osu! Master 水题
- 骨牌覆盖去除切割线的情况(DP+容斥原理)
- gitlab 安装报错:Could not find modernizr-2.6.2 in any of the sources