poj 3368 Frequent values
来源:互联网 发布:网络带来的好处英文 编辑:程序博客网 时间:2024/05/04 12:10
这题的数据结构比较多,要保存区间内最左边的数与其出现的次数,最右边的数与其出现的次数,还要保存区间出现的次数最多的值!!
刚开始题意理解错了,以为求区间出现次数最多的数!郁闷,都怪自己太心急了,写了半天,调试的时候才知道错了!
题意只要求出区间的数出现的频率的最大值,这就简单多了!!
#include<stdio.h>#include<stdlib.h>#define Max 100010struct node{int l,r;int lnum;//最左边的数int rnum;//最右边的数int count;//频率最大int lcount;//最左边的数出现的次数int rcount;//最右边的数出现的次数}tree[4*Max];int s[Max];int count,rnum,rcount;void build(int l,int r,int step){tree[step].l=l;tree[step].r=r;if(tree[step].l==tree[step].r){tree[step].lnum=s[l];tree[step].rnum=s[l];tree[step].count=1;tree[step].rcount=1;tree[step].lcount=1;return ;}int mid=(l+r)/2;build(l,mid,step*2);build(mid+1,r,step*2+1);tree[step].lnum=tree[2*step].lnum;tree[step].rnum=tree[2*step+1].rnum;tree[step].lcount=tree[2*step].lcount;tree[step].rcount=tree[2*step+1].rcount;if(tree[2*step].count>=tree[step*2+1].count){tree[step].count=tree[2*step].count;}else{tree[step].count=tree[2*step+1].count;}if(tree[2*step].rnum==tree[2*step+1].lnum){int ans=tree[2*step].rcount+tree[2*step+1].lcount;if(ans>tree[step].count){tree[step].count=ans;}if(tree[2*step].rnum==tree[2*step+1].rnum){tree[step].rcount+=tree[step*2].rcount;}if(tree[2*step].lnum==tree[2*step+1].lnum){tree[step].lcount+=tree[2*step+1].lcount;}}}void compute(int l,int r,int step){if(tree[step].l==l&&tree[step].r==r){int tmp=tree[step].rcount;if(tree[step].count>count){count=tree[step].count;}if(tree[step].lnum==rnum){int sum=rcount+tree[step].lcount;if(sum>count){count=sum;}if(tree[step].rnum==rnum)tmp=rcount+tree[step].rcount;}rcount=tmp;rnum=tree[step].rnum;return ;}int mid=(tree[step].l+tree[step].r)/2;if(r<=mid){compute(l,r,step*2);}else{if(mid<l)compute(l,r,step*2+1);else{compute(l,mid,step*2);compute(mid+1,r,step*2+1);}}}int main(){int n,a,b,m,i;while(scanf("%d",&n)){if(n==0)break;scanf("%d",&m);for(i=1;i<=n;i++)scanf("%d",&s[i]);build(1,n,1);while(m--){scanf("%d%d",&a,&b);if(a==b){printf("1\n");continue;}rcount=count=0;//初始化rnum=9999999;//初始化compute(a,b,1);printf("%d\n",count);}}return 0;}
- POJ 3368 Frequent values
- poj 3368 Frequent values
- POJ 3368 Frequent Values
- poj 3368 Frequent values
- poj 3368 Frequent values
- poj 3368 Frequent values
- POJ-3368-Frequent values
- poj 3368 Frequent values
- poj 3368 Frequent values
- POJ 3368: Frequent values
- Poj 3368 Frequent values
- POJ 3368 Frequent values
- poj 3368 Frequent values
- POJ 3368 Frequent values
- POJ 3368 Frequent values
- POJ 3368 Frequent values
- POJ 3368--Frequent values
- Poj 3368 Frequent values
- 在QT和SDL搭建的框架中使用OPENGL在SDL窗口上进行绘图
- 保持简单:纪念丹尼斯·里奇
- 电脑技能的英文表述
- u-boot 烧写菜单
- scala学习之内建控制结构->匹配(match)表达式
- poj 3368 Frequent values
- sql语句 自己编写一个函数reversion,完成颠倒一个字符串,即:select dbo.reversion('abcd') 输出的结果为 dcba
- 10gR2 RAC 配置时间同步和hangcheck-timer模块
- 中国企业管理软件之殇
- 杭电 1867 KMP连接两个字符串
- sql语句 设计一个函数用来计算一个字符串中,另一个字符串出现的次数
- Android调用天气预报的WebService简单例子
- sql 语句 写一个函数T-sql函数elimination(a,b)将出现在第一个字符串中的第二个字符串中的所有字符删除,即:select dbo.elimination('abcdefg123
- Upon startup of Linux database get ORA-27102: out of memory Linux-X86_64 Error: 28: [ID 301830.1]