B1303 [CQOI2009] 中位数图 数学】的更多相关文章

想明白算法之后特别水,因为b只有可能出现一次,所以直接在b的左右找就行了,比他大的为1,比他小的为-1,然后维护前缀和就行了. 假如b有可能出现多次呢?按照这种方法好像也很好办,就是枚举每个点就行了,复杂度有点大,所以直接求一遍前缀和就行了. 题干: Description 给出1~n的一个排列,统计该排列有多少个长度为奇数的连续子序列的中位数是b.中位数是指把所有元素从小到大排列后,位于中间的数. Input 第一行为两个正整数n和b ,第二行为1~n 的排列. Output 输出一个整数,即…
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的…
1303: [CQOI2009]中位数图 Time Limit: 1 Sec  Memory Limit: 162 MBSubmit: 2340  Solved: 1464[Submit][Status][Discuss] Description 给出1~n的一个排列,统计该排列有多少个长度为奇数的连续子序列的中位数是b.中位数是指把所有元素从小到大排列后,位于中间的数. Input 第一行为两个正整数n和b ,第二行为1~n 的排列. Output 输出一个整数,即中位数为b的连续子序列个数.…
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的连续子序列个数.…
[BZOJ1303][CQOI2009]中位数图(模拟) 题面 BZOJ 洛谷 题解 把大于\(b\)的数设为\(1\),小于\(b\)的数设为\(-1\).显然询问就是有多少个横跨了\(b\)这个数所在的位置的区间的和恰好为\(0\).那么拿个数组记一下左边,右边直接算就好了. #include<iostream> #include<cstdio> using namespace std; #define ll long long #define MAX 100100 inlin…
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; ],g[N]; void read(int &x) { x=; char c=getchar(); while(!i…
1303: [CQOI2009]中位数图 Time Limit: 1 Sec  Memory Limit: 162 MB Submit: 3086  Solved: 1898 [Submit][Status][Discuss] Description 给出1~n的一个排列,统计该排列有多少个长度为奇数的连续子序列的中位数是b.中位数是指把所有元素从小到大排列后,位于中间的数. Input 第一行为两个正整数n和b ,第二行为1~n 的排列. Output 输出一个整数,即中位数为b的连续子序列个…
本文版权归ljh2000和博客园共有,欢迎转载,但须保留此声明,并给出原文链接,谢谢合作. 本文作者:ljh2000 作者博客:http://www.cnblogs.com/ljh2000-jump/转载请注明出处,侵权必究,保留最终解释权! Description 给出1~n的一个排列,统计该排列有多少个长度为奇数的连续子序列的中位数是b.中位数是指把所有元素从小到大排列后,位于中间的数. Input 第一行为两个正整数n和b ,第二行为1~n 的排列. Output 输出一个整数,即中位数为…
http://www.lydsy.com/JudgeOnline/problem.php?id=1303 依旧是题解流,,,不看题解没法活,,,第一眼就是瞎搞,然后就是暴力,显然TLE..题解啊题解.. 这个特殊的技巧我不知道怎么抽象出来,,恩,,就说做法吧.. 首先读入的时候,小于b的赋值为-1,大于b的赋值为+1,并且用下标pos来索引b在数组的位置(1-n的排列哈-没看题的注意了) 然后用前缀和思想统计pos左边的前缀和和pos右边的前缀和,那么我们在统计的时候,只需要找(左边的一个前缀和…
题目链接 给n个数,一个值b, 统计所有以b为中位数的序列的个数.序列长度为奇数.数字在1-n之间, 每个数只出现一次. 如果一个数大于b, 那么将他赋值为1, 小于b赋值为-1, 记录数组中b出现的位置, 为pos. 具体看代码.......好难说清 #include<bits/stdc++.h> ; ], r[maxn*]; int main() { int n, b, x, pos; while(cin>>n>>b) { ; i<n; i++) { scan…
欢迎访问~原文出处——博客园-zhouzhendong 去博客园看该题解 题目传送门 - BZOJ1303 题意概括 给出1~n的一个排列,统计该排列有多少个长度为奇数的连续子序列的中位数是b.中位数是指把所有元素从小到大排列后,位于中间的数. 题解 我们找到b的位置,比如为pos. 然后往左,逐位统计比b小的,比b大的,差记为a. 对于左边所有的位置,bar[a]++,搞 n × 2 个桶.然后右边一边扫过去,一边根据桶的记录统计即可. 代码 #include <cstring> #incl…
给出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 思路:记录中间那个数左边右…
将比 b 大的设成 1,比 b 小的设成 -1,开个桶左右扫描一下,乘法原理乘一乘就好了. 虽然一眼切,不过这个基于中位数的转化还是相当重要的.middle 那个主席树的题也需要该做法 Code: #include <bits/stdc++.h> #define setIO(s) freopen(s".in","r",stdin) #define maxn 1000000 using namespace std; int arr[maxn],neg1[m…
早起一AC,整天萌萌哒. Problem: 1303 User: forgot93 Language: C++ Result: Accepted Time:56 ms Memory:2108 kb ****************************************************************/ #include <cstdio> const int MAXN = 111111; int a[MAXN], h[MAXN << 1]; int main…
原来在vijos上做过,当时根本看不懂 现在看起来这么水…… x记录从b向左连续走比k大的有多少个 y记录从b向右连续走比k大的有多少个 最后根据乘法原理乘一下 不过要加上x[0]+y[0]+1 因为实际上满足条件的序列有四种情况: 一.只选b,即为1 二.只在b左边选,即为x[0] 三.只在b右边选,即为y[0] 四.在两边都选,即为x[i]*y[-i] Q.E.D 代码: var i,n,k,tmp:longint; sum,ans:int64; x,y:..] of longint; a:…
题目链接: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…
处理出一个序列c,a[i]>b,c[i]=1;a[i]==b,c[i]=0;a[i]<b,c[i]=-1,然后s为c的前缀和,设w为b在a序列里的下标 注意到子序列一定横跨w,并且一个符合条件的(l,r)一定满足s[r]-s[l-1]==0,也就是序列内大于b的数==小于b的数, 所以对0~w-1的s存一个mp,mp[i]表示0~w-1中s[]==i的点有多少,然后枚举右端点w~n,每次答案加上当前枚举的右端点i的mp[s[i]],也就是找出有多少个符合要求的左端点 #include<i…
一个大于b的数和一个小于b的数可以互相抵消,所以我们用1和-1表示. 从b向两边扩展,left[i]表示b左边抵消后有i个数比b小的可能数,right[i]表示b右边抵消后有i个数比b大的可能数. ans=sigma(left[i]*right[i]). #include<algorithm> #include<iostream> #include<cstdlib> #include<cstring> #include<cstdio> #incl…
[链接] 我是链接,点我呀:) [题意] 在这里输入题意 [题解] 注意是1..n的排列. 设b的位置为i. 设i右边的数字,比b大的为1,比b小的为-1. (i左边的位置数字也一样设置成1和-1 则处理出pre[i..j]表示i..j这一段(1和-1)的和. 然后存在map中 做散列表. 然后在i的左边. 枚举这段区间从i开始 (因为显然是要经过i这个位置的. 所以只能从比i小的位置开始枚举. (注意为i的情况也要枚举. 往左走求个前缀和(1和-1)now 然后答案累加dic[-now]就可以…
传送门 解题思路 比较好想的思路题.首先肯定要把原序列转化一下,大于\(k\)的变成\(1\),小于\(k\)的变成\(-1\),然后求一个前缀和,还要用\(cnt[]\)记录一下前缀和每个数出现了几次,然后统计答案的时候从\(1\)循环到\(k\),每次转化为前缀和相减即可. 代码 #include<iostream> #include<cstdio> #include<cstring> using namespace std; const int MAXN = 10…
Luogu1627 [CQOI2009]中位数 给出一个 \(n\) 的排列,统计该排列有多少个长度为奇数的连续子序列的中位数是 \(k\) \(n\leq10^5\) \(trick\) :因为不需要每个数的值,因此将原序列化为 \(a_i=\begin{cases}-1&(a_i<k)\\0&(a_i=k)\\1&(a_i>k)\end{cases}\) 因此原问题就变成了 给出一个 \(n\) 的排列,统计该排列有多少个包含 \(k\) 的连续子序列的和为 \(0…
P1627 [CQOI2009]中位数 题目描述 给出1~n的一个排列,统计该排列有多少个长度为奇数的连续子序列的中位数是b.中位数是指把所有元素从小到大排列后,位于中间的数. 输入输出格式 输入格式: 第一行为两个正整数n和b,第二行为1~n的排列. [数据规模] 对于30%的数据中,满足n≤100: 对于60%的数据中,满足n≤1000: 对于100%的数据中,满足n≤100000,1≤b≤n. 输出格式: 输出一个整数,即中位数为b的连续子序列个数. 这个题其实并不是很难想. 转换一下模型…
[CQOI2009] 中位数 题目描述 给出1~n的一个排列,统计该排列有多少个长度为奇数的连续子序列的中位数是b.中位数是指把所有元素从小到大排列后,位于中间的数. 输入输出格式 输入格式: 第一行为两个正整数n和b,第二行为1~n的排列. [数据规模] 对于30%的数据中,满足n≤100: 对于60%的数据中,满足n≤1000: 对于100%的数据中,满足n≤100000,1≤b≤n. 输出格式: 输出一个整数,即中位数为b的连续子序列个数. 输入输出样例 输入样例#1: 7 4 5 7 2…
P1627 [CQOI2009]中位数 给出1~n的一个排列,统计该排列有多少个长度为奇数的连续子序列的中位数是b.中位数是指把所有元素从小到大排列后,位于中间的数. 中位数的题目有关统计的话,可以转化成$0,-1,1$这三个数来做,分别表示这个数$=x$,$<x$和$>x$ 这个题也就是要求统计$x$左边和右边相同的$s$的对数,$s$表示前缀和之差 基数排序 #include<bits/stdc++.h> using namespace std; int n,x; ][]; i…
baidu了一下bzoj水题列表...找到这道题.   题目大意:给定一个数t,在给定的一段包含1-n的序列中找出多少个长度为奇数子序列的中位数为t. 第一眼没看数据范围,于是开心的打了一个O(n^3)的循环,TLE....   想了想,子序列中必须包含t,所以子序列中其他数的个数必定为偶数,所以子序列中有t以及n个大于t的数和n个小于t的数(n为偶数):   因为是1-n的排列,所以也不会出现多个t的情况..   于是发现了一个很神奇的思路,对于序列里任何一个数,把小于t的数定义为-1,等于t…
[题目链接] 点击打开链接 [算法] 将小于m的数看作-1,大于m的看作1 然后求前缀和,如果区间[l,r]的中位数是m,显然有 : sum(r) - sum(l-1) = 0 因此,只需m的位置之前(后)统计每个前缀和出现的次数,然后通过乘法原理计算答案,即可 [代码] #include<bits/stdc++.h> using namespace std; #define MAXN 100010 long long i,n,m,pos,sum,opt,ans; ],r[MAXN*]; te…
给出 \(1~n\) 的一个排列,统计该排列有多少个长度为奇数的连续子序列的中位数是 \(b\).中位数是指把所有元素从小到大排列后,位于中间的数. Solution (这个题为什么会被打上数学标签?) 由于给出的是排列,我们找到这个数在哪,然后考虑它左边和右边的数 我们把比它大的数都变成 \(1\) ,小的都变成 \(-1\) 向左的后缀和值构成的多重集 \(A\),向右的 \(B\) 现在就是要在向左和向右里面各找出一个数相加和为 \(0\),求方案数 拿桶搞搞就可以了 #include <…
A. Brain's Photos time limit per test 2 seconds memory limit per test 256 megabytes input standard input output standard output Small, but very brave, mouse Brain was not accepted to summer school of young villains. He was upset and decided to postpo…
不错的思维题 传送门:$>here<$ 题意:给出一个N的排列,求出其中有多少个连续子段的中位数是b 数据范围:$N \leq 100000$ $Solution$ 先考虑中位数的意义:一个序列中,大于它的与小于它的一样多.而由于中位数已经确定,所以最终的序列一定包含它所在的那个位置. 设$$c[i]=\begin{cases}0 & \text{} a[i]==b \\ 1 & \text{} a[i]>b \\ -1 & \text{} a[i]<b \…
4459: [Jsoi2013]丢番图 Time Limit: 10 Sec  Memory Limit: 64 MB Description 丢番图是亚历山大时期埃及著名的数学家.他是最早研究整数系数不定方程的数学家之一.为了纪念他,这些方程一般被称作丢番图方程.最著名的丢番图方程之一是x^N+y^n=z^N.费马提出,对于N>2,x,y,z没有正整数解.这被称为“费马大定理”,它的证明直到最近才被安德鲁·怀尔斯(AndrewWiles)证明.考虑如下的丢番图方程:1/x+1/y=1/n(x,…