代码在洛谷上跑得慢怎么办?

文章讲述了在编程竞赛中遇到代码在某些在线评测系统上超时(TLE),而在其他地方正常运行的问题。作者通过一个具体的例子,展示了如何通过在定义模数常量时添加`const`关键字来优化代码,从而解决TLE问题。这个小技巧在洛谷平台上尤其有效,改变了代码的运行速度,使得原本超时的代码能够通过测试。
摘要由CSDN通过智能技术生成

前言

你有没有试过以下几种情况:

  • 代码在别的OJ上能过,在洛谷上就TLE了
  • 你的代码和别人的几乎相同,但他的AC了,你的却TLE了

遇到这些情况,你可能要花上一个多小时才能解决,甚至难以解决,将问题一直搁置。不过,下ma下面有一种方法,可以让你的代码快许多。如果你有上面的第二种情况,那用这个方法,大概率能过。


怎么办

比如这一题:P6097 【模板】子集卷积

TLE代码

#include<bits/stdc++.h>
using namespace std;
int n;
long long a[1<<21],b[1<<21],c[1<<21],ct[1<<21],ans[1<<21],ta[22][1<<21],tb[22][1<<21];
long long mod=1e9+9;
void fwt(long long *w,long long fl){
	for(int s=2;s<=(1<<n);s<<=1){
		int mid=s>>1;
		for(int v=0;v<(1<<n);v+=s){
			for(int i=0;i<mid;i++){
				w[v+mid+i]=(w[v+mid+i]+fl*w[v+i]+mod)%mod;
			}
		}
	}
}
int main()
{
	scanf("%d",&n);
	for(int i=1;i<(1<<n);i++){
		ct[i]=ct[i-(i&(-i))]+1;
	}
	for(int i=0;i<(1<<n);i++){
		scanf("%lld",&a[i]);
		ta[ct[i]][i]=a[i];
	}
	for(int i=0;i<(1<<n);i++){
		scanf("%lld",&b[i]);
		tb[ct[i]][i]=b[i];
	}
	for(int i=0;i<=n;i++){
		fwt(ta[i],1);fwt(tb[i],1);
	}
	for(int i=0;i<=n;i++){
		for(int j=0;j<=i;j++){
			for(int k=0;k<(1<<n);k++){
				c[k]=(c[k]+ta[j][k]*tb[i-j][k]%mod)%mod;
			}
		}
		fwt(c,-1);
		for(int j=0;j<(1<<n);j++){
			if(ct[j]==i) ans[j]=c[j];
			c[j]=0;
		}
	}
	for(int i=0;i<(1<<n);i++){
		printf("%lld ",ans[i]);
	}
	return 0;
}

这个方法是正解,代码也没有太大的问题,但就是TLE了。

在这里插入图片描述


但是,如果我在 m o d mod mod的变量定义前加上 c o n s t const const,也就是在第五行行首加上 c o n s t const const,就能AC了。

AC代码

#include<bits/stdc++.h>
using namespace std;
int n;
long long a[1<<21],b[1<<21],c[1<<21],ct[1<<21],ans[1<<21],ta[22][1<<21],tb[22][1<<21];
const long long mod=1e9+9;
void fwt(long long *w,long long fl){
	for(int s=2;s<=(1<<n);s<<=1){
		int mid=s>>1;
		for(int v=0;v<(1<<n);v+=s){
			for(int i=0;i<mid;i++){
				w[v+mid+i]=(w[v+mid+i]+fl*w[v+i]+mod)%mod;
			}
		}
	}
}
int main()
{
	scanf("%d",&n);
	for(int i=1;i<(1<<n);i++){
		ct[i]=ct[i-(i&(-i))]+1;
	}
	for(int i=0;i<(1<<n);i++){
		scanf("%lld",&a[i]);
		ta[ct[i]][i]=a[i];
	}
	for(int i=0;i<(1<<n);i++){
		scanf("%lld",&b[i]);
		tb[ct[i]][i]=b[i];
	}
	for(int i=0;i<=n;i++){
		fwt(ta[i],1);fwt(tb[i],1);
	}
	for(int i=0;i<=n;i++){
		for(int j=0;j<=i;j++){
			for(int k=0;k<(1<<n);k++){
				c[k]=(c[k]+ta[j][k]*tb[i-j][k]%mod)%mod;
			}
		}
		fwt(c,-1);
		for(int j=0;j<(1<<n);j++){
			if(ct[j]==i) ans[j]=c[j];
			c[j]=0;
		}
	}
	for(int i=0;i<(1<<n);i++){
		printf("%lld ",ans[i]);
	}
	return 0;
}

跑得快了许多。

在这里插入图片描述


后记

这个问题我之前就遇到过,但一直没有在意。直到今天我调这道题,调了半个多小时才发现这里的问题。我觉得如果不知道这一点,可能还要浪费更多的时间。

有时候不加 c o n s t const const就会TLE,加上就AC了。在洛谷上会这样,但在本地,不管加不加 c o n s t const const,跑的时间都差不多。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值