[线段树 单调栈] UNR #1 争夺圣杯
2016-07-20 09:18
232 查看
争夺圣杯
用单调栈求出left right可以发现每个点的贡献是关于left right的分段函数
然后就是分段函数累加求和
当时打的线段树
看了题解涨姿势了 可以差分 做到O(n)
#include<cstdio> #include<cstdlib> #include<algorithm> using namespace std; typedef pair<int,int> abcd; typedef long long ll; inline char nc() { static char buf[100000],*p1=buf,*p2=buf; if (p1==p2) { p2=(p1=buf)+fread(buf,1,100000,stdin); if (p1==p2) return EOF; } return *p1++; } inline void read(int &x) { char c=nc(),b=1; for (;!(c>='0' && c<='9');c=nc()) if (c=='-') b=-1; for (x=0;c>='0' && c<='9';x=x*10+c-'0',c=nc()); x*=b; } const int N=1000005; const ll P=998244353; ll A[N<<2],B[N<<2]; ll ia,ib; int ql,qr; inline void modify(int rt,int l,int r) { if (ql<=l && r<=qr){ A[rt]+=ia; B[rt]+=ib; if (A[rt]>P) A[rt]-=P; if (B[rt]>P) B[rt]-=P; return; } int mid=(l+r)>>1; if (ql<=mid) modify(rt<<1,l,mid); if (qr>mid) modify(rt<<1|1,mid+1,r); } int t; ll ret; inline void Query(int rt,int l,int r){ ret+=A[rt]*t+B[rt]; if (ret>P) ret%=P; if (l==r) return; int mid=(l+r)>>1; if (t<=mid) Query(rt<<1,l,mid); else Query(rt<<1|1,mid+1,r); } int n,a ; int Stack ,pnt; int left ,right ; ll ans; int main() { freopen("t.in","r",stdin); freopen("t.out","w",stdout); read(n); for (int i=1;i<=n;i++) read(a[i]); a[0]=1<<30; pnt=0; Stack[++pnt]=0; for (int i=1;i<=n;i++) { while (a[Stack[pnt]]<a[i]) pnt--; left[i]=Stack[pnt]+1; Stack[++pnt]=i; } a[n+1]=1<<30; pnt=0; Stack[++pnt]=n+1; for (int i=n;i;i--) { while (a[Stack[pnt]]<=a[i]) pnt--; right[i]=Stack[pnt]-1; Stack[++pnt]=i; } for (int i=1;i<=n;i++) { int ld=i-left[i]+1,rd=right[i]-i+1; if (ld<rd) swap(ld,rd); ql=1,qr=rd-1; ia=a[i]; ib=0; if (ql<=qr) modify(1,1,n); ql=rd,qr=ld; ia=0; ib=(ll)a[i]*rd%P; if (ql<=qr) modify(1,1,n); ql=ld+1,qr=ld+rd-1; ia=P-a[i]%P; ib=(ll)(ld+rd)*a[i]%P; if (ql<=qr) modify(1,1,n); } for (int i=1;i<=n;i++) { ret=0; t=i; Query(1,1,n); ans^=ret; } printf("%lld\n",ans); return 0; }
相关文章推荐
- Odd Even Linked List
- 【代码笔记】iOS-账号,密码记住
- php 微信分享自定义标题 图片 描述接口开发
- Android Studio中设置作者和创建日期等注释模板
- [李景山php]thinkphp核心源码注释|Cache.class.php
- MySQL索引之前缀索引和索引选择性
- Android 优雅的为RecyclerView添加HeaderView和FooterView
- 【代码笔记】iOS-账号,密码记住
- css字体家族
- UISwitch 开关状态
- AIDL成长记(1)
- Hadoop:MapReduce作业的生命周期
- hdu 5419(数学期望)
- spark源码导读(一)
- 各种排序算法的总结和比较
- Unity 3D - MipMap
- MYSQL中replace into的用法
- [李景山php]thinkphp核心源码注释|Controller.class.php
- 《统计学习方法》学习笔记(3.1)---对偶问题
- orbslam2(3)-优化