博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
最长递增子序列的数量 51Nod - 1376
阅读量:5219 次
发布时间:2019-06-14

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

最长递增子序列的数量

 
dp...用树状数组维护一下len和cnt
 
1 //树状数组 dp 2 //求LIS的数量 3 #include 
4 using namespace std; 5 6 const int mod = 1e9 + 7; 7 const int maxn = 50010; 8 struct Node{ 9 int len, cnt;10 Node(int len = 0, int cnt = 0) : len(len), cnt(cnt){}11 Node operator + (const Node &t) const{12 if(len < t.len) return t;13 if(len > t.len) return (*this);14 return Node(len, (cnt + t.cnt) % mod);15 }16 };17 struct Info{18 int x, pos;19 bool operator < (const Info &temp) const{20 if(x == temp.x) return pos > temp.pos;21 return x < temp.x;22 }23 };24 25 bool cmp(Info &a, Info &b){26 if(a.x == b.x) return a.pos > b.pos;27 return a.x < b.x;28 }29 Node c[maxn];30 Info a[maxn];31 32 int n;33 void add(int i, Node v){34 for(; i <= n; i += i & -i) c[i] = c[i] + v;35 }36 37 Node sum(int i){38 Node res;39 for(; i; i -= i & -i) res = res + c[i];40 return res;41 }42 43 int main(){44 while(scanf("%d", &n) != EOF){45 for(int i = 0; i < n; i++){46 scanf("%d", &a[i].x);47 a[i].pos = i + 1;48 }49 sort(a, a + n);50 Node ans;51 for(int i = 0; i < n; i++){52 Node temp = sum(a[i].pos);53 if(++temp.len == 1) temp.cnt = 1;54 ans = ans + temp;55 add(a[i].pos, temp);56 }57 cout<
<
View Code

 

CDQ写法没看懂=_=

学会了再回来补上。。。

转载于:https://www.cnblogs.com/yijiull/p/8325887.html

你可能感兴趣的文章
UIKit 框架之UISegmentedControl
查看>>
hellow world
查看>>
第 14 章 结构和其他数据形式(函数指针)
查看>>
JavaScript事件机制
查看>>
深入理解HTTP协议、HTTP协议原理分析
查看>>
关于zookeeper部署的个数
查看>>
使用winmm.dll 获取麦克风声音数据
查看>>
flask 下载本地文件
查看>>
iOS开发拓展篇—UIDynamic(简单介绍)
查看>>
iOS开发UI篇—直接使用UITableView Controller
查看>>
logstash nested内嵌字段 field protobuf解码 codec 的解决办法
查看>>
GridView、Repeater获取当前行号
查看>>
bzoj2338[HNOI2011]数矩形 计算几何
查看>>
CodeForces - 732A Buy a Shovel 解题
查看>>
PHPStorm2017设置字体与设置浏览器访问
查看>>
哈希UVALive 6326 Contest Hall Preparation
查看>>
一个简易的服务框架lsf
查看>>
shell之批量新增用户脚本(http-basic-auth)
查看>>
springBoot于tomcat7搭建websocket服务
查看>>
android开发学习笔记:圆角的Button
查看>>