CodeForces 314C 树状数组 + dp
//CodeForces 314C
//分析:相当于求给定序列的不降子序列的个数,从一个空序列开始将得到的不降子序列不断的延长是典型的做法,则dp[i]表示以第 i 个元素结尾的序列
//思路:O(n^2) 的做法,dp[i] = sum(dp[j]]) (a[j] <= a[i] && j <= i),求和过程用掉了 O(n) 的复杂度,用树状数组可以优化成 O(logn),需要先处理出每个元素在原来的序列中的大小顺序,最终复杂度 O(nlogn)。
1 #include "iostream" 2 #include "cstdio" 3 #include "cstring" 4 #include "algorithm" 5 using namespace std; 6 int n; 7 struct st 8 { 9 int ans, rank, pos; 10 } a[100010]; 11 int tot; 12 bool cmp_1(st a, st b) 13 { 14 return a.ans < b.ans; 15 } 16 bool cmp_2(st a, st b) 17 { 18 return a.pos < b.pos; 19 } 20 21 inline int lowbit(int p) 22 { 23 return p&-p; 24 } 25 const int mod = 1000000007; 26 27 const int maxn = 100010; 28 int t[maxn], element[maxn]; 29 void add(int p, int x) 30 { 31 int i; 32 for(i = p; i <= tot; i += lowbit(i)) { 33 t[i] += x; 34 t[i] %= mod; 35 } 36 } 37 38 __int64 sum(int p) 39 { 40 int i, res = 0; 41 for(i = p; i >= 1; i -= lowbit(i)) { 42 res += t[i]; 43 res %= mod; 44 } 45 return res; 46 } 47 48 int main() 49 { 50 int i, j; 51 scanf("%d", &n); 52 for(i = 1; i<=n; ++i) { 53 scanf("%d", &a[i].ans); 54 a[i].pos = i; 55 } 56 sort(a+1, a+1+n, cmp_1); 57 tot = 1; 58 a[1].rank = 1; 59 for(i = 2; i<=n; ++i) { 60 if(a[i].ans!=a[i-1].ans) 61 a[i].rank = ++tot; 62 else 63 a[i].rank = tot; 64 } 65 sort(a+1, a+1+n, cmp_2); 66 int tmp; 67 for(i = 1; i<=n; ++i) { 68 tmp = (sum(a[i].rank)*a[i].ans%mod+a[i].ans)%mod; //a[i].ans 是对空串的延长,因为 树状数组 不能计算到 t[0],不然就不用特殊处理空串的情况了 69 add(a[i].rank, (tmp-element[a[i].rank]+mod)%mod); //减去重复计算值,即上一次的计算值 70 element[a[i].rank] = tmp; //记录上一次的计算值 71 } 72 printf("%d\n", sum(tot)); 73 }
转载于:https://www.cnblogs.com/AC-Phoenix/p/4286618.html
CodeForces 314C 树状数组 + dp相关推荐
- HDU-5542-The Battle of Chibi【树状数组+dp】
HDU-5542-The Battle of Chibi[树状数组+dp] Time Limit: 6000/4000 MS (Java/Others) Memory Limit: 65535/655 ...
- HDU - 5542 The Battle of Chibi(树状数组+DP)
UVA - 12983 The Battle of Chibi(树状数组+DP) HDU - 5542 The Battle of Chibi(树状数组+DP) #include<cstdio& ...
- bzoj 2131: 免费的馅饼(树状数组+DP)
2131: 免费的馅饼 Time Limit: 10 Sec Memory Limit: 259 MB Submit: 408 Solved: 245 [Submit][Status][Discu ...
- hdu 6447YJJ's Salesman 离散化+树状数组+DP
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=6447 因为图中点的坐标值过大,达到1e9.然而只有1e5个点.所以先将其离散化.并按照<x.y& ...
- CF985E Pencils and Boxes(树状数组+dp)
树状数组优化dp问题 #include<bits/stdc++.h> using namespace std; const int N=5e5+10; int n,k,d; int b[N ...
- 2019计蒜之道复赛A:外教Michale变身大熊猫【树状数组+dp】
题目: 题目在这里~~~ 分析: 按照题意,只需要找到最长上升子序列的数量和每个数对最长上升子序列的贡献次数即可,可以二分找到经过每个数的最长上升子序列的长度,但这样不好统计数量:考虑dp,定义dp[ ...
- CodeForces 396C 树状数组 + DFS
本主题开始看到以为段树或树状数组,但是,对于一个节点的有疑问的所有子节点的加权,这一条件被视为树的根,像 然后1号是肯定在第一层中,然后建立一个单向侧倒查,然后记录下来 其中每个节点 层,终于 两个节 ...
- M元上升子序列【树状数组+dp】
多元组-牛客网 题解 ac代码 #include<iostream> #include<cstring> #include<algorithm> #include& ...
- 【USACO】奶牛抗议 树状数组+dp
题目描述 约翰家的 N 头奶牛正在排队游行抗议.一些奶牛情绪激动,约翰测算下来,排在第 i 位的奶牛 的理智度为 A i ,数字可正可负. 约翰希望奶牛在抗议时保持理性,为此,他打算将这条队伍分割成几 ...
最新文章
- 编程自动化,未来机器人将超越人类?
- Cordova:安卓白屏
- selenium-webdriver(python) (十六) --unittest 框架
- mysql象限和投影_Camera类之orthographic-摄像机投影模式(第100篇随笔)
- anydesk截屏技术
- Sql Server函数全解二数学函数
- [vue] vue使用v-for遍历对象时,是按什么顺序遍历的?如何保证顺序?
- 超短的判断IE javascript代码
- ubuntu 安装多个CUDA版本并可以随时切换
- 罗技跨屏互联FLOW软件问题,无法启动
- 小码王python_小码王分享给Python初学者的几个技巧
- 35岁的程序员:第44章,宿命
- Hairpin流量, 发卡流量怎么理解
- 阿刚编程遇到的小问题集合~ 以后回顾用
- 高等数学——求解不定积分的经典换元法
- 2022年天津最新建筑八大员(电气)模拟考试题库及答案
- Django 页面静态化
- 数字藏品平台常见的活动玩法
- 阿里巴巴副总裁肖力:云原生安全下看企业新边界——身份管理
- 连了热点可以用qq却不能用浏览器
热门文章
- Ubuntu扩大boot空间
- Codewars-Javascript训练手册:Date 对象
- xcode 证书生成、加载
- 【转合辑】squid的安装配置
- 修改了xml要不要重新起服务器,关于设置:Eclipse每次运行项目时都会修改server.xml(运行-在服务器上运行)...
- raspberry pi_Raspberry Pi,CNC铣削,WTF,Cypht,HomeBank,Wekan等的使用方法
- raspberry pi_使用Raspberry Pi配置业余无线电网关
- 开源飞控爱好者_开源爱好者的10种节日礼物创意
- 开源中国 精彩回顾_如何撰写精彩的事件回顾
- ssh tar_2015年最佳情侣:tar和ssh