Meta Hacker Cup 2023 Round 1 题解

news/2024/6/17 19:04:58 标签: 算法, 深度优先, 图论

Problem A: Here Comes Santa Claus

给一个数列,要求分成若干组,要求每组至少2个数,使得所有组中位数的最大值与最小值之差尽量大,求这个值。

#include<bits/stdc++.h> 
using namespace std;
#define For(i,n) for(int i=1;i<=n;i++)
#define Fork(i,k,n) for(int i=k;i<=n;i++)
#define ForkD(i,k,n) for(int i=n;i>=k;i--)
#define Rep(i,n) for(int i=0;i<n;i++)
#define ForD(i,n) for(int i=n;i;i--)
#define RepD(i,n) for(int i=n;i>=0;i--)
#define Forp(x) for(int p=pre[x];p;p=next[p])
#define Forpiter(x) for(int &p=iter[x];p;p=next[p])  
#define Lson (o<<1)
#define Rson ((o<<1)+1)
#define MEM(a) memset(a,0,sizeof(a));
#define MEMI(a) memset(a,0x3f,sizeof(a));
#define MEMi(a) memset(a,128,sizeof(a));
#define MEMx(a,b) memset(a,b,sizeof(a));
#define INF (0x3f3f3f3f)
#define F (1000000007)
#define pb push_back
#define mp make_pair
#define fi first
#define se second
#define vi vector<int> 
#define pi pair<int,int>
#define SI(a) ((a).size())
#define Pr(kcase,ans) printf("Case #%d: %lld\n",kcase,ans);
#define PRi(a,n) For(i,n-1) cout<<a[i]<<' '; cout<<a[n]<<endl;
#define PRi2D(a,n,m) For(i,n) { \
						For(j,m-1) cout<<a[i][j]<<' ';\
						cout<<a[i][m]<<endl; \
						} 
#pragma comment(linker, "/STACK:102400000,102400000")
#define ALL(x) (x).begin(),(x).end()
#define gmax(a,b) a=max(a,b);
#define gmin(a,b) a=min(a,b);
typedef long long ll;
typedef long double ld;
typedef unsigned long long ull;
ll mul(ll a,ll b){return (a*b)%F;}
ll add(ll a,ll b){return (a+b)%F;}
ll sub(ll a,ll b){return ((a-b)%F+F)%F;}
void upd(ll &a,ll b){a=(a%F+b%F)%F;}
inline int read()
{
	int x=0,f=1; char ch=getchar();
	while(!isdigit(ch)) {if (ch=='-') f=-1; ch=getchar();}
	while(isdigit(ch)) { x=x*10+ch-'0'; ch=getchar();}
	return x*f;
} 
#define MAXN (100000+10)
ll a[MAXN];

int main()
{
	freopen("here_comes_santa_claus_input.txt","r",stdin);
	freopen("A.out","w",stdout);
	int T=read();
	For(kcase,T) {
		printf("Case #%d: ",kcase);
		int n=read();
		For(i,n) a[i]=read();
		sort(a+1,a+1+n);
		if(n==5) {
			ll p1=(a[2]+a[1]);
			ll p2=(a[5]+a[3]);
			ll p=p2-p1;
			ll p3=(a[3]+a[1]);
			ll p4=(a[5]+a[4]);
			ll _p=p4-p3;
			
			p=max(p,_p);
			if(p%2) cout<<p/2<<".5"<<endl;
			else cout<<p/2<<endl;
		}else{
			ll p1=(a[2]+a[1]);
			ll p2=(a[n]+a[n-1]);
			ll p=p2-p1;
			if(p%2) cout<<p/2<<".5"<<endl;
			else cout<<p/2<<endl;
			
		}
		
	}
	
	
	return 0;
}


Problem B1: Sum 41 (Chapter 1)

Given a positive integer P, please find an array of at most 100 positive integers which have a sum of 41 and a product of P, or output −1 if no such array exists.
If multiple such arrays exist, you may output any one of them.

