zoukankan      html  css  js  c++  java
  • 11.8模拟赛

    预计得分: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个小时调(怼)一个数据结构吧……
    那样的话吃枣耀丸

  • 相关阅读:
    Justoj 2389: 拼接三角形 二分查找
    P4513 小白逛公园(线段树求区间最大子段和)
    勾股数
    费马大定理
    D1. Kirk and a Binary String (easy version)
    Find the median(线段树离散化+区间更新)
    String
    最小表示法
    扩展KMP模板(学习)
    K-th Closest Distance
  • 原文地址:https://www.cnblogs.com/qdscwyy/p/7805633.html
Copyright © 2011-2022 走看看