预计得分:100+0+50-100
实际得分:100+0+0
今天好气呀
怼了两个多小时的线段树
差点过样例
调试了一下午没有调出来
全是因为代码写的太丑了
Myj佬过样例然后就过了……
第一题……
第二题是紫书上的原题(稍作改动)(见某题4)
第三题是个线段树裸题
然而我的merge函数和query函数已经长成这样了
node merge(int L,int R){
node newn;
newn.l=T[L].l;
newn.r=T[R].r;
newn.left=T[L].left;
newn.right=T[R].right;
newn.midsta=T[L].midsta;
newn.midsize=T[L].midsize;
if(T[L].left==T[L].r-T[L].l+1&&T[R].left)
newn.left=T[L].left+T[R].left;
if(T[R].right==T[R].r-T[R].l+1&&T[L].right)
newn.right=T[R].right+T[L].right;
if(((((T[L].right+T[R].left-1))/2)>((newn.midsize-1)/2))){
newn.midsize=T[L].right+T[R].left;
newn.midsta=T[L].r-T[L].right+1;
}
if(T[L].right+T[R].left&&!newn.midsize){
newn.midsize=T[L].right+T[R].left;
newn.midsta=T[L].r-T[L].right+1;
}
if((((T[R].midsize-1)/2)>((newn.midsize-1)/2))){
newn.midsize=T[R].midsize;
newn.midsta=T[L].r-T[L].l+1+T[R].midsta;
}
if((T[R].midsize&&!newn.midsize)){
newn.midsize=T[R].midsize;
newn.midsta=T[L].r-T[L].l+1+T[R].midsta;
}
return newn;
}
int query(){
int ans,maxl=0;
if(T[1].left>maxl){
maxl=T[1].left;
ans=1;
}
if(!maxl&&T[1].midsize){
maxl=(T[1].midsize-1)>>1;
ans=T[1].midsta+maxl;
}
if((T[1].midsize)>maxl){
maxl=(T[1].midsize-1)>>1;
ans=T[1].midsta+maxl;
}
if(T[1].right>maxl){
maxl=T[1].right;
ans=n;
}
return ans;
}
然后就死活只过7个数据了
剩下的就是某两行顺序错了
然而对于这个题目来说顺序错了就意味着要么是merge函数
要么是query函数写错了(一个细微的错误)
于是我重构代码
代码是没那么恶心了
但是还是不对
……
int query(node &s){
int ans=0,maxl=0;
if(s.Z-1)ans=1,maxl=s.Z-1;
if(((s.MY-s.MZ)>>1)>maxl)ans=((s.MY-s.MZ)>>1)+s.MZ;
if(s.Y-1>maxl)ans=n;
return ans;
}
node merge(node& L,node& R){
node M=NEWnode(L.l,R.r);
M.Z=L.Z;
M.Y=R.Y;
if(L.Z==(L.r-L.l+1)&&R.Z)M.Z=L.Z+R.Z;
if(R.Y==(R.r-R.l+1)&&L.Y)M.Y=L.Y+R.Y;
M.MZ=L.MZ;M.MY=L.MY;
if(L.Y&&R.Z){
int mZ=L.r-L.l+1-L.Y+L.l;
int mY=R.l+R.Z-1;
if(mY-mZ+1>M.MY-M.MZ+1)M.MY=mY,M.MZ=mZ;
}
if(R.MY-R.MZ>M.MY-M.MZ)
M.MY=R.MY,M.MZ=R.MZ;
return M;
}
简直了
如果在考场上该怎么办呢
我总不能3个小时调(怼)一个数据结构吧……
那样的话吃枣耀丸