• 19-11-08-Night


    再咕咕咕会被爆捶吗???

    ZJ:

    喜闻乐见:

    27
    Miemeng 60
    01:59:43
    100
    01:59:44
    0
    01:59:44
    160
    01:59:44

    最水的$T1$挂了????

    $T2$乱搞直接$A$????

    $T3$为什么是$0$,暴力又跪了??

    $kuku$

    TJ解:

    T1:

    合并石子,初始化集合大小(或者打记忆化)

    先拆环。

    好像就没啥了。

    话说我T1为什么只枚举到$n$,我明明拆环了啊?我双神志不清了???

    #include <iostream>
    #include <cstring>
    #include <cstdio>
    #define N 333
    
    using namespace std;
    
    int dp[2*N][2*N];
    int arr[N*2],nn;
    int val[2*N][2*N],nval[N];
    int ans=0;
    
    int vlnum(int l,int r){
    	if(val[l][r])return val[l][r];
    	int vn=0;
    	for(int i=l;i<=r;i++){
    		if(nval[arr[i]]==0)vn++;
    		nval[arr[i]]++;
    	}
    	for(int i=l;i<=r;i++)
    		nval[arr[i]]--;
    	return val[l][r]=vn;
    }
    inline int getval(int l1,int r1,int l2,int r2){
    	return vlnum(l1,r1)*vlnum(l2,r2);
    }
    int main(){
    #ifndef LOCAL
    	freopen("merge.in" ,"r",stdin);
    	freopen("merge.out","w",stdout);
    #endif
    	scanf("%d",&nn);
    	for(int i=1;i<=nn;i++){
    		scanf("%d",arr+i);
    		arr[nn+i]=arr[i];
    	}
    	for(int len=0;len<nn;len++){
    		for(int l=1;l+len<=2*nn;l++){
    			int r=l+len;
    			for(int k=l;k<r;k++){
    				dp[l][r]=max(dp[l][r],dp[l][k]+dp[k+1][r]+getval(l,k,k+1,r));
    			}
    		}
    	}
    	for(int i=1;i<=nn;i++){
    		ans=max(dp[i][i+nn-1],ans);
    	}
    	cout<<ans<<endl;
    }
    

    T2

    正解是枚举最后一嗑药,$mathsf{ST}$表维护查询。

    $Theta(N log N)$

    这里我安利一下我的乱搞。

    首先维护一个堆(以$A-B$ [上升高度] 为关键字的大根堆)「堆1」

    然后再来一个(以$A$为关键字的大根堆)「堆2」

    然后每次先从堆2中查一下能不能一发入魂,

    如果已经嗑掉了,那么我们考虑反悔,把当时嗑掉的吐出来,用当前堆1顶的弥补一下。

    如果加上弥补也上不去那就扔掉(其实这里是伪的,扔掉的有时候在后面反悔是正确的(捂脸)

    如果没有嗑掉,我们试试嗑一下,如果出去了就嗑。

    如果怎么都上不去,我WMJ从堆1中取一个药并嗑掉,

    如果在这时被淹死了,那一定死了,因为别的也不可能上升更高。

    于是过不了对拍,

    配上暴力及特殊性质食用。

    于是AC了???

    请大佬们随意Hack(汗可,亥可):

    //climb
    
    #include <algorithm>
    #include <iostream>
    #include <cstring>
    #include <cstdio>
    #include <queue>
    #define N 111111
    
    using namespace std;
    
    int dn,hei;
    struct YW{
    	int up,down;
    }ys[N];
    int upw[N],per[N];
    int ans=0x7fffffff;
    struct A_MAX{
    	int up,down,id;
    	A_MAX(){}
    	A_MAX(const YW a,int b){up=a.up,down=a.down,id=b;}
    	friend bool operator < (const A_MAX &a,const A_MAX &b){
    		return a.up<b.up;
    	}
    };
    struct Del_MAX{
    	int up,down,id;
    	Del_MAX(){}
    	Del_MAX(const YW a,int b){up=a.up,down=a.down,id=b;}
    	friend bool operator < (const Del_MAX &a,const Del_MAX &b){
    		return a.up-a.down<b.up-b.down;
    	}
    };
    bool is_del[N];
    priority_queue<A_MAX>aq;
    priority_queue<Del_MAX>dq;
    namespace B_eq_0{
    	inline bool CMP(const YW &a,const YW &b){
    		return a.up>b.up;
    	}
    	void work(){
    		sort(ys+1,ys+dn+1,CMP);
    		int pos=0,wpos=0;
    		for(int i=1;i<=dn;i++){
    			pos+=ys[i].up;
    			if(pos>=hei){
    				printf("%d
    ",i);
    				return ;
    			}
    			wpos+=upw[i];
    			if(pos<=wpos){
    				puts("-1");
    				return ;
    			}
    		}
    		puts("-1");
    		return ;
    	}
    }
    namespace C_eq_0{
    	void work(){
    		for(int i=1;i<=dn;i++){
    			aq.push(  A_MAX(ys[i],i));
    			dq.push(Del_MAX(ys[i],i));
    		}
    		int pos=0;
    		for(int i=1;i<=dn;i++){
    			while(is_del[aq.top().id] && pos+aq.top().down+dq.top().up-dq.top().down < hei){
    				aq.pop();
    			}
    			if(is_del[aq.top().id]){
    				printf("%d
    ",i);
    				return;
    			}
    			else if(!is_del[aq.top().id] && aq.top().up+pos>=hei){
    				printf("%d
    ",i);
    				return;
    			}
    			pos+=dq.top().up;
    			pos-=dq.top().down;
    			is_del[dq.top().id]=1;
    			dq.pop();
    		}
    		puts("-1");
    		return ;
    	}
    }
    int getans(){
    	int pos=0,wtpos=0;
    	for(int i=1;i<=dn;i++){
    		pos+=ys[per[i]].up;
    		if(pos>=hei)
    			return i;
    		pos-=ys[per[i]].down;
    		wtpos+=upw[i];
    		if(pos<=wtpos)return 0x7fffffff;
    	}
    	return 0x7fffffff;
    }
    
    int main(){
    #ifndef LOCAL
    	freopen("climb.in" ,"r",stdin);
    	freopen("climb.out","w",stdout);
    #endif
    	bool down_0=1,upw_0=1;
    	scanf("%d%d",&dn,&hei);
    	for(int i=1;i<=dn;i++){
    		per[i]=i;
    		scanf("%d%d",&ys[i].up,&ys[i].down);
    		if(ys[i].down!=0)down_0=0;
    	}
    	for(int i=1;i<=dn;i++){
    		scanf("%d",upw+i);
    		if(upw[i]!=0)upw_0=0;
    	}
    	if(dn<=10){
    		do{
    			ans=min(ans,getans());
    		}while(next_permutation(per+1,per+dn+1));
    		printf("%d
    ",ans>dn?-1:ans);
    		return 0;
    	}
    	if(down_0)    B_eq_0::work();
    	else if(upw_0)C_eq_0::work();
    	else{
    		for(int i=1;i<=dn;i++){
    			aq.push(  A_MAX(ys[i],i));
    			dq.push(Del_MAX(ys[i],i));
    		}
    		int pos=0,wpos=0;
    		for(int i=1;i<=dn;i++){
    			while(is_del[aq.top().id] && pos+aq.top().down+dq.top().up-dq.top().down < hei){
    				aq.pop();
    			}
    			if(is_del[aq.top().id]){
    				printf("%d
    ",i);
    				return 0;
    			}
    			else if(!is_del[aq.top().id] && aq.top().up+pos>=hei){
    				printf("%d
    ",i);
    				return 0;
    			}
    			pos+=dq.top().up;
    			if(pos>=hei){
    				printf("%d
    ",i);
    				return 0;
    			}
    			pos-=dq.top().down;
    			wpos+=upw[i];
    //			cout<<pos<<" "<<wpos<<endl;
    			if(pos<=wpos)break;
    			is_del[dq.top().id]=1;
    			dq.pop();
    		}
    		puts("-1");
    
    	}
    }
    

    UPD:T3不会

  • 相关阅读:
    php的echo和print
    面向对象进阶:命名空间和组合
    初识面向对象
    模块和包
    异常处理
    常用模块(random,os,json,pickle,shelve)
    闭包函数
    re模块和正则表达式
    常用模块
    匿名函数
  • 原文地址:https://www.cnblogs.com/kalginamiemeng/p/Exam20191108-Night.html
Copyright © 2020-2023  润新知