BZOJ 1303 【CQOI2009】中位数图

baidu了一下bzoj水题列表。。。找到这道题。

  题目大意:给定一个数t,在给定的一段包含1-n的序列中找出多少个长度为奇数子序列的中位数为t。

第一眼没看数据范围,于是开心的打了一个O(n^3)的循环,TLE....

  想了想,子序列中必须包含t,所以子序列中其他数的个数必定为偶数,所以子序列中有t以及n个大于t的数和n个小于t的数(n为偶数);

  因为是1-n的排列,所以也不会出现多个t的情况。。

  于是发现了一个很神奇的思路,对于序列里任何一个数,把小于t的数定义为-1,等于t的数定义为0,大于t的数定义为1,所以只要求出有多少长度为奇数的子序列和为零。。

  于是开心地写了一波前缀和,样例一直没过,后来发现sum【0】没算进去,于是直接在sum【1】塞了一个0,其他往后面一位移。。

  然而枚举的时候脑子有病打了个二重循环,继续TLE....

  后来不知道怎么搞,走了一圈回来突然发现可以用桶排的思想,找出b在序列中的位置k,枚举1-k-1,用一个数组a记录sum数组1-k-1中出现的次数且位置为奇数,数组b记录sum数组1-k-1中出现的次数且位置为偶数,然后再一重循环j枚举k-n,

  看j为偶数和a【sum【j】】是否为大于零,如果是加到ans里面,当j为奇数和b【sum【j】】是否大于零,如果是加到ans里面。。  (tips:奇-偶=奇,偶-奇=奇,所以要分成两个情况处理,使序列长度为奇数);

  于是又开心的交了一波 。。 Wrong Answer。。。

  于是一直卡Wrong Answer。。。

  第二天才发现数据范围100000然而我看错开的是10000,内心崩溃。。。 改了一下交上去就A了。。。

  下面是代码,其实只有十几行:

 1 var
 2   n,x,t,i,j,k,ans:longint;
 3   sum,a,b:array[-1..1000001]of longint;  //序列中有-1,注意开到-1
 4 begin
 5   readln(n,t);
 6   sum[1]:=0;  //前缀和数组强行塞0;
 7   inc(N); //sum数组有n+1个数据,为了方便循环直接把n+1
 8   for i:=2 to n do begin
 9     read(x);  //读入
10     if x=t then k:=i;  //找出中位数在序列中的位置
11     if x<t then x:=-1
12     else if x=t then x:=0
13     else if x>t then x:=1;
14     sum[i]:=sum[i-1]+x;  //前缀和
15   end;
16   for i:=0 to k-1 do  //从0枚举
17     if i mod 2=1 then inc(a[sum[i]])
18     else inc(b[sum[i]]);  //桶排思想
19     for i:=k to n do
20       if i mod 2=1 then begin
21         inc(ans,b[sum[i]])
22       end
23       else begin
24         inc(ans,a[sum[i]]);
25       end;  //枚举答案
26   write(ans); //输出答案
27 end.

BZOJ继a+b后ac的第二题,哈哈哈。。。

时间: 2024-10-07 07:17:27

BZOJ 1303 【CQOI2009】中位数图的相关文章

bzoj 1303: [CQOI2009]中位数图 数学

1303: [CQOI2009]中位数图 Time Limit: 20 Sec  Memory Limit: 256 MB 题目连接 http://www.lydsy.com/JudgeOnline/problem.php?id=1303 Description 给出1~n的一个排列,统计该排列有多少个长度为奇数的连续子序列的中位数是b.中位数是指把所有元素从小到大排列后,位于中间的数. Input 第一行为两个正整数n和b ,第二行为1~n 的排列. Output 输出一个整数,即中位数为b的

BZOJ 1303: [CQOI2009]中位数图【前缀和】