#include<bits/stdc++.h> 
using namespace std;
#define For(i,n) for(int i=1;i<=n;i++)
#define Fork(i,k,n) for(int i=k;i<=n;i++)
#define ForkD(i,k,n) for(int i=n;i>=k;i--)
#define Rep(i,n) for(int i=0;i<n;i++)
#define ForD(i,n) for(int i=n;i;i--)
#define RepD(i,n) for(int i=n;i>=0;i--)
#define Forp(x) for(int p=pre[x];p;p=next[p])
#define Forpiter(x) for(int &p=iter[x];p;p=next[p])  
#define Lson (o<<1)
#define Rson ((o<<1)+1)
#define MEM(a) memset(a,0,sizeof(a));
#define MEMI(a) memset(a,0x3f,sizeof(a));
#define MEMi(a) memset(a,128,sizeof(a));
#define MEMx(a,b) memset(a,b,sizeof(a));
#define INF (0x3f3f3f3f)
#define F (1000000007)
#define pb push_back
#define mp make_pair
#define fi first
#define se second
#define vi vector<int> 
#define pi pair<int,int>
#define SI(a) ((a).size())
#define Pr(kcase,ans) printf("Case #%d: %lld\n",kcase,ans);
#define PRi(a,n) For(i,n-1) cout<<a[i]<<' '; cout<<a[n]<<endl;
#define PRi2D(a,n,m) For(i,n) { \
						For(j,m-1) cout<<a[i][j]<<' ';\
						cout<<a[i][m]<<endl; \
						} 
#pragma comment(linker, "/STACK:102400000,102400000")
#define ALL(x) (x).begin(),(x).end()
#define gmax(a,b) a=max(a,b);
#define gmin(a,b) a=min(a,b);
typedef long long ll;
typedef long double ld;
typedef unsigned long long ull;
ll mul(ll a,ll b){return (a*b)%F;}
ll add(ll a,ll b){return (a+b)%F;}
ll sub(ll a,ll b){return ((a-b)%F+F)%F;}
void upd(ll &a,ll b){a=(a%F+b%F)%F;}
inline int read()
{
	int x=0,f=1; char ch=getchar();
	while(!isdigit(ch)) {if (ch=='-') f=-1; ch=getchar();}
	while(isdigit(ch)) { x=x*10+ch-'0'; ch=getchar();}
	return x*f;
} 

#define MAXN (100000+10) 
typedef long long ll;
int p[MAXN],tot;
bool b[MAXN]={0};
void make_prime(int n)
{
	tot=0;
	Fork(i,2,n)
	{
		if (!b[i]) p[++tot]=i;
		For(j,tot)
		{
			if (i*p[j]>n) break;
			b[i*p[j]]=1;
			if (i%p[j]==0) break;  
		}
	}
}
int st[MAXN];
map<ll,vector<int> > h;
void dfs(int x,int l,int s,ll p) {
//	cout<<x<<" "<<l<<' '<<s<<' '<<p<<endl;
	if(!s) {
//		For(i,l-1) cout<<st[i]<<" ";
//		cout<<":"<<p<<endl;
		if(!h.count(p)|| SI(h[p])>l-1) {
			vi v;
			For(i,l-1) v.pb(st[i]);
			h[p]=v;
		}
		return ;
	}
	
	if(x>s || p>1e9) return;
	
	Fork(k,x,s) {
		st[l]=k;
		dfs(k,l+1,s-k,p*k);
	}
}
int main()
{
	freopen("sum_41_chapter_2_input.txt","r",stdin);
	freopen("sum_41_chapter_2_output.txt","w",stdout);
	dfs(1,1,41,1);
	
	make_prime(1e4);
	int T=read();
	For(kcase,T) {
		printf("Case #%d:",kcase);
		ll n=read();
		if(h.count(n)) {
			int sz=h[n].size();cout<<' '<<sz;
			Rep(i,sz) cout<<' '<<h[n][i]; 
			cout<<endl;
		}else {
			puts(" -1");
		}
	}
	
	
	return 0;
}


Problem C1: Back in Black (Chapter 1)

