p1917

            关于二分的重要性

这题,题意是没有看懂的(汉),但是看懂了图,那就搞吧。

写了一个数组大小为50010的后发现大数据是会越界的。嗯嗯?这不是一个水题么?于是仔细阅读题目后发现:如果还想用数组记录下每个时刻的位置的音符的话是要开50000*50000的一维数组的,肯定是爆炸的。

于是想到了前缀和,但是这样子时间复杂度又成了50000*50000,还是不行。

于是询问了大神杨宇航,得知可以用二分a掉的。。。。这还真是简单易行的一种改进方法了,虽然不知道他说的是怎么个二分法,但我会套用我的前缀和就也行。

忐忑的写了一份代码,竟然很快A掉了,就非常开心。

结论:高人就是高人、以后要重视二分。

 1 #include <cstdio>
 2 #include <iostream>
 3 #include <cmath>
 4 #include <string>
 5 #include <cstring>
 6 #include <algorithm>
 7 using namespace std;
 8 inline void write(int x)  
 9 {  
10     if(x>9) write(x/10);  
11     putchar(x%10+'0');  
12 }
13 inline int read()
14 {
15     int x=0;
16     char ch=getchar();
17     while(ch>'9'||ch<'0')
18         ch=getchar();
19     while(ch>='0'&&ch<='9')
20     {
21         x=(x<<1)+(x<<3)+ch-'0';
22         ch=getchar();
23     }
24     return x;
25 }
26 int i,f,m,n,q,t;
27 int sum[51000];
28 int find(int x)
29 {
30     int zuo=1,you=n,mid=(zuo+you)/2;
31     while(zuo+1<you)
32     {
33         if(t>sum[mid-1]&&t<=sum[mid])return mid;
34         if(t<sum[mid])you=mid;
35         if(t>sum[mid])zuo=mid;
36         mid=(zuo+you)/2;
37     }
38     if(t>sum[zuo-1]&&t<=sum[zuo])return zuo;//决策还是我想了好久才弄出来的,果然太菜了
39     else return you;
40 }
41 int main()
42 {
43 //freopen("123.in","r",stdin);
44 //freopen("123.out","w",stdout);
45     n=read();q=read();
46     sum[1]=read()-1;
47     for(i=2;i<=n;i++)
48     {
49         t=read();
50         sum[i]=sum[i-1]+t;
51         
52     }
53     for(i=1;i<=q;i++)
54     {
55         t=read();
56         if(t==0)
57         {
58             putchar(int('1'));
59             putchar(32);
60             continue;
61         }
62 ////////////////////////////二分
63         
64         write(find(t));
65         putchar(32);
66         continue;
67     }
68 }
O(∩_∩)O

      附上努力过程

 

原文地址:https://www.cnblogs.com/qywyt/p/9174889.html