1303: [CQOI2009]中位数图 Time Limit: 1 Sec  Memory Limit: 162 MBSubmit: 2737  Solved: 1698[Submit][Status][Discuss] Description 给出1~n的一个排列,统计该排列有多少个长度为奇数的连续子序列的中位数是b.中位数是指把所有元素从小到大排列后,位于中间的数. Input 第一行为两个正整数n和b ,第二行为1~n 的排列. Output 输出一个整数,即中位数为b的连续子序列个数.

[BZOJ 1303] [CQOI2009] 中位数图 【0.0】

题目链接:BZOJ - 1303 题目分析 首先,找到 b 的位置 Pos, 然后将数列中小于 b 的值赋为 -1 ,大于 b 的值赋为 1 . 从 b 向左扩展,不断算 Sum[i, b - 1] ,然后将 Cnt[Sum[i, b - 1]] 加一,这样就算出每个左边的Sum值有多少个了. 然后从 b 向右扩展,不断算 Sum[b + 1, i] ,然后 Ans += Cnt[Sum[b + 1, i]] . 代码 #include <iostream> #include <cstd

bzoj 1303: [CQOI2009]中位数图

1 #include<cstdio> 2 #include<iostream> 3 #define M 100005 4 using namespace std; 5 int a[M],l[2*M],r[2*M],sum[M],n,m,p,ans; 6 int main() 7 { 8 scanf("%d%d",&n,&m); 9 for(int i=1;i<=n;i++) 10 { 11 scanf("%d",&

BZOJ 1303: [CQOI2009]中位数图 【水题】

给出1~n的一个排列,统计该排列有多少个长度为奇数的连续子序列的中位数是b.中位数是指把所有元素从小到大排列后,位于中间的数. Input 第一行为两个正整数n和b ,第二行为1~n 的排列. Output 输出一个整数,即中位数为b的连续子序列个数. Sample Input 7 45 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 思路:记录中间那个数左边右

1303: [CQOI2009]中位数图

1303: [CQOI2009]中位数图 Time Limit: 1 Sec  Memory Limit: 162 MBSubmit: 1383  Solved: 902[Submit][Status] Description 给出1~n的一个排列,统计该排列有多少个长度为奇数的连续子序列的中位数是b.中位数是指把所有元素从小到大排列后,位于中间的数. Input 第一行为两个正整数n和b ,第二行为1~n 的排列. Output 输出一个整数,即中位数为b的连续子序列个数. Sample In

【BZOJ 1303】 [CQOI2009]中位数图

1303: [CQOI2009]中位数图 Time Limit: 1 Sec  Memory Limit: 162 MB Submit: 1452  Solved: 951 [Submit][Status] Description 给出1~n的一个排列,统计该排列有多少个长度为奇数的连续子序列的中位数是b.中位数是指把所有元素从小到大排列后,位于中间的数. Input 第一行为两个正整数n和b ,第二行为1~n 的排列. Output 输出一个整数,即中位数为b的连续子序列个数. Sample

bzoj千题计划175:bzoj1303: [CQOI2009]中位数图

http://www.lydsy.com/JudgeOnline/problem.php?id=1303 令c[i]表示前i个数中,比d大的数与比d小的数的差,那么如果c[l]=c[r],则[l+1,r]满足条件 #include<cstdio> #include<iostream> using namespace std; const int N=1e7; int c[N*2],g[N]; void read(int &x) { x=0; char c=getchar()

bzoj[CQOI2009]中位数图

又是一道巧妙的题 将大于b的数标为1,将小于b的数标为-1 以b为界限,向两边分别求后缀和与前缀和,用l,r分别统计左右两边每个前缀和的数量 因为前缀和有负数所以整体加个n 于是答案就是l[i]*r[2*n-i]//和为2*n,即减去加上的n,和为0,此时b为中位数 因为题目中说要满足长度为奇数,此时若两个和加起来为2*n,个数相加一定为偶数,加上一个b就为奇数了 #include<bits/stdc++.h> using namespace std; const int maxn=10000

[BZOJ1303] [CQOI2009] 中位数图

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