19-11-08-+

$RP++$

ZJ:

犯傻了……

T1因为暴力打错所以表也死了。

后来改对我也没再打。(我在干什么????

T2仿佛是个原题(货车运输??)蒟蒻没做过不过现在也涨知识了。

T3多测 return 0  挂15分……

43
Miemeng 20
00:00:47
30
00:00:47
5
00:00:47
55
00:00:47

TJ解:

大家都AC了我写这个没意义了吧

T1:

简单打表会发现,我们的字符串的长相不会影响答案。

然后我们再简单证明一下。

我们的合法情况只有在原字符串的中间插入一些字符(或者卡在开头结尾)

那么为了防止重复,紧接着的下一个字符不能是字符串内的该位字符。

但是有一个不需要考虑,开头/结尾,不然就会因为把一种情况全部删除而容斥失败。

于是:

#include <iostream>
#include <cstring>
#include <cstdio>
#define LL long long
#define N 1111111

using namespace std;

LL n,len;
char st[N];
const int Mod=998244353;

LL ppow(LL a,LL b){
	LL res=1;
	if(b<0)return 0;
	while(b){
		if(b&1)res=res*a%Mod;
		a=a*a%Mod;
		b>>=1;
	}
	return res;
}
int main(){
#ifndef LOCAL
	freopen("magic.in" ,"r",stdin);
	freopen("magic.out","w",stdout);
#endif
	ios_base::sync_with_stdio(false);
	cin>>n>>st;
	len=strlen(st);
	cout<<(ppow(26,n)%Mod-ppow(26,n-len)%Mod-len*25%Mod*ppow(26,n-len-1)%Mod+Mod+Mod+Mod)%Mod<<endl;
}

T2:

(反)货车运输。

先跑最小生成树,然后树上倍增维护边权即可!

//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");

	}
}

T3

你见我写过T3题解吗

猜你喜欢

转载自www.cnblogs.com/kalginamiemeng/p/Exam20191108.html