2024届码蹄杯国赛,

赛时过了5个题(1,2,4,5 ,11),写一下过了的题

1.按题意模拟,双指针

//#pragma GCC optimize(2)

#include <iostream>
#include <cstring>
#include <algorithm>
#include <vector>
#include <queue>
#include<stack>
#include<cmath>
#include <unordered_set>
#include <unordered_map>
#include<set>
#include <map>
#include<ctime>
#include<bitset>

using namespace std;

typedef long long LL;
typedef unsigned long long ULL;
typedef pair<int,int>PII;

#define fi first
#define se second
#define ls u<<1
#define rs u<<1|1
#define all(ss) ss.begin(),ss.end()
#define pb push_back


int const mod=1e9+7; 
int const B=507;
//int const mod=998244353; 
//int const base=131,mod=2e9+11;
int const N=2e5+7,M=2e6+7;
int const INF=0x3f3f3f3f;
LL const INFF=0x3f3f3f3f3f3f3f3f;

int n,m,q,k;
int x,y,z;
int a[N];
string s,t;
vector<int>g[N];


void solve(){
	getline(cin,s);
	getline(cin,t);
    n=s.size(); m=t.size();
    for(int i=0,j=0;i<n;i++){
		if(s[i]==t[j]){
			j++;
			if(j==m){
				cout<<"Lucky!";
				return;
			}
		}
	}
	cout<<"QAQ Unlucky!";
} 


void init(){
	
}

int main()
{
    //std::ios::sync_with_stdio(false);   cin.tie(0); cout.tie(0);
    //init();
    int T=1;
    //cin>>T;
    //scanf("%d",&T);
    
   	for(int i=1;i<=T;i++){
	   	solve();
	}
	
	return 0;
}

2.要保证字典序最小,用堆跑拓扑排序,比赛中没看懂题目意思,做了巨长的时间

//#pragma GCC optimize(2)

#include <iostream>
#include <cstring>
#include <algorithm>
#include <vector>
#include <queue>
#include<stack>
#include<cmath>
#include <unordered_set>
#include <unordered_map>
#include<set>
#include <map>
#include<ctime>
#include<bitset>

using namespace std;

typedef long long LL;
typedef unsigned long long ULL;
typedef pair<int,int>PII;

#define fi first
#define se second
#define ls u<<1
#define rs u<<1|1
#define all(ss) ss.begin(),ss.end()
#define pb push_back


int const mod=1e9+7; 
int const B=507;
//int const mod=998244353; 
//int const base=131,mod=2e9+11;
int const N=2e5+7,M=2e6+7;
int const INF=0x3f3f3f3f;
LL const INFF=0x3f3f3f3f3f3f3f3f;

int n,m,q,k;
int x,y,z;
vector<int>g[N];
LL w[N];
int inD[N];


struct Node{
	int u;
	LL w;
	bool operator<(const Node &o)const{
		return u<o.u;
	}
};

void solve(){
    scanf("%d%d",&n,&m);
    for(int i=1;i<=n;i++)	scanf("%lld",&w[i]);
    for(int i=0;i<m;i++){
		scanf("%d%d",&x,&y);
		g[x].pb(y);
		inD[y]++;
	}
	
	
	priority_queue<int,vector<int>,greater<int>>q;
	for(int i=1;i<=n;i++){
		if(inD[i]==0){
			q.push(i);
		}
	}
	
	vector<int>res;
	vector<Node>ans;
	while(q.size()){
		int x=q.top();	q.pop();
		res.pb(x);
		
		if(g[x].empty()){
			ans.pb({x,w[x]});
		}
		for(int y:g[x]){
			w[y]+=w[x];
			if(--inD[y]==0){
				q.push(y);
			}
		}
	}
	
	for(int i=0;i<n;i++)	printf("%d ",res[i]);
	printf("\n");
	sort(all(ans));
	for(auto &p:ans)	printf("%lld ",p.w);
	printf("\n");

	
} 


void init(){
	
}