#include<bits/stdc++.h> 
using namespace std;
#define For(i,n) for(int i=1;i<=n;i++)
#define Fork(i,k,n) for(int i=k;i<=n;i++)
#define ForkD(i,k,n) for(int i=n;i>=k;i--)
#define Rep(i,n) for(int i=0;i<n;i++)
#define ForD(i,n) for(int i=n;i;i--)
#define RepD(i,n) for(int i=n;i>=0;i--)
#define Forp(x) for(int p=pre[x];p;p=next[p])
#define Forpiter(x) for(int &p=iter[x];p;p=next[p])  
#define Lson (o<<1)
#define Rson ((o<<1)+1)
#define MEM(a) memset(a,0,sizeof(a));
#define MEMI(a) memset(a,0x3f,sizeof(a));
#define MEMi(a) memset(a,128,sizeof(a));
#define MEMx(a,b) memset(a,b,sizeof(a));
#define INF (0x3f3f3f3f)
#define F (1000000007)
#define pb push_back
#define mp make_pair
#define fi first
#define se second
#define vi vector<int> 
#define pi pair<int,int>
#define SI(a) ((a).size())
#define Pr(kcase,ans) printf("Case #%d: %lld\n",kcase,ans);
#define PRi(a,n) For(i,n-1) cout<<a[i]<<' '; cout<<a[n]<<endl;
#define PRi2D(a,n,m) For(i,n) { \
						For(j,m-1) cout<<a[i][j]<<' ';\
						cout<<a[i][m]<<endl; \
						} 
#pragma comment(linker, "/STACK:102400000,102400000")
#define ALL(x) (x).begin(),(x).end()
#define gmax(a,b) a=max(a,b);
#define gmin(a,b) a=min(a,b);
typedef long long ll;
typedef long double ld;
typedef unsigned long long ull;
ll mul(ll a,ll b){return (a*b)%F;}
ll add(ll a,ll b){return (a+b)%F;}
ll sub(ll a,ll b){return ((a-b)%F+F)%F;}
void upd(ll &a,ll b){a=(a%F+b%F)%F;}
inline int read()
{
	int x=0,f=1; char ch=getchar();
	while(!isdigit(ch)) {if (ch=='-') f=-1; ch=getchar();}
	while(isdigit(ch)) { x=x*10+ch-'0'; ch=getchar();}
	return x*f;
} 
string s;
bool b[4000000+10];
bool op[4000000+10];
int main()
{
	freopen("back_in_black_chapter_2_input.txt","r",stdin);
	freopen("back_in_black_chapter_2_output.txt","w",stdout);
	int T=read();
	For(kcase,T) {
		printf("Case #%d: ",kcase);
		int n=read();
		ll ans=0;
		cin>>s;
		For(i,n) b[i]=s[i-1]=='1';
		For(i,n) if(b[i]) {
			op[i]=1;++ans;
			for(int j=i;j<=n;j+=i) b[j]^=1; 
		}else op[i]=0;
		int q=read();
		ll ans2=0;
		For(i,q) {
			int p=read();
			if(op[p]) --ans;else ++ans;
			op[p]^=1;
			ans2+=ans;
		}
		cout<<ans2<<endl;
	}
	
	
	return 0;
}


Problem D: Today is Gonna be a Great Day

给一个长度为n的数列,维护2个操作,批量 a i = a i ∗ ( 1 e 9 + 6 )   m o d   ( 1 e 9 + 7 ) ai=ai*(1e9+6)\bmod (1e9+7) ai=ai(1e9+6)mod(1e9+7),求全局最大值的位置。

同余系下,操作等价于乘-1,乘2次会变回原来的值。答案在2n个数中。
用2个线段树分别维护乘1次和不乘时哪些数在数列中并维护最大值位置。

