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\n",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\n",i);
				return;
			}
			else if(!is_del[aq.top().id] && aq.top().up+pos>=hei){
				printf("%d\n",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\n",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\n",i);
				return 0;
			}
			else if(!is_del[aq.top().id] && aq.top().up+pos>=hei){
				printf("%d\n",i);
				return 0;
			}
			pos+=dq.top().up;
			if(pos>=hei){
				printf("%d\n",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不会

posted @ 2019-11-09 08:05  Miemeng_麦蒙  阅读(244)  评论(2编辑  收藏  举报

小麦在雨中,蒙蒙的雾气

麦蒙不想有人骚扰他,如果有必要 联系 QQ:1755601414

如果你嫌广告大,那就喷我吧,不是博客园的锅。