int main()
{
    //std::ios::sync_with_stdio(false);   cin.tie(0); cout.tie(0);
    //init();
    int T=1;
    //cin>>T;
    //scanf("%d",&T);
    
   	for(int i=1;i<=T;i++){
	   	solve();
	}
	
	return 0;
}

4.先用并查集,将必须分在一组的合并在一起,在跑背包,背包会tle,用bitset(压位过了),赛时交了10多发才过

//#pragma GCC optimize(2)

#include <iostream>
#include <cstring>
#include <algorithm>
#include <vector>
#include <queue>
#include<stack>
#include<cmath>
#include <unordered_set>
#include <unordered_map>
#include<set>
#include <map>
#include<ctime>
#include<bitset>

using namespace std;

typedef long long LL;
typedef unsigned long long ULL;
typedef pair<int,int>PII;

#define fi first
#define se second
#define ls u<<1
#define rs u<<1|1
#define all(ss) ss.begin(),ss.end()
#define pb push_back


int const mod=1e9+7; 
int const B=507;
//int const mod=998244353; 
//int const base=131,mod=2e9+11;
int const N=2.5e5+7,M=2e6+7;
int const INF=0x3f3f3f3f;
LL const INFF=0x3f3f3f3f3f3f3f3f;

int n,m,q,k;
int x,y,z;
int a[N],cnt[N];
int fa[N];

int find(int x){
	return fa[x]==x?fa[x]:fa[x]=find(fa[x]);
}

void solve(){
    scanf("%d%d",&n,&m);
    for(int i=1;i<=n;i++){
		cnt[i]=1;
		fa[i]=i;
	}
	
	for(int i=0;i<m;i++){
		scanf("%d%d",&x,&y);
		int px=find(x),py=find(y);
		if(px==py)	continue;
		fa[py]=px;
		cnt[px]+=cnt[py];
	}
	vector<int>v;
	for(int i=1;i<=n;i++)
		if(i==find(i))	v.pb(cnt[i]);
	
	sort(all(v));
	int m=n/2;
	bitset<N/2>f;
	f[0]=1;
	for(int i=v.size()-1;i>=0;i--){
		int x=v[i];
		f|=f<<x;
		if(f[m]){
			cout<<1LL*m*(n-m);
			return;
		}
	}
	for(int j=m;j>=0;j--){
		if(f[j]){
			cout<<1LL*j*(n-j);
			return;
		}
	}
} 


void init(){
	
}

int main()
{
    //std::ios::sync_with_stdio(false);   cin.tie(0); cout.tie(0);
    //init();
    int T=1;
    //cin>>T;
    //scanf("%d",&T);
    
   	for(int i=1;i<=T;i++){
	   	solve();
	}
	
	return 0;
}

5.一个数的因数之和=(1+p1+p1*p1+p1*p1*p1...)+(1+p2+p2*p2...)

首先我们可以发现那个a数组很小,最大为100,那么对于每一个质数,建权值线段树,也就是主席树,转化为单点修改区间查询,利用上面的公式预处理质数,质数的(1+p1+p1*p1+p1*p1*p1...),在利用主席树维护每一个质数区间内出现的次数

//#pragma GCC optimize(2)

#include <iostream>
#include <cstring>
#include <algorithm>
#include <vector>
#include <queue>
#include<stack>
#include<cmath>
#include <unordered_set>
#include <unordered_map>
#include<set>
#include <map>
#include<ctime>
#include<bitset>

using namespace std;

typedef long long LL;
typedef unsigned long long ULL;
typedef pair<int,int>PII;

#define fi first
#define se second
#define all(ss) ss.begin(),ss.end()
#define pb push_back


int const mod=1e9+7; 
int const B=507;
//int const mod=998244353; 
//int const base=131,mod=2e9+11;
int const N=1e5+7,M=N*20;
int const INF=0x3f3f3f3f;
LL const INFF=0x3f3f3f3f3f3f3f3f;

int n,m,q,k;
int x,y,z;
int a[N];
int ls[M],rs[M],sum[M];
int root[101],tot;
bool vis[N];
vector<int>p;
int f[30][N*10];

