(模拟)HDU - 5857 Median

原题链接:HDU5857



题意:



分析:先挂代码,分析等会写



代码:

 1 #include <iostream>
 2 #include <cstdio>
 3 #include <cmath>
 4 #include <algorithm>
 5
 6 using namespace std;
 7
 8 const int maxn=100010;
 9 long long num[maxn];
10
11 int main() {
12     int t;
13     scanf("%d",&t);
14     while(t--) {
15         int n,m;
16         scanf("%d%d",&n,&m);
17         for(int i=1; i<=n; i++) {
18             scanf("%I64d",&num[i]);
19         }
20         for(int i=0; i<m; i++) {
21             double ans=0;
22             int l1,r1,l2,r2;
23             scanf("%d%d%d%d",&l1,&r1,&l2,&r2);
24             if(l1>l2||(l1==l2&&r1>r2)) {
25                 swap(l1,l2);
26                 swap(r1,r2);
27             }
28             if(l1<=l2&&r1>=r2) {
29                 swap(r1,r2);
30             }
31             int len1=r1-l1+1;
32             int len2=r2-l2+1;
33             int len=len1+len2;
34             if(r1<l2) {
35                 if(len%2==0) {
36                     int half=len/2;
37                     if(len1>half) {
38                         ans=double(num[l1+half-1]+num[l1+half])/2;
39                     } else if(len2>half) {
40                         ans=double(num[r2-half+1]+num[r2-half])/2;
41                     } else if(len1==half) {
42                         ans=double(num[r1]+num[l2])/2;
43                     }
44                 } else {
45                     int half=len/2+1;
46                     if(len1>=half) {
47                         ans=double(num[l1+half-1]);
48                     } else {
49                         ans=double(num[r2-half+1]);
50                     }
51                 }
52             } else {
53                 if(len%2==0) {
54                     int half=len/2;
55                     if(l1+half-1<l2) {
56                         ans=double(num[l1+half-1]+num[l1+half])/2;
57                     } else if(r2-half+1>r1) {
58                         ans=double(num[r2-half+1]+num[r2-half])/2;
59                     } else {
60                         half=half-(l2-l1);
61                         ans=double(num[l2+(int)ceil(double(half)/2)-1]+num[l2+(int)ceil(double(half+1)/2)-1])/2;
62                     }
63                 } else {
64                     int half=len/2+1;
65                     if(l1+half-1<l2) {
66                         ans=double(num[l1+half-1]);
67                     } else if(r2-half+1>r1) {
68                         ans=double(num[r2-half+1]);
69                     } else {
70                         half=half-(l2-l1);
71                         ans=double(num[l2+(int)ceil(double(half)/2)-1]);
72                     }
73                 }
74             }
75             printf("%.1f\n",ans);
76         }
77     }
78     return 0;
79 }
时间: 2025-01-14 20:36:43

(模拟)HDU - 5857 Median的相关文章

HDU 5857 Median (2016 多校训#10 1001)

题目链接:http://acm.split.hdu.edu.cn/showproblem.php?pid=5857 题意:给出一个已排好的序列,再给出两个范围(l1,r1,l2,r2),求由着两个子序列 组成的新序列的中位数,结果保留一位小数. 官方题解: 一个数组上的两个区间求中位数,可以通过分类讨论直接找到中位数,复杂度O(1).不过本题数据较小,优美的log(n)也可过. 分析:我用的是前者的方法.弄一个函数求新序列排第X在原序列的下标,如果长度是奇数,直接求排在第len/2+1位上的,偶

HDU 5857 Median

因为原序列是排列好了的,那么只要看一下给出的两个区间相交的情况,然后分类讨论一下,O(1)输出. #pragma comment(linker, "/STACK:1024000000,1024000000") #include<cstdio> #include<cstring> #include<cmath> #include<algorithm> #include<vector> #include<map> #i

模拟 --- hdu 12878 : Fun With Fractions

Fun With Fractions Time Limit: 1000ms, Special Time Limit:2500ms, Memory Limit:65536KB Total submit users: 152, Accepted users: 32 Problem 12878 : No special judgement Problem description A rational number can be represented as the ratio of two integ

模拟/hdu 1008 Elevator

题意 开始电梯在0层 给出n个指令,每个代表下一步停到哪层 每往上一层需要6秒,往下一层需要4秒,停止需要5秒 求总时间 分析 数据很小,模拟即可喵- Accepted Code 1 /* 2 PROBLEM:hdu1007 3 AUTHER:Nicole Lam 4 MEMO:模拟 5 */ 6 7 8 #include<cstdio> 9 using namespace std; 10 11 int main() 12 { 13 int n; 14 scanf("%d"

[模拟] hdu 4452 Running Rabbits

题意: 两个人一个人在(1,1),一个人在(N,N) 给每个人每秒移动的速度v,和一个s代表移动s秒后左转方向 特别注意的是如果撞墙,要反弹回去,方向改变 比如在(1,1),往左走一步到(1,0) 其实就是走到了(1,2) 然后如果两个人见面那么交换方向并且不再左转! 思路: 直接模拟.. 代码: #include"cstdlib" #include"cstdio" #include"cstring" #include"cmath&qu

[模拟] hdu 5308 I Wanna Become A 24-Point Master

题意: 给你n个数,每个数都是n, 然后把这n个数加减乘除,每个数都必须用一次,且只能一次,并且运算完的数也都得用一次. 也就是做n-1次,问能不能得到24,输出过程 xi ? xj  第i个数与第j个数做?运算 这种形式 思路: 因为n有可能很大,那么肯定需要一种完美的构造 最简单的方法是构造出4*6 构造出4需要5个数,构造出6需要7个数 也就是最少需要12个数,剩下的数就是相减为0,然后乘就好了 但是需要注意的就是13是不满足这个规律的 所以1~13特判一下,14以上的按规律输出就好了~

leetcode解题目录

参考文献:http://blog.csdn.net/lanxu_yy/article/details/17848219 不过本文准备用超链接的方式连接到相应解答页面,不断更新中 题目 算法 数据结构 注意事项 Clone Graph BFS 哈希表 Word Ladder II BFS 哈希表 Surrounded Regions BFS 矩阵 Word Ladder BFS N/A Binary Tree Level Order Traversal BFS|前序遍历 队列 Binary Tre

hdu 5640 King&#39;s Cake(模拟)

Problem Description It is the king's birthday before the military parade . The ministers prepared a rectangle cake of size n×m(1≤n,m≤10000) . The king plans to cut the cake himself. But he has a strange habit of cutting cakes. Each time, he will cut

hdu 4930 Fighting the Landlords (模拟)

Fighting the Landlords Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 262144/262144 K (Java/Others) Total Submission(s): 160    Accepted Submission(s): 52 Problem Description Fighting the Landlords is a card game which has been a heat for ye