/*本算法的缺点在于开的空间太大分三类情况线段(-10,-1)在负区间(-10,10)双区间(1,10)正区间一下给出正区间的代码,已考虑小数思路是绝对正区间,覆盖到数轴sz[]数组上小数部分用sum1累计*/#include<bits/stdc++.h>usingnamespacestd;#definemax1000//数轴长度intsz[max];#definen10//测试线段条数坐标入下(a[],b[])/*0123456doublea[2*n]={1,3,5,7,9,11,13,15,17,19};doubleb[2*n]={2,4,6,8,10,12,14,16,18,20};*/doublea[2*n];doubleb[2*n];intadd=n;//添加的线段下标doublefunadd(ints,intt){for(inti=s;i<=t;i++){sz[i]=1;}}doublefun()//数轴上置1小数部分用sum1累计sum2为整数部分求和{doublesum=0;doublesum1=0;doublesum2=0;ints=0;intt=0;for(inti=0;i<2*n;i++){if(a[i]==b[i])continue;//未处理部分为0就好了不知道初始化;if(a[i]>b[i])swap(a[i],b[i]);if(a[i]<0&&b[i]<0){tmp=-a[i];a[i]=-b[i];b[i]=tmp;}//均为负数的处理方法if(a[i]<0&&b[i]>0){a[add]=0;b[add]=-a[i];add++;a[i]=0;}//双区间的截断处理方法产生新的区间放到未处理的数组对中s=ceil(a[i]);t=floor(b[i]);sum1+=s-a[i];sum1+=b[i]-t;funadd(a[i],b[i]);}for(inti=0;i<2*max;i++){if(sz[i]==1)sum2+=1;}sum=sum1+sum2;returnsum;}//负数的处理转正(-5,-1)-->(1,5)//(-10,10)这种分为2部分intmain(){for(inti=0;i<n;i++){a[i]=2*i+1;b[i]=2*i+2;}for(inti=n;i<2*n;i++){a[i]=b[i]=0;}cout<<fun()<<endl;cout<<"Hello,C++worldofAnycodeX!"<<endl;return0;}