void modify(int &u,int l,int r,int p,int v){
	if(!u) u=++tot;	
	if(l==r){sum[u]+=v; return;}
	int mid=(l+r)>>1;
	if(mid>=p)	modify(ls[u],l,mid,p,v);
	else modify(rs[u],mid+1,r,p,v);
	sum[u]=sum[ls[u]]+sum[rs[u]];
}

int query(int u,int l,int r,int x,int y){
	if(x<=l&&r<=y)	return sum[u];
	int mid=(l+r)>>1;
	int res=0;
	if(mid>=x)	res=query(ls[u],l,mid,x,y);
	if(y>mid)	res+=query(rs[u],mid+1,r,x,y);
	return res;
}

void solve(){
    scanf("%d",&n);
    for(int i=1;i<=n;i++){
		scanf("%d",a+i);
		int k=a[i];
		for(int x:p){
			if(k%x==0){
				int v=0;
				while(k%x==0)	k/=x,v++;
				modify(root[x],1,n,i,v);
			}
		}
		if(k>1)	modify(root[k],1,n,i,1);
	}
	
	for(int i=0;i<(int)p.size();i++){
		f[i][0]=1;
		LL t=1;
		for(int j=1;j<N*10;j++){
			t=(t*p[i]+1)%mod;
			f[i][j]=t;
		}
	}
	

	scanf("%d",&m);
	while(m--){
		int opt,l,r;
		scanf("%d%d%d",&opt,&l,&r);
		if(opt==1){
			LL ans=1;
			for(int i=0;i<(int)p.size();i++){
				int x=p[i];
				if(sum[root[x]]==0)	continue;
				LL t=query(root[x],1,n,l,r);
				ans=ans*f[i][t]%mod;
			}
			printf("%lld\n",ans);
		}
		else{
			int k=a[l];
			for(int x:p){
				if(k%x==0){
					int v=0;
					while(k%x==0)	k/=x,v++;
					modify(root[x],1,n,l,-v);
				}
			}
			if(k>1)	modify(root[k],1,n,l,-1);
			
			k=a[l]=r;
			for(int x:p){
				if(k%x==0){
					int v=0;
					while(k%x==0)	k/=x,v++;
					modify(root[x],1,n,l,v);
				}
			}
			if(k>1)	modify(root[k],1,n,l,1);
		}
	}
    
    
} 


void init(){
	for(int i=2;i<=100;i++){
		if(!vis[i])	p.pb(i);
		for(int j=0;j<(int)p.size()&&p[j]*i<=100;j++){
			vis[i*p[j]]=true;
			if(i%p[j]==0)	break;
		}
	}
}

int main()
{
    //std::ios::sync_with_stdio(false);   cin.tie(0); cout.tie(0);
    init();
    int T=1;
    //cin>>T;
    //scanf("%d",&T);
    
   	for(int i=1;i<=T;i++){
	   	solve();
	}
	
	return 0;
}

11.也是一个模拟题,不过也要稍微优先一下,不然会tle

//#pragma GCC optimize(2)

#include <iostream>
#include <cstring>
#include <algorithm>
#include <vector>
#include <queue>
#include<stack>
#include<cmath>
#include <unordered_set>
#include <unordered_map>
#include<set>
#include <map>
#include<ctime>
#include<bitset>

using namespace std;

typedef long long LL;
typedef unsigned long long ULL;
typedef pair<int,int>PII;

#define fi first
#define se second
#define ls u<<1
#define rs u<<1|1
#define all(ss) ss.begin(),ss.end()
#define pb push_back


int const mod=1e9+7; 
int const B=507;
//int const mod=998244353; 
//int const base=131,mod=2e9+11;
int const N=1e6+7,M=2e6+7;
int const INF=0x3f3f3f3f;
LL const INFF=0x3f3f3f3f3f3f3f3f;

int n,m,q,k;
PII a[N],b[N];


