博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
P1637 三元上升子序列
阅读量:6690 次
发布时间:2019-06-25

本文共 1262 字,大约阅读时间需要 4 分钟。

thair

好,这个naive的东西因为只有三元,很好求解。只要把每个数之前小的L[i]与之后大的R[i]求一下即可。

求两次逆序对即可。那么答案便是∑(L[i]*R[i]);

对于更高元的,胡雨菲写的是要用DP

那么先放水的一批的代码

(就这还洛谷蓝题,我直接给的黄题)

 

1 #include 
2 #include
3 #define lowbit(a) (a&(-a)) 4 using namespace std; 5 const int N = 30010; 6 int x[N],tree[N],n,a[N],L[N],R[N]; 7 8 void add(int x,int v) 9 {10 if(x==0) return;11 for(int i=x;i<=n;i+=lowbit(i)) tree[i]+=v;12 return;13 }14 int getsum(int x)15 {16 if(x==0) return 0;17 int ans=0;18 for(int i=x;i>0;i-=lowbit(i)) ans+=tree[i];19 return ans;20 }21 22 23 24 int main()25 {26 scanf("%d",&n);27 for(int i=1;i<=n;i++) scanf("%d",&a[i]),x[i]=a[i];28 sort(x+1,x+n+1);29 int k=0;30 for(int i=1;i<=n;i++) if(x[i]!=x[i-1]) x[++k]=x[i];31 32 for(int i=1;i<=n;i++)33 {34 int p=lower_bound(x+1,x+k+1,a[i])-x;35 L[i]=getsum(p-1);36 add(p,1);37 }38 fill(tree+1,tree+n+1,0);39 for(int i=n;i>=1;i--)40 {41 int p=lower_bound(x+1,x+k+1,a[i])-x;42 R[i]=(n-i)-getsum(p);43 add(p,1);44 }45 long long ans=0;46 for(int i=1;i<=n;i++) ans+=L[i]*R[i];47 printf("%lld",ans);48 return 0;49 }
AC代码:

 

转载于:https://www.cnblogs.com/huyufeifei/p/8707968.html

你可能感兴趣的文章
android自定义radiobutton样式文字颜色随选中状态而改变
查看>>
【CodeForces 604B】F - 一般水的题1-More Cowbe
查看>>
用JS获取地址栏参数的方法
查看>>
javascript中实现sleep函数
查看>>
ionic 001
查看>>
@params、@PathVariabl和@RequestParam用法与区别
查看>>
wxPython 4.0.0b2安装
查看>>
Android RecyclerView利用Glide加载大量图片into(Target)导致OOM异常
查看>>
UGUI表情系统解决方案
查看>>
ubuntu 下执行定时任务
查看>>
将td中文字过长的部分变成省略号显示的小技巧
查看>>
Cesium随笔(1)部署自己的项目 【转】
查看>>
.NET 程序集单元测试工具 SmokeTest 应用指南
查看>>
HTTP Health Checks
查看>>
为什么正态分布如此普遍
查看>>
jQuery事件
查看>>
BBS论坛(三十)
查看>>
通过PMP考试
查看>>
轻松看懂Java字节码
查看>>
2011年总结以及2012的展望
查看>>