2019.8.8 模拟测试

T1:昆特牌

wsm这题面这么迷呢。。。。

模拟细节好多过艹。。。。

幸好第五种只有俩点有一个还水(雾

注意判重和非法情况(哈戳戳的写了个map去映射操作序列跑的贼慢

【丑陋的代码】

#include<bits/stdc++.h>
using namespace std;

int n,w,ans=-0x3f3f3f3f,tot;
int use[10],que[10];
vector<int> zhanchang[7];
int tianqi[7];
string s1;
map<string,int> caozuo;
struct player{
	struct c{
		int type;//1:单位 2:天气 3:反天气 4:烧灼 5:号角 
		int pos;
		int point;
		string id;
	}card[10];
}a,b;

int Read(){
	int i=0,f=1;
	char c;
	for(c=getchar();(c>'9'||c<'0')&&c!='-';c=getchar());
	if(c=='-')  f=-1,c=getchar();
	for(;c>='0'&&c<='9';c=getchar())
	  i=(i<<3)+(i<<1)+c-'0';
	return i*f;
}

int chupai(int p,int now){
	if(p==2){
		if(b.card[now].type==1){
			zhanchang[b.card[now].pos+3].push_back(b.card[now].point);
		}
		if(b.card[now].type==2){
			tianqi[b.card[now].pos]=tianqi[b.card[now].pos+3]=1;
		}
		if(b.card[now].type==3){
			for(int i=1;i<=3;++i)
			  tianqi[i]=tianqi[i+3]=0;
		}
		if(b.card[now].type==4){
			int maxx=0;
			for(int i=1;i<=6;++i){
				if(tianqi[i])  continue;
				for(int j=0;j<zhanchang[i].size();++j)
				  maxx=max(maxx,zhanchang[i][j]);
			}
			if(maxx){
				for(int i=1;i<=6;++i){
					if(tianqi[i])  continue;
					for(int j=0;j<zhanchang[i].size();++j)
				  	  if(zhanchang[i][j]==maxx)
				  	    zhanchang[i][j]=0;
				}
			}
		}
	}
	else{
		if(a.card[que[now]].type==1){
			s1=s1+a.card[que[now]].id;
			zhanchang[a.card[que[now]].pos].push_back(a.card[que[now]].point);
		}
		if(a.card[que[now]].type==2){
			s1=s1+a.card[que[now]].id;
			tianqi[a.card[que[now]].pos]=tianqi[a.card[que[now]].pos+3]=1;
		}
		if(a.card[que[now]].type==3){
			s1=s1+a.card[que[now]].id;
			for(int i=1;i<=3;++i)
			  tianqi[i]=tianqi[i+3]=0;
		}
		if(a.card[que[now]].type==4){
			s1=s1+a.card[que[now]].id;
			int maxx=0;
			for(int i=1;i<=6;++i){
				if(tianqi[i])  continue;
				for(int j=0;j<zhanchang[i].size();++j)
				  maxx=max(maxx,zhanchang[i][j]);
			}
			if(maxx){
				for(int i=1;i<=6;++i){
					if(tianqi[i])  continue;
					for(int j=0;j<zhanchang[i].size();++j)
				  	  if(zhanchang[i][j]==maxx)
				  	    zhanchang[i][j]=0;
				}
			}
		}
		if(a.card[que[now]].type==5){
			s1=s1+a.card[que[now]].id;
			int flag=0;
			for(int i=1;i<=6;++i){
				if(!tianqi[i])
				  flag=1;
			}
			if(flag&&tianqi[a.card[que[now]].pos]){
			  	return 0;
			}
			if(!flag)  s1=s1+'0';
			else{
				char x='0'+a.card[que[now]].pos-1;
				s1=s1+x;
			}
			for(int i=0;i<zhanchang[a.card[que[now]].pos].size();++i)
			  zhanchang[a.card[que[now]].pos][i]*=2;
		}
	}
	return 1;
}

int calc(){
	int pointa=0,pointb=0;
	for(int i=1;i<=3;++i){
		for(int j=0;j<zhanchang[i].size();++j){
			if(zhanchang[i][j]){
				if(tianqi[i])++pointa;
				else  pointa+=zhanchang[i][j];
			}
		}
		for(int j=0;j<zhanchang[i+3].size();++j){
			if(zhanchang[i+3][j]){
				if(tianqi[i+3])++pointb;
				else  pointb+=zhanchang[i+3][j];
			}
		}
	}
	return pointa-pointb;
}

void moni(){
	s1="";
	for(int i=1;i<=6;++i)
	  zhanchang[i].clear(),tianqi[i]=0;
	if(w){
		for(int i=1;i<=n;++i){
//			cout<<b.card[i].type<<' '<<b.card[i].point<<' '<<b.card[i].pos<<'\n';
			chupai(2,i);
//			cout<<a.card[que[i]].type<<' '<<a.card[que[i]].point<<' '<<a.card[que[i]].pos<<'\n';
			if(!chupai(1,i))
			  return ;
		}
	}
	else{
		for(int i=1;i<=n;++i){
//			cout<<a.card[que[i]].type<<' '<<a.card[que[i]].point<<' '<<a.card[que[i]].pos<<'\n';
			if(!chupai(1,i)) return ;
//			cout<<b.card[i].type<<' '<<b.card[i].point<<' '<<b.card[i].pos<<'\n';
			chupai(2,i);
		}
	}
	if(caozuo[s1])  return ;
	caozuo[s1]=1;
	int ans1=calc();
//	cout<<ans1<<'\n';
	if(ans==ans1)  ++tot;
	else  if(ans<ans1)  ans=ans1,tot=1;
}

void dfs(int now){
	if(now==n+1){
		moni();
//		cout<<'\n';
		return ;
	}
	for(int i=1;i<=n;++i){
		if(!use[i]){
			use[i]=1;
			que[now]=i;
			if(a.card[i].type==5){
				for(int j=1;j<=6;++j){
					a.card[i].pos=j;
					char x='a'+j-1;
					dfs(now+1);
				}
				use[i]=0;
				continue;
			}
			dfs(now+1);
			use[i]=0;
		}
	}
}

int main(){
	w=Read(),n=Read();
	char now='a';
	for(int i=1;i<=n;++i){
		b.card[i].type=Read();
		if(b.card[i].type==1){
			b.card[i].point=Read();
			b.card[i].pos=Read()+1;
		}
		if(b.card[i].type==2)  b.card[i].pos=Read()+1;
	}
	for(int i=1;i<=n;++i){
		a.card[i].id=now;now++;
		a.card[i].type=Read();
		if(a.card[i].type==1){
			a.card[i].point=Read();
			a.card[i].pos=Read()+1;
		}
		if(a.card[i].type==2)  a.card[i].pos=Read()+1;
	}
	dfs(1);
	cout<<ans<<' '<<tot;
	return 0;
}

T2:电梯

看着数据范围就知道能O(1)做。。。。

结果少想了特殊情况咕成10pts

【代码】

#include<bits/stdc++.h>
using namespace std;

int T,n,m,a,b,c;

int Read(){
	int i=0,f=1;
	char c;
	for(c=getchar();(c>'9'||c<'0')&&c!='-';c=getchar());
	if(c=='-')
	  f=-1,c=getchar();
	for(;c>='0'&&c<='9';c=getchar())
	  i=(i<<3)+(i<<1)+c-'0';
	return i*f;
}

int main(){
	T=Read();
	while(T--){
		n=Read(),m=Read(),a=Read(),b=Read(),c=Read();
		c=c%(n-2)+2;
		if(c==2&&m==1)puts("-1");
		else  cout<<(n-1)+(m+1)/2<<'\n';
	}
}

T3:玩

抱着一颗想开1e18的线段树的心打了40pts暴力==

结果打着打着比赛结束了(%你害人不浅啊

正解二分左右端点所在块,开两颗线段树维护就好了

【代码】

#include<bits/stdc++.h>
using namespace std;
#define LL long long
const int N=5e5+5;
const LL Mod=1e8+7;

int n,c;
LL lastans;
struct Tree{
	int l,r;
	LL len,maxh;
}tr[N<<2];


LL Read(){
	LL i=0,f=1;
	char c;
	for(c=getchar();(c>'9'||c<'0')&&c!='-';c=getchar());
	if(c=='-')  f=-1,c=getchar();
	for(;c>='0'&&c<='9';c=getchar())
	  i=(i<<3)+(i<<1)+c-'0';
	return i*f;
}

#define lc (root<<1)
#define rc (root<<1|1)
void build(int root,int l,int r){
	tr[root].l=l;
	tr[root].r=r;
	if(l==r){
		tr[root].len=0ll;
		return;
	}
	int mid=(l+r)>>1;
	build(lc,l,mid);
	build(rc,mid+1,r);
}

void push_up(int root){
	tr[root].len=tr[lc].len+tr[rc].len;
	tr[root].maxh=max(tr[lc].maxh,tr[rc].maxh);
}

void update(int root,int k,LL len,int h){
	if(tr[root].l==tr[root].r){
		tr[root].len=len;
		tr[root].maxh=h;
		return ;
	}
	if(k<=tr[lc].r)
	  update(lc,k,len,h);
	else 
	  update(rc,k,len,h);
	push_up(root);
}

LL query(int root,LL k,int type){
	if(tr[root].l==tr[root].r){
		if(type==0){
			if(k==0)
			  return tr[root].l-1;
			else 
			  return tr[root].l;
		}
		else 
		  return tr[root].l;
	}
	if(k>=tr[lc].len)
	  return query(rc,k-tr[lc].len,type);
	else 
	  return query(lc,k,type);
}

LL find(int root,int l,int r){
	if(tr[root].l>=l&&tr[root].r<=r){
		return tr[root].maxh;
	}
	LL res=0;
	if(tr[lc].r>=l)
	  res=max(res,find(lc,l,r));
	if(tr[rc].l<=r)
	  res=max(res,find(rc,l,r));
	return res;
}

LL rel(LL x){
	return (x*2333+lastans*666)%Mod+1;
}

int main(){
	n=Read(),c=Read();
	build(1,1,n);
	int now=0;
	for(int i=1;i<=n;++i){
		int cz=Read();
		if(cz==1){
			LL len=Read();
			LL h=Read();
			if(c==1){
				len=rel(len);
				h=rel(h);
			}
			update(1,++now,len,h);
		}
		else{
			if(cz==2){
				int x=Read();
				update(1,x,0,0);
			}
			else{
				LL L=Read(),R=Read(),l,r;
				l=query(1,L,0),r=query(1,R,1);
				lastans=find(1,l,r);
				cout<<lastans<<'\n';
			}
		}
	}
	return 0;
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值