#include<bits/stdc++.h> 
using namespace std;
#define For(i,n) for(int i=1;i<=n;i++)
#define Fork(i,k,n) for(int i=k;i<=n;i++)
#define ForkD(i,k,n) for(int i=n;i>=k;i--)
#define Rep(i,n) for(int i=0;i<n;i++)
#define ForD(i,n) for(int i=n;i;i--)
#define RepD(i,n) for(int i=n;i>=0;i--)
#define Forp(x) for(int p=pre[x];p;p=next[p])
#define Forpiter(x) for(int &p=iter[x];p;p=next[p])  
#define Lson (o<<1)
#define Rson ((o<<1)+1)
#define MEM(a) memset(a,0,sizeof(a));
#define MEMI(a) memset(a,0x3f,sizeof(a));
#define MEMi(a) memset(a,128,sizeof(a));
#define MEMx(a,b) memset(a,b,sizeof(a));
#define INF (0x3f3f3f3f)
#define F (1000000007)
#define pb push_back
#define mp make_pair
#define fi first
#define se second
#define vi vector<int> 
#define pi pair<int,int>
#define SI(a) ((a).size())
#define Pr(kcase,ans) printf("Case #%d: %lld\n",kcase,ans);
#define PRi(a,n) For(i,n-1) cout<<a[i]<<' '; cout<<a[n]<<endl;
#define PRi2D(a,n,m) For(i,n) { \
						For(j,m-1) cout<<a[i][j]<<' ';\
						cout<<a[i][m]<<endl; \
						} 
#pragma comment(linker, "/STACK:102400000,102400000")
#define ALL(x) (x).begin(),(x).end()
#define gmax(a,b) a=max(a,b);
#define gmin(a,b) a=min(a,b);
typedef long long ll;
typedef long double ld;
typedef unsigned long long ull;
ll mul(ll a,ll b){return (a*b)%F;}
ll add(ll a,ll b){return (a+b)%F;}
ll sub(ll a,ll b){return ((a-b)%F+F)%F;}
void upd(ll &a,ll b){a=(a%F+b%F)%F;}
inline int read()
{
	int x=0,f=1; char ch=getchar();
	while(!isdigit(ch)) {if (ch=='-') f=-1; ch=getchar();}
	while(isdigit(ch)) { x=x*10+ch-'0'; ch=getchar();}
	return x*f;
} 
#define MAXN (1000004+10)
class seg{
	public:
ll mulv[MAXN<<2];
pair<ll,int> maxv[MAXN<<2],minv[MAXN<<2];
void pushUp(int o) {
	maxv[o]=max(maxv[Lson],maxv[Rson]);
	minv[o]=min(minv[Lson],minv[Rson]);
}
void pushDown(int o) {
	if (mulv[o]==-1) {
		mulv[Lson]*=-1;mulv[Rson]*=-1;

		maxv[Lson].fi*=-1;minv[Lson].fi*=-1;
		if(maxv[Lson].fi!=minv[Lson].fi) {
			swap(minv[Lson],maxv[Lson]);
		}
		
		maxv[Rson].fi*=-1;minv[Rson].fi*=-1;
		if(maxv[Rson].fi!=minv[Rson].fi) {
			swap(minv[Rson],maxv[Rson]);
		}
	
		mulv[o]=1;
	}
} 

ll a[MAXN];
void build(int l,int r,int o) {
	mulv[o]=1;
	if (l==r) {
		maxv[o]=minv[o]=mp(a[l],-l);
		return;
	}
	int m=(l+r)>>1;
	build(l,m,Lson);
	build(m+1,r,Rson);
	pushUp(o);
}
void updmul(int l,int r,int o,int L,int R) {
	if (L<=l&&r<=R) {
		mulv[o]*=-1;
		
		maxv[o].fi*=-1;minv[o].fi*=-1;
		if(maxv[o].fi!=minv[o].fi) {
			swap(minv[o],maxv[o]);
		}
		
		return;
	}
	pushDown(o);
	int m=(l+r)>>1;
	if (L<=m) updmul(l,m,Lson,L,R);
	if (m<R) updmul(m+1,r,Rson,L,R);
	pushUp(o);
}

pair<ll,int> query(int l,int r,int o,int L,int R) {
	if (L<=l && r<=R) {
		return maxv[o];
	}
	pushDown(o);
	int m=(l+r)>>1;
	pair<ll,int> ret=mp(-100,-1);
	if (L<=m) gmax(ret,query(l,m,Lson,L,R))
	if (m<R) gmax(ret,query(m+1,r,Rson,L,R))
	return ret;	
}
}A,B;

