2019 BUPT Winter Training #2 div.2

这篇博客主要解析了BUPT Winter Training中的多个编程题目,包括Sonya and Queries、Filya and Homework、Searching Rectangles等,涵盖了计导中等题和思维题,讨论了二分查找、模拟等解题策略,并对复杂度进行了分析。
摘要由CSDN通过智能技术生成

731A - A - Sonya and Queries

难度: 计导中等题
因为所有不同的情况只有 2 18 2^{18} 218种,所以可以开一个数组计数,然后这道题就做完了.

#include <cstdio>
#include <cstring>
const int N=1e5+5;

int cnt[1<<20];
int trans(char *x){
   
	int res=0;
	for(int i=0;i<18;i++)res=(res<<1)^((x[17-i]-'0')&1);
	return res;
}
void Reverse(char *s){
   
	int len=strlen(s);
	for(int j=0,k=len-1;j<k;j++,k--){
   
		char a=s[j];s[j]=s[k];s[k]=a;
	}
}
int main(){
   
	int n;
	scanf("%d",&n);
	while(n--){
   
		char o[10],s[20]={
   0};
		scanf("%s%s",o,s);
		Reverse(s);
		switch(o[0]){
   
			case '+':{
   
				cnt[trans(s)]++;
				break;
			}
			case '-':{
   
				cnt[trans(s)]--;
				break;
			}
			case '?':{
   
				printf("%d\n",cnt[trans(s)]);
				break;
			}
		}
	}
}

714B - B - Filya and Homework

难度: 计导中等题
如果有大于 3 3 3种不同的值,那么显然无解.如果有三种,那么显然需要 a + c = 2 b ( a &lt; b &lt; c ) a+c=2b(a&lt;b&lt;c) a+c=2b(a<b<c),如果小于两种则必然有解.

#include <cstdio>
#include <algorithm>
using namespace std;
int main(){
   
	int n;
	scanf("%d",&n);
	int a[100005],dif=0;
	for(int i=1;i<=n;i++){
   
		scanf("%d",&a[i]);
	}
	sort(a+1,a+1+n);dif=unique(a+1,a+1+n)-a-1;
	puts((dif<=2)?"YES":((dif<=3&&(a[1]+a[3]==a[2]*2))?"YES":"NO"));
}

714D - C - Searching Rectangles

难度: 计导中等题
考虑二分,每次缩短一半的寻找范围,因此迭代次数不超过 17 17 17次.一共有 8 8 8条边需要找,所以可以在 200 200 200次询问内找出两个矩形.

#include <iostream>
#include <algorithm>
using namespace std;
int res[10];
int a1,b1,a2,b2;
void update(int &q){
   
	if(a1<=res[1]&&b1<=res[2]&&res[3]<=a2&&res[4]<=b2)q--;
}
int main(){
   
	int n;
	scanf("%d",&n);
	int q;
	{
   
		a1=1;b1=1;a2=n;b2=n;
		int l=1,r=n;
		while(l<r){
   
			a2=(l+r)>>1;
			cout<<"? "<<a1<<" "<<b1<<" "<<a2<<" "<<b2<<endl;
			fflush(stdout);
			cin>>q;
			if(q==0)l=a2+1;else r=a2;
		}
		a2=l;
		//puts("here");
		l=1;r=a2;
		while(l<r){
   
			a1=(l+r+1)>>1;
			cout<<"? "<<a1<<" "<<b1<<" "<<a2<<" "<<b2<<endl;
			fflush(stdout);
			cin>>q;
			if(q==0)r=a1-1;else l=a1;
		}
		a1=l;
		//puts("here");
		l=1;r=n;
		while(l<r){
   
			b2=(l+r)>>1;
			cout<<"? "<<a1<<" "<<b1<<" "<<a2<<" "<<b2<<endl;
			fflush(stdout);
			cin>>q;
			if(q==0)l=b2+1;else r=b2;
		}
		b2=l;
		//puts("here");
		l=1;r=b2;
		while(l<r){
   
			b1=(l+r+1)>>1;
			cout<<"? "<<a1<<" "<<b1<<" "<<a2<<" "<<b2<<endl;
			fflush(stdout);
			cin>>q;
			if(q==0)r=b1-1;else l=b1;
		}
		b1=l;
		//puts("here");
		res[1]
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值