洛谷 2344 奶牛抗议 Generic Cow Protests, 2011 Feb
2024-09-30 21:08:20
【题解】
我们可以轻松想到朴素的状态转移方程,但直接这样做是n^2的。所以我们考虑采用树状数组优化。写法跟求逆序对很相似,即对前缀和离散化之后开一个权值树状数组,每次f[i]+=query(sum[i]),再把f[i]加入到sum[i]位置上。这样可以保证每次f[i]加上的是在它前面的、sum小于它的位置的f值。
#include<cstdio>
#include<algorithm>
#define N 200010
#define rg register
#define Mod (1000000009)
using namespace std;
int n,m,f[N];
long long a[N],b[N],t[N];
inline int read(){
int k=,f=; char c=getchar();
while(c<''||c>'')c=='-'&&(f=-),c=getchar();
while(''<=c&&c<='')k=k*+c-'',c=getchar();
return k*f;
}
inline void add(int x,int y){
for(;x<=n+&&x>;x+=(x&-x)){t[x]+=y; t[x]%=Mod;}
}
inline int query(int x){
int ret=; for(;x;x-=x&-x){ret+=t[x]; ret%=Mod;} return ret%Mod;
}
int main(){
n=read();
for(rg int i=;i<=n;i++) a[i]=read()+a[i-],b[i]=a[i]; a[]=b[]=;
sort(b,b++n); int n2=unique(b,b++n)-b-;
for(rg int i=;i<=n;i++) a[i]=lower_bound(b,b++n2,a[i])-b+;
// for(rg int i=0;i<=n;i++) printf("%lld ",a[i]); puts("");
add(a[],f[]=);
for(rg int i=;i<=n;i++){
f[i]+=query(a[i]); f[i]%=Mod;
add(a[i],f[i]);
}
printf("%d\n",f[n]%Mod);
return ;
}
最新文章
- Azure SQL Database (20) 使用SQL Server 2016 Upgrade Advisor
- aischool 倒计时VIEW封装
- 安装ss
- Android——GridView(网格视图)相关知识总结贴
- 【FE前端学习】第二阶段任务-基础
- Spring 依赖注入,在Main方法中取得Spring控制的实例
- Netsharp FAQ
- awk 统计数据在文件中的出现次数
- Castle ActiveRecord配置中需要注意的地方
- Bootstrap 响应式瀑布流 (使用wookmark)
- 使用CountDownLatch和CyclicBarrier处理并发线程
- CentOS6.8通过yum安装MySQL5.7
- JSP之JSTL_functions
- Kafka笔记8(管理Kafka)
- filter 实现登录状态控制
- Solr中的q与fq参数的区别
- 关于DE2-115 FPGA开发板无法烧写程序的解决方法
- 用Qemu模拟vexpress-a9 (七) --- 嵌入式设备上安装telnet服务
- oracle12c创建用户和表空间出现的问题
- 利用atimicInteger cas的特性实现一个锁
热门文章
- IntelliJ IDEA 缓存和索引介绍
- 26.Extjs 部门列表信息展示页面
- 21. Ext中表格自适应高度
- 使用WinSXS进行系统盘瘦身Windows 7/2008/10/2012不断变大的C盘(Windows 更新清理)
- Android网络相关代码
- E20171229-hm
- bzoj 1638: [Usaco2007 Mar]Cow Traffic 奶牛交通【记忆化搜索】
- Linux 常规操作指南
- CentOS6.5磁盘分区和挂载操作记录
- 312 Burst Balloons 戳气球