关于编译时间
查看原帖
关于编译时间
312393
ADay楼主2021/7/8 21:06

我的两份整体二分代码一个过了,一个TLE#8,区别就在IO部分的长度不同,过了的只保留了要用的read,T的全都有。
所以是否是编译时间影响了评测速度?
AC:

#include<bits/stdc++.h>
#pragma gcc optimize("Ofast")
using namespace std;
namespace io{static char _sta[150];static streambuf *inbuf=cin.rdbuf();static streambuf *outbuf=cout.rdbuf();char buf[1<<20],*p1=buf,*p2=buf;inline char gc(){return (p1==p2&&(p2=(p1=buf)+inbuf->sgetn(buf,1<<20),p1==p2)?EOF:*p1++);}inline void pc(const char x){static streambuf *outbuf=cout.rdbuf();outbuf->sputc(x);}template<typename T>inline void read(T &x){x=0;register int _f=1;register char _ch=gc();for(;!isdigit(_ch);_ch=gc())if(_ch=='-')_f=-1;for(;isdigit(_ch);_ch=gc())x=x*10+_ch-'0';x*=_f;}}using namespace io;
const int N=1e5+5;
int n,k,tot,f[N],ans[N];
int head[N],to[N<<1],nxt[N<<1],cnt;
void add(int u,int v){to[++cnt]=v;nxt[cnt]=head[u];head[u]=cnt;}
void dfs(int u,int fa){
	int m1=0,m2=0;
	for(int i=head[u],v;i;i=nxt[i]){
		v=to[i];
		if(v==fa)continue;
		dfs(v,u);
		if(m1<f[v])m2=m1,m1=f[v];
		else if(m2<f[v])m2=f[v];
	}if(m1+m2+1>=k)f[u]=0,tot++;
	else f[u]=m1+1;
}
void solve(int l,int r,int L,int R){
	if(l>r||L>R)return;
	if(L==R){for(int i=l;i<=r;i++)ans[i]=L;return;}
	int mid=l+r>>1;
	k=mid;tot=0;dfs(1,0);ans[mid]=tot;
	solve(l,mid-1,tot,R);solve(mid+1,r,L,tot);
}
int main(){
	read(n);
	for(int i=1,u,v;i<n;i++){
		read(u);read(v);
		add(u,v);add(v,u);
	}solve(1,n,0,n);
	for(int i=1;i<=n;i++)
		printf("%d\n",ans[i]);
	return 0;
}

TLE:

#include<bits/stdc++.h>
#pragma gcc optimize("Ofast")
using namespace std;
namespace io{static char _sta[150];static streambuf *inbuf=cin.rdbuf();static streambuf *outbuf=cout.rdbuf();char buf[1<<20],*p1=buf,*p2=buf;inline char gc(){return (p1==p2&&(p2=(p1=buf)+inbuf->sgetn(buf,1<<20),p1==p2)?EOF:*p1++);}inline void pc(const char x){static streambuf *outbuf=cout.rdbuf();outbuf->sputc(x);}template<typename T>inline void read(T &x){x=0;register int _f=1;register char _ch=gc();for(;!isdigit(_ch);_ch=gc())if(_ch=='-')_f=-1;for(;isdigit(_ch);_ch=gc())x=x*10+_ch-'0';x*=_f;}template<typename T>inline void write(T _x1){static streambuf *outbuf=cout.rdbuf();if(_x1<0)pc('-'),_x1=-_x1;int _p=0;do{_sta[_p++]=_x1%10^48;_x1/=10;}while(_x1);while(_p--)outbuf->sputc(_sta[_p]);}inline void write(const char *s){static streambuf *outbuf=cout.rdbuf();do{outbuf->sputc(*s++);}while(*s);}template<typename T>inline void writeln(const T _x){write(_x);pc(10);}template<typename T>inline void writesp(const T _x){write(_x);pc(' ');}
template<typename T=int>inline T read(){register T s=0,f=1;register char ch=gc();for(;!isdigit(ch);ch=gc())if(ch=='-')f=-1;for(;isdigit(ch);ch=gc())s=s*10+ch-'0';return s*f;}inline void read(char *s){int p=0;char c=gc();while(!isalnum(c))c=gc();for(;isalnum(c);c=gc())s[p++]=c;}template<typename T,typename ...Args>inline void read(T& x,Args& ...args){read(x);read(args...);}template<typename T,typename ...Args>inline void write(T& x,Args& ...args){write(x);pc(' ');write(args...);}}using namespace io;
const int N=1e5+5;
int n,k,tot,f[N],ans[N];
int head[N],to[N<<1],nxt[N<<1],cnt;
void add(int u,int v){to[++cnt]=v;nxt[cnt]=head[u];head[u]=cnt;}
void dfs(int u,int fa){
	int m1=0,m2=0;
	for(int i=head[u],v;i;i=nxt[i]){
		v=to[i];
		if(v==fa)continue;
		dfs(v,u);
		if(m1<f[v])m2=m1,m1=f[v];
		else if(m2<f[v])m2=f[v];
	}if(m1+m2+1>=k)f[u]=0,tot++;
	else f[u]=m1+1;
}
void solve(int l,int r,int L,int R){
	if(l>r||L>R)return;
	if(L==R){for(int i=l;i<=r;i++)ans[i]=L;return;}
	int mid=l+r>>1;
	k=mid;tot=0;dfs(1,0);ans[mid]=tot;
	solve(l,mid-1,tot,R);solve(mid+1,r,L,tot);
}
int main(){
	read(n);
	for(int i=1,u,v;i<n;i++){
		read(u);read(v);
		add(u,v);add(v,u);
	}solve(1,n,0,n);
	for(int i=1;i<=n;i++)
		printf("%d\n",ans[i]);
	return 0;
}
2021/7/8 21:06
加载中...