首页 > 其他分享 >Meta Hacker Cup 2023 Round 1 题解

Meta Hacker Cup 2023 Round 1 题解

时间:2023-10-25 11:07:59浏览次数:30  
标签:Hacker Cup int 题解 next -- kcase ans define


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个操作,批量Meta Hacker Cup 2023 Round 1 题解_图论,求全局最大值的位置。

同余系下,操作等价于乘-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 个询问。
每个询问Meta Hacker Cup 2023 Round 1 题解_#define_02
每次选取一个区间中的字符串,求这些字符串


标签:Hacker,Cup,int,题解,next,--,kcase,ans,define
From: https://blog.51cto.com/u_15724837/8015459

相关文章

  • pytest运行警告问题解决:DeprecationWarning: pkg_resources is deprecated as an API
    前言最近在运行pytest的时候,经常出现这个警告DeprecationWarning:pkg_resourcesisdeprecatedasanAPISeehttps://setuptools.pypa.io/en/latest/pkg_resources.htmlfrompkg_resourcesimportiter_entry_points从警告上看是方法被弃用,肯定是因为新版弃用了旧版的语法。遇......
  • szfpga Lattice高速下载器HW-USBN-2B 常见问题解答
      .产品特点     1).支持windows7,Windows10操作系统,两个操作系统非常稳定不断线。  2).支持JTAG模式,速度快,最高30Mb/s,调试serdescore,不会像hw-usbn-2a出现错误。如这种错误Error:failedtosetcablepor(cable:USBport:EzUSB-0error:-1)  3). ......
  • CF1854E Games Bundles 题解
    乱搞题设个\(dp[i]\)表示和为\(i\)的子序列个数,那么转移是容易的,\(dp[j]+=dp[j-i]\),然后就判下\(dp[60]+dp[60-i]\)是否大于\(m\),发现这样子搞对于比较大的数可能达不到\(m\)的限制,因为这样子转移,默认的是一个数只选一次,但是我们可以重复选,这启发我们需要设定一个值......
  • 题解 CF903G【Yet Another Maxflow Problem】
    加边\(A_n\stackrel{0}{\to}A_{n+1}\),\(B_0\stackrel{0}{\to}B_1\)。称形如\(A_i\toA_{i+1}\)的边为左部边,形如\(B_j\toB_{j+1}\)的边为右部边,形如\(A_i\toB_j\)的边为中间边。根据最大流最小割定理,将最大流问题转化为最小割问题求解。显然,至少存在一组最小割,包含恰好......
  • CF1777D题解
    分析首先看到那个\(10^{100}\)再加上样例,我们就能意识到在不是特别多的操作次数后这颗树上的值就会全变成\(0\)。因为没有子节点在一次操作后显然就会变成\(0\),然后第一次叶节点就会变成\(0\),然后下一次子节点中只有叶节点的就会变成\(0\),以此类推,理论上最多操作\(n\)......
  • CF1878B题解
    CF1878BAleksaandStack题目翻译给定\(n\),试构造一个长度为\(n\)的严格上升正整数序列\(a_1,a_2,a_3,...,a_n\)使得\(\foralli\in[3,n],(a_{i-1}+a_{i-2})\nmid3a_i\)。单个测试点内包含多组测试数据。思路拿到题目,发现不好一个数一个数地构造,考虑......
  • VK Cup 2016 - Round 1 (CF639)
    A.BearandDisplayedFriends这是Div2的题,不写。B.BearandForgottenTree3这种东西怎么评蓝的?Description给定\(n,d,h\),构造一棵有\(n\)个点,直径为\(d\),高度为\(h\)的树。\(n\le10^5\)。Solution首先\(d>2h\)是无解的,\(d=h=1\)且\(n>2\)的时候也无解......
  • 华科新生赛题解
    因为学校里面写代码的条件不足,比如教学楼里面使用键盘就会被盯着看。感觉有点点自闭。早知道退学了。不知道现在退学是不是算晚。昨天好兄弟车昱辉说你是在学习又不是在打游戏,但是我还是很羞涩。Abfs,需要把已经搜到的点在枚举1到n的时候去掉,所以可以使用并查集。或者链表......
  • CF1777C题解
    分析看到题面里面的子序列觉得很恶心,如果是子段感觉就会比较好做。如果直接填上子序列中间的空隙就可能会取一些比必须要取的数更大或者更小的数,影响我们的答案。那么就可以直接排序,使得子序列中间的空隙的数必然\(\geq\)左端且\(\leq\)右端,不会影响我们的答案(因为极差只......
  • [题解]CF1223F Stack Exterminable Arrays
    CCF出的原题观摩一下。思路首先可以用一个Trie来维护。在这里对本文中的一些变量做一下说明。\(p\)表示当前维护的Trie中,指向的元素编号。\(t_i\)表示在Trie中编号为\(i\)的元素在原序列中的值。\(f_i\)表示在Trie中编号为\(i\)的元素在Trie中的父......