void solve(){
    scanf("%d%d",&n,&m);
	for(int i=0;i<n;i++)	scanf("%d%d",&a[i].fi,&a[i].se);
	for(int i=0;i<m;i++)	scanf("%d%d",&b[i].fi,&b[i].se);
    
    for(int i=0,j=0;;){
    	int w1=b[j].se,w2=a[i].se;
    	int mi=min((a[i].fi+w1-1)/w1,(b[j].fi+w2-1)/w2);
    	a[i].fi-=mi*w1;
    	b[j].fi-=mi*w2;
    	if(a[i].fi<=0)	i++;
    	if(b[j].fi<=0)	j++;
    	
//		if(a[i].fi-w1<=0){
//			i++;
//		}
//		else a[i].fi-=w1;
//		if(b[j].fi-w2<=0){
//			j++;
//		}
//		else b[j].fi-=w2;
		
		if(i==n&&m==j){
			cout<<"Fine";
			return;
		}
		else if(i==n){
			cout<<"QAQ";
			return;
		}
		else if(j==m){
			cout<<"Win";
			return;
		}
	}
} 


void init(){
	
}

int main()
{
    //std::ios::sync_with_stdio(false);   cin.tie(0); cout.tie(0);
    //init();
    int T=1;
    //cin>>T;
    //scanf("%d",&T);
    
   	for(int i=1;i<=T;i++){
	   	solve();
	}
	
	return 0;

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 2021高教杯国赛Python实现是指在2021年的高教杯国家大学生计算机设计大赛中,参赛选手使用Python编程语言完成比赛题目的要求。 Python作为一种高级编程语言,具有简洁易读、功能强大、可移植性好等特点,因此在高教杯比赛中广受欢迎。Python实现的主要优势是它具有丰富的库和模块,可以方便地调用各种功能,辅助实现题目的需求。比如,对于数据处理与分析题目,可以使用Python中的pandas、numpy等库;对于图像处理与计算机视觉题目,可以使用Python中的OpenCV库等。 在实现过程中,Python提供了丰富的语法特性和编程范式,如面向对象、函数式编程等,可以根据题目需求选择合适的方法进行实现。Python还具备良好的交互性和快速迭代的能力,可以方便地进行调试和优化,提高程序的性能和效率。 此外,Python拥有强大的社区支持,有大量的教程、指南和开源项目可供参考和学习。在高教杯比赛中,参赛选手可以借助这些资源,快速掌握Python的相关知识和技巧,提高编程水平。 总之,2021高教杯国赛Python实现是指使用Python编程语言完成比赛题目的要求。Python作为一种简洁易读、功能强大的编程语言,具有丰富的库和模块、灵活的语法特性和社区支持,可以满足参赛选手在比赛中的需求。 ### 回答2: 2021年高教杯国赛的Python实现主要涉及到对于不同主题的编程问题的解决。Python作为一门简洁、易学且功能强大的编程语言,已经成为了国际上广泛使用的语言之一。在国赛中,Python的实现主要包括以下几个方面: 首先,Python实现可以用于解决数学问题。Python提供了丰富的数学函数库和运算符,可以轻松进行各种数学计算和数学问题的求解。例如,可以使用Python实现解一元二次方程、计算圆的面积和周长等等。 其次,Python实现可以用于数据处理和分析。Python拥有强大的数据处理和分析库,如NumPy、Pandas和Matplotlib等,可以快速高效地处理大规模数据和进行数据可视化。通过Python实现,可以对数据进行清洗、筛选、排序、统计和可视化等操作。 此外,Python实现还可以用于编写Web应用程序和爬虫。Python的Django和Flask等Web框架可以帮助开发人员快速构建高效稳定的Web应用程序。同时,Python的强大的网络爬虫库,如BeautifulSoup和Scrapy,可以用于获取互联网上的数据。 最后,Python实现也可以用于人工智能和机器学习。Python拥有丰富的人工智能和机器学习库,如TensorFlow和PyTorch等,可以用于构建和训练神经网络模型,实现图像识别、自然语言处理和数据挖掘等任务。 总之,2021年高教杯国赛的Python实现涉及到了各个领域的问题,包括数学、数据处理、Web开发、爬虫和人工智能等。通过使用Python,参赛选手们可以更加高效地解决各种实际问题,并展示出Python作为一门优秀的编程语言的多样化特点和强大的功能。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值