int main()
{
	freopen("today_is_gonna_be_a_great_day_input.txt","r",stdin);
	freopen("D.out","w",stdout);
	int T=read();
	For(kcase,T) {
		printf("Case #%d: ",kcase);

		int n=read();
		
		For(i,n) A.a[i]=read();
		For(i,n) B.a[i]=-A.a[i]*(1000000006ll)%(1000000007ll);
		A.build(1,n,1);
		B.build(1,n,1);
		
		int m=read();
		ll ans=0;
		For(i,m) {
			int l=read(),r=read();
			A.updmul(1,n,1,l,r);
			B.updmul(1,n,1,l,r);
			
			auto pa2=A.query(1,n,1,1,n);
			auto pa3=B.query(1,n,1,1,n);
			auto pa=max(pa2,pa3);

			ans+=pa.se;
		}
		cout<<-ans<<endl;
		
	}
		
	return 0;
}


Problem E: Bohemian Rap-sody

TBD
给n个字符串,Q 个询问。
每个询问 a i , b i , K a_i,b_i,K ai,bi,K
每次选取一个区间中的字符串,求这些字符串


http://www.niftyadmin.cn/n/5105003.html

相关文章

YOLOv7改进:全网原创首发 | 多尺度空洞注意力(MSDA) | 中科院一区顶刊 DilateFormer 2023.9

💡💡💡本文全网首发独家改进:多尺度空洞注意力(MSDA)采用多头的设计,在不同的头部使用不同的空洞率执行滑动窗口膨胀注意力(SWDA),全网独家首发,创新力度十足,适合科研 1)作为注意力MSDA使用; 推荐指数:五星 多尺度空洞注意力(MSDA) | 亲测在多个数据…

【C++中cin、cin.get()、cin.getline()、getline() 的区别】

文章目录 引入cin基本用法输入多个变量换行符存放在缓冲区中 cin.get()基本用法重载函数换行符残留在缓冲区中 cin.getline()基本使用重载函数换行符不会残留在缓冲区中 string 流中的 getline()总结用法总结几个输入实例输入格式输入格式输入格式输入格式 输出格式 写在最后 引…

基于FPGA的SPI读写M25P16 Flash芯片

文章目录 一、SPI协议简介1.1 SPI引脚1.2 时钟极性和时钟相位1.3 主从模式 二、Flash&#xff08;M25P16&#xff09;2.1 Flash简介2.2 M25P16芯片分析2.3 项目所用指令时序2.3.1 WREN&#xff08;06h&#xff09;2.3.2 RDID&#xff08;9Fh&#xff09;2.3.3 READ&#xff08;…

Django小白开发指南

文章目录 HTTP协议socket实现一个web服务器WSGI实现一个web服务器WSGI实现支持多URL的web服务器WSGI实现图片显示的web服务器MVC && MTV1.MVC2.MTV3.总结 一、创建Django项目1.创建项目2.创建app3.第一次django 请求 二、模板1.配置settings.py2.模板语法3.继承模板 三…

QT的QStringList的使用

初始 化 默认构造函数创建一个空列表。可以使用初始值设定项列表构造函数创建包含元素的列表&#xff1a; QStringList fonts { "Arial", "Helvetica", "Times" }; 添加字符串 可以使用insert 、append&#xff08;&#xff09; 和 operator…

Redis之UV统计

HyperLogLog 首先我们搞懂两个概念&#xff1a; UV&#xff1a;全称Unique Visitor&#xff0c;也叫独立访客量&#xff0c;是指通过互联网访问、浏览这个网页的自然人。1天内同一个用户多次访问该网站&#xff0c;只记录1次。PV&#xff1a;全称Page View&#xff0c;也叫页…

where子句如何优化?

在数据库查询中&#xff0c;WHERE 子句对查询性能有很大的影响。以下是一些优化 WHERE 子句的方法&#xff1a; 使用索引&#xff1a;确保表上的相关列上有适当的索引。索引可以大大减少查询中需要扫描的数据量&#xff0c;提高查询效率。选择正确的数据类型&#xff1a;选择适…

数据结构和算法(13):优先级队列

概述 按照事先约定的优先级&#xff0c;可以始终高效查找并访问优先级最高数据项的数据结构&#xff0c;也统称作优先级队列 优先级队列将操作对象限定于当前的全局极值者。 根据数据对象之间相对优先级对其进行访问的方式&#xff0c;与此前的访问方式有着本质区别&#xf…