博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
1303: [CQOI2009]中位数图
阅读量:6814 次
发布时间:2019-06-26

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

1303: [CQOI2009]中位数图

Time Limit: 1 Sec  Memory Limit: 162 MB
Submit: 1383  Solved: 902
[][]

Description

给出1~n的一个排列,统计该排列有多少个长度为奇数的连续子序列的中位数是b。中位数是指把所有元素从小到大排列后,位于中间的数。

Input

第一行为两个正整数n和b ,第二行为1~n 的排列。

Output

输出一个整数,即中位数为b的连续子序列个数。

Sample Input

7 4
5 7 2 4 3 1 6

Sample Output

4

HINT

第三个样例解释:{4}, {7,2,4}, {5,7,2,4,3}和{5,7,2,4,3,1,6}

N<=100000

Source

 

 题解:还是和前缀和有关——将大于中位数的值设为1,小于的设为-1,等于的设为0,则可以制造一个前缀和数组——在数组中只要某两个位置(注意:范围为0-N)中值相等,则说明存在一段和为0的段,只需要排个序统计下——特别注意:一定要考虑这个段的长度究竟是奇数还是偶数,因为假如是奇数的话,则一定是合法的子序列;假如是偶数的话,则一定不是合法的子序列——也就是说两者存在明确的必然联系,所以只有长度为奇数的才计入总数,千万注意(HansBug:网上的题解貌似都没提到这个额 phile:这还用说? HansBug:T T)
 
1 type arr=array[-200000..200000] of longint; 2 var 3    i,j,k,l,m,n:longint; 4    a,b,c,d:arr; 5 function xxx(x:longint):longint; 6          begin 7               exit(x*(x-1) div 2); 8          end; 9 procedure swap(var x,y:longint);10           var z:longint;11           begin12                z:=x;x:=y;y:=z;13           end;14 procedure sort(l,r:longint;var a,b:arr);15           var i,j,x,y:longint;16           begin17                i:=l;j:=r;x:=b[(l+r) div 2];18                repeat19                      while b[i]
x do dec(j);21 if i<=j then22 begin23 swap(b[i],b[j]);24 swap(a[i],a[j]);25 inc(i);dec(j);26 end;27 until i>j;28 if l
m then38 a[i]:=139 else if a[i]=m then a[i]:=0 else a[i]:=-1;40 b[i]:=b[i-1]+a[i];41 end;42 for i:=n downto 1 do b[i+1]:=b[i];43 for i:=n+1 downto 1 do a[i]:=i-1;44 b[1]:=0;45 sort(1,n+1,a,b);46 for i:=1 to n+1 do a[i]:=a[i] mod 2;47 b[0]:=-maxlongint;48 j:=0;49 b[n+2]:=maxlongint;l:=0;50 for i:=1 to n+2 do51 if b[i]<>b[j] then52 begin53 sort(j,i-1,b,a);54 j:=i;55 end;56 j:=0;57 fillchar(c,sizeof(c),0);58 fillchar(d,sizeof(d),0);59 for i:=1 to n+2 do60 begin61 if not((b[i]=b[j]) and (a[i]=a[j])) then62 begin63 if j<>0 then if a[j]=0 then c[b[j]]:=c[b[j]]+i-j else d[b[j]]:=d[b[j]]+i-j;64 j:=i;65 end;66 end;67 for i:=-200000 to 200000 do l:=l+c[i]*d[i];68 writeln(l);69 end.70

 

转载于:https://www.cnblogs.com/HansBug/p/4172994.html

你可能感兴趣的文章
【Cocos2d-Js基础教学(3)各种基类的定义和使用】
查看>>
java.util.logging.Logger使用详解
查看>>
Sql Server -更新语句,修改的字段是日期时间型,修改其中的月份
查看>>
【转】linux下tty,控制台,虚拟终端,串口,console(控制台终端)详解----不错...
查看>>
Vertica增加一个数据存储的目录
查看>>
小小的告别一下这个博客
查看>>
【转】内核编译时, 到底用make clean, make mrproper还是make distclean(转载)
查看>>
The YubiKey NEO
查看>>
看一下你在中国属于哪个阶层?
查看>>
Collections.sort方法对list排序的两种方式
查看>>
Synchronize Ultimate
查看>>
设计模式之模板方法模式
查看>>
关于配置
查看>>
如何更好的通过Inflate layout的方式来实现自定义view
查看>>
smali语法中文版
查看>>
快如闪电、超轻量级的基于.Net平台的依赖注入框架Ninject
查看>>
Oracle数据库的经典问题 snapshot too old是什么原因引起的
查看>>
linux 查看系统信息命令(比较全)
查看>>
[Bootstrap]modal弹出框
查看>>
14.7-2
查看>>