cdoj 1256 昊昊爱运动 预处理/前缀和
2015-12-06 12:03
309 查看
昊昊爱运动
Time Limit: 20 SecMemory Limit: 256 MB
题目连接
http://acm.uestc.edu.cn/#/problem/show/1256Description
昊昊喜欢运动他N天内会参加M种运动(每种运动用一个[1,m]的整数表示)
舍友有Q个问题
问昊昊第l天到第r天参加了多少种不同的运动
Input
输入两个数N, M (1≤N≤2000, 1≤M≤100);
输入N个数ai表示在第i天昊昊做了第ai类型的运动;
输入一个数Q(1≤Q≤106);
输入Q行 每行两个数 l, r(1≤l≤r≤n);
Output
一共Q行
每一行输出一个数 表示昊昊在第l天到第r天一共做了多少种活动
Sample Input
5 3 1 2 3 2 2 3 1 4 2 4 1 5
Sample Output
3 2 3
HINT
题意题解:
正解有两种
1.n^2预处理
由于n只有2000,我们可以n^2去预处理出答案,然后对于每次询问我们都O(1)回答
核心代码:
for (i=0;i<n;i++){
memset(f,0,sizeof(f) );
x=0;
for (j=i;j<n;j++){
if ( f[a[j] ]==0 ) { f[a[j] ]=1; x++;}
ans[i][j]=x;
}
}
2.前缀和思想
我们去维护sum[i][j],表示[1,i]中,j究竟出现了多少次。
然后对于每一次询问,我们只要扫一遍m,判断sum[r][i]-sum[l-1][i]是否大于0就好了
这样预处理的复杂度是O(n),对于每一个询问的复杂度是O(m)
所以总体复杂度是O(n+qm)
代码:
#include<cstdio> #include<iostream> #include<algorithm> #include<cstring> using namespace std; int n,m,i,tmp,j,Q,l,r,ans,a[2005][105]; int main(){ scanf("%d%d",&n,&m); for(i=1;i<=n;++i){ scanf("%d",&tmp); a[i][tmp]=1; for(j=1;j<=m;++j)a[i][j]+=a[i-1][j]; } scanf("%d",&Q); for(i=1;i<=Q;++i){ scanf("%d%d",&l,&r); ans=0; for(j=1;j<=m;++j)ans+=(a[r][j]>a[l-1][j]); printf("%d\n",ans); } return 0; }
相关文章推荐
- python psutil 终止子进程
- 黑马程序员——OC基础之点语法
- HDU 5273 Dylans loves sequence 区间DP
- cdoj 1255 斓少摘苹果 贪心
- jforum MVC中的控制器
- 【Html】使用mailto在网页中链接Email地址
- centos下安装webbench最新版本-实现并发测试
- 【iOS学习笔记】一些问题
- codeforces 463C Gargari and Bishops
- 黑马程序员——OC基础之NSLog
- VC中使用GetLastError
- odoo8 官方web客户端开发文档翻译3---Widgets Basics(基础窗口组件)
- jQuery.form.js使用
- 一起talk C栗子吧(第七十一回:C语言实例--DIY shell)
- 《鸟哥的Linux私房菜基础篇》阅读笔记——第3章、第8章
- JAVA中其它包中无法引用缺省包(default package)的类 - 使用反射可以
- 2015河南科技学院高校CSDN俱乐部--路由器配置讲解
- Android开发之旅二---Activity生命周期
- node.js建立简单应用
- 1095. Cars on Campus (30)