109. 天才ACM(二分、倍增

109. 天才ACM(二分、倍增 题源倍增比二分快了一个logn#pragmaGCCoptimize(3)#includebits/stdc.h#includeiostreamusingnamespacestd;#defineintlonglongintK,M,N,T;constintMAX_LEN5e59;intarr[MAX_LEN];intbrr[MAX_LEN]{};templatetypenameTinlineTread(){T X0;registerboolflag1;registercharchgetchar();while(ch0||ch9){if(ch-)flag0;chgetchar();}while(ch0ch9){X(X1)(X3)ch-0;chgetchar();}if(flag)returnX;return~(X-1);}inlineboolcheck(intst,intmid){intpowSum0;memcpy(brr1,arrst,mid*sizeof(int));// for (int i st;i6;i)coutarr[i]\n;// for (int i st;i6;i)coutbrr[i]\n;sort(brr1,brrmid1);for(inti1;iM;i){if(imid-i1){powSumpow(brr[mid-i1]-brr[i],2);// coutpowSumps\n;}elsebreak;}// coutst mid powSum--\n;if(powSumT)returntrue;returnfalse;}signedmain(){Kreadint();while(K--){// scanf(%lld %lld %lld,N,M,T);Nreadint();Mreadint();Treadint();for(inti1;iN;i){// scanf(%lld,arr[i]);arr[i]readint();}intdst1,ans0,end1;intmulti1;while(dstN){//段的起点小于等于nmulti1;while(multi!0){//无法倍增为止if(endmultiNcheck(dst,endmulti-dst1)){//如果倍增结束点multin,并且检查起点到倍增后的结束点满足//则结束点更新倍增增加endmulti;multi1;}else{multi1;//否则减少}}ans;dstend1;//更新起点为倍增后的下一个}printf(%lld\n,ans);}return0;}