Educational Codeforces Round 131 (Rated for Div. 2)参考代码

本文分享了 EducationalCodeforcesRound131 竞赛中四个不同难度级别的解题代码片段,包括整数输入处理、数组操作、布尔数组遍历和动态规划解决方案。通过实例展示了如何运用 C++ 编程技巧解决数学问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Educational Codeforces Round 131 (Rated for Div. 2)
A:

#include<cstdio>
#include<cstring>
#include<stdlib.h>
#include<algorithm>
#include<iostream>
#include<vector>
#include<set>
#include<string>
#include<map>
#include<queue>
#include<stack>
#include<math.h>
#define ll long long
using namespace std;
const int INF=0x3f3f3f3f;

inline int read()
{
    int x=0,f=1;
    char c=getchar();
    while(c<'0'||c>'9'){if(c=='-')f=-1;c=getchar();}
    while(c>='0'&&c<='9'){x=x*10+c-'0',c=getchar();}
    return x*f;
}
int a[5];
void solve()
{
	for(int i=1;i<=4;i++)a[i]=read();
	if(a[1]==0&&a[2]==0&a[3]==0&a[4]==0)printf("0\n");
	else if(a[1]==1&a[2]==1&a[3]==1&a[4]==1)printf("2\n");
	else printf("1\n");
}
int main()
{
	int T=read();
	while(T--){solve();}
	return 0;
}

B:

#include<cstdio>
#include<cstring>
#include<stdlib.h>
#include<algorithm>
#include<iostream>
#include<vector>
#include<set>
#include<string>
#include<map>
#include<queue>
#include<stack>
#include<math.h>
#define ll long long
using namespace std;
const int INF=0x3f3f3f3f;

inline int read()
{
    int x=0,f=1;
    char c=getchar();
    while(c<'0'||c>'9'){if(c=='-')f=-1;c=getchar();}
    while(c>='0'&&c<='9'){x=x*10+c-'0',c=getchar();}
    return x*f;
}
bool v[200010];
void solve()
{
	int n=read();
	printf("2\n");
	memset(v,0,sizeof(v));
	for(int i=1;i<=n;i++)
	{
		if(v[i])continue;
		int t=i;
		while(t<=n)
		{
			printf("%d ",t);
			v[t]=1;
			t*=2;
		}
	}
	printf("\n");
}
int main()
{
	int T=read();
	while(T--){solve();}
	return 0;
}

C:

#include<cstdio>
#include<cstring>
#include<stdlib.h>
#include<algorithm>
#include<iostream>
#include<vector>
#include<set>
#include<string>
#include<map>
#include<queue>
#include<stack>
#include<math.h>
#define ll long long
using namespace std;
const int INF=0x3f3f3f3f;

inline int read()
{
    int x=0,f=1;
    char c=getchar();
    while(c<'0'||c>'9'){if(c=='-')f=-1;c=getchar();}
    while(c>='0'&&c<='9'){x=x*10+c-'0',c=getchar();}
    return x*f;
}
const int N=200010;
ll a[N],b[N];
int n,m;
bool check(ll mid)
{
	ll ans=0;
	for(int i=1;i<=n;i++)
	{
		if(mid>b[i])
		{
			ans+=b[i];
			ans+=(mid-b[i])/2;
		}
		else ans+=mid;
	}
	if(ans>=m)return true;
	return false;
}
void solve()
{
	n=read(),m=read();
	memset(b,0,sizeof(b));

	for(int i=1;i<=m;i++)a[i]=read(),b[a[i]]++;
	
	ll l=1,r=2*m+1;
	while(l<r)
	{
		ll mid=(l+r)/2;
		if(check(mid))r=mid;
		else l=mid+1;
	}
	printf("%lld\n",l);
}

int main()
{
	int T=read();
	while(T--){solve();}
	return 0;
}

D:

#include<cstdio>
#include<cstring>
#include<stdlib.h>
#include<algorithm>
#include<iostream>
#include<vector>
#include<set>
#include<string>
#include<map>
#include<queue>
#include<stack>
#include<math.h>
#define ll long long
using namespace std;
const int INF=0x3f3f3f3f;

inline int read()
{
    int x=0,f=1;
    char c=getchar();
    while(c<'0'||c>'9'){if(c=='-')f=-1;c=getchar();}
    while(c>='0'&&c<='9'){x=x*10+c-'0',c=getchar();}
    return x*f;
}
const int N=500010;
int q[N];
struct QwQ{
	int l,r,id;
}a[N];
bool cmp(QwQ a,QwQ b)
{
	if(a.r==b.r)return a.l<b.l;
	return a.r<b.r;
}
int fa[N];
int find(int x)
{
	if(fa[x]==x)return x;
	return fa[x]=find(fa[x]); 
}
int ans[N];
void solve()
{
	int n=read();
	for(int i=1;i<=n;i++)q[i]=read(),fa[i]=i;
	for(int i=1;i<=n;i++)
	{
		if(q[i]==0)a[i].l=i+1,a[i].r=n,a[i].id=i;
		else a[i].l=i/(q[i]+1)+1,a[i].r=i/q[i],a[i].id=i;
	}
	//for(int i=1;i<=n;i++)cout<<a[i].l<<" "<<a[i].r<<endl;
	sort(a+1,a+1+n,cmp);
	
	for(int i=1;i<=n;i++)
	{
		int t=find(a[i].l);
		ans[a[i].id]=t;
		fa[t]=t+1;
	}
	for(int i=1;i<=n;i++)printf("%d ",ans[i]);
	printf("\n");
}

