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 }
附上努力过程