int main()
{
	int T=read();
	while(T--){solve();}
	return 0;
}

E:不会
F:

#include<cstdio>
int n,a,q,d,l[800011],r[800011];
bool p[400001];
long long lz[800011][2],sum[800011][2],ct[800011],ans,ss,s,ls,rs,ll,rr;
int getmax(int aa,int bb)
{
	if(aa>bb)return(aa);
	else return(bb);
}
int getmin(int aa,int bb)
{
	if(aa>bb)return(bb);
	else return(aa);
}
void built(int num,int x,int y)
{
	l[num]=x;
	r[num]=y;
	for(int i=0;i<=1;i++)lz[num][i]=0;
	for(int i=0;i<=1;i++)sum[num][i]=0;
	ct[num]=0;
	if(x==y)return;
	int mid=(x+y)/2;
	built(num*2,x,mid);
	built(num*2+1,mid+1,y);
}
void update(int num,int opt,long long zz)
{
	lz[num][opt]=lz[num][opt]+zz;
	sum[num][opt]=sum[num][opt]+zz*ct[num];
}
void gai(int num,int x,int y,int opt,long long zz)
{
	if(y<=0)return;
	if(x>n)return;
	if((l[num]==x)&&(r[num]==y))
	{
		update(num,opt,zz);
		return;
	}
	int mid=(l[num]+r[num])/2;
	if(lz[num][opt]!=0)
	{
		update(num*2,opt,lz[num][opt]);
		update(num*2+1,opt,lz[num][opt]);
		lz[num][opt]=0;
	}
	if(y<=mid)gai(num*2,x,y,opt,zz);
	else
	{
		if(x>mid)gai(num*2+1,x,y,opt,zz);
		else
		{
			gai(num*2,x,mid,opt,zz);
			gai(num*2+1,mid+1,y,opt,zz);
		}
	}
	sum[num][opt]=sum[num*2][opt]+sum[num*2+1][opt];
}
long long ask1(int num,int x,int y)
{
	if(y<=0)return 0;
	if(x>n)return 0;
	if((l[num]==x)&&(r[num]==y))return(ct[num]);
	int mid=(l[num]+r[num])/2;
	if(y<=mid)return(ask1(num*2,x,y));
	else
	{
		if(x>mid)return(ask1(num*2+1,x,y));
		else return(ask1(num*2,x,mid)+ask1(num*2+1,mid+1,y));
	}
}
long long ask2(int num,int x,int y,int opt)
{
	if(y<=0)return 0;
	if(x>n)return 0;
	if((l[num]==x)&&(r[num]==y))return(sum[num][opt]);
	int mid=(l[num]+r[num])/2;
	if(lz[num][opt]!=0)
	{
		update(num*2,opt,lz[num][opt]);
		update(num*2+1,opt,lz[num][opt]);
		lz[num][opt]=0;
	}
	if(y<=mid)return(ask2(num*2,x,y,opt));
	else
	{
		if(x>mid)return(ask2(num*2+1,x,y,opt));
		else return(ask2(num*2,x,mid,opt)+ask2(num*2+1,mid+1,y,opt));
	}
}
void rev(int num,int x)
{
	if(l[num]==r[num])
	{
		ct[num]=1-ct[num];
		sum[num][0]=sum[num][1]=0;
		if(ct[num]>0)
		{
		sum[num][0]=ask1(1,l[num]+1,getmin(n,l[num]+d));
		sum[num][1]=ask1(1,getmax(1,l[num]-d),l[num]-1);
		}
		return;
	}
	for(int opt=0;opt<=1;opt++)if(lz[num][opt]!=0)
	{
		update(num*2,opt,lz[num][opt]);
		update(num*2+1,opt,lz[num][opt]);
		lz[num][opt]=0;
	}
	if(r[num*2]>=x)rev(num*2,x);
	else rev(num*2+1,x);
	ct[num]=ct[num*2]+ct[num*2+1]; 
	for(int i=0;i<=1;i++)sum[num][i]=sum[num*2][i]+sum[num*2+1][i];
}
int main()
{
	n=200000;
	for(int i=0;i<=200000;i++)p[i]=false;
	scanf("%d%d",&q,&d);
	built(1,1,200000);
	ans=0;
	for(int i=1;i<=q;i++)
	{
		scanf("%d",&a);
		if(p[a])
		{
			gai(1,getmax(a-d,1),a-1,0,-1);
			gai(1,a+1,getmin(a+d,n),1,-1);
			ls=ask2(1,getmax(a-d,1),a-1,0);
			rs=ask2(1,a+1,getmin(a+d,n),1);
			ll=ask1(1,getmax(a-d,1),a-1);
			rr=ask1(1,a+1,getmin(a+d,n));
			rev(1,a);
			ans=ans-((ls+rs+(ll*(ll-1)/2)+(rr*(rr-1)/2))/2);
			p[a]=false;
		}
		else
		{
			ls=ask2(1,getmax(a-d,1),a-1,0);
			rs=ask2(1,a+1,getmin(a+d,n),1);
			ll=ask1(1,getmax(a-d,1),a-1);
			rr=ask1(1,a+1,getmin(a+d,n));
			rev(1,a);
			ans=ans+((ls+rs+(ll*(ll-1)/2)+(rr*(rr-1)/2))/2);
			gai(1,getmax(a-d,1),a-1,0,1);
			gai(1,a+1,getmin(a+d,n),1,1);
			p[a]=true;
		}
		printf("%lld\n",ans);
	}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值