为什么会编译超时?是否可以选择g++以外的编译器?
查看原帖
为什么会编译超时?是否可以选择g++以外的编译器?
194664
agctXY楼主2020/8/29 00:46

本地cl可以正常编译,g++超时但可以编译成功.
在洛谷,语言选择c++11,提交后显示编译失败,但不显示错误信息.如果选择O2优化,可能会出现

            g++: 编译器内部错误:超出 CPU 时限 signal terminated program cc1plus
请提交一份完整的错误报告,
如有可能请附上经预处理后的源文件。
参阅 <file:///usr/share/doc/gcc-8/README.Bugs> 以获取指示。

代码

#include <bits/stdc++.h>

using namespace std;

typedef long long ll;

//tree-like array or binary indexed tree
template<class T,int sz>
struct BinaryIndexedTree{
	T mem[sz+1]={T()};
	void build(T *s,int n)
	{
		--s;//s[0] is never accessed 
		for(int i=1;i<=n;++i){
			mem[i]+=s[i];
			int f=lowbit(i)+i;
			if(f<=sz)mem[f]+=mem[i];
		}
	}
	void update(T v,int n)
	{
		while(n<=sz){
			mem[n]=mem[n]+v;
			n+=lowbit(n);
		}
	}
	void clear(int n)
	{
		while(n<=sz){
			mem[n]=T();
			n+=lowbit(n);
		}
	}
	T query(int n)
	{
		T ret=T();
		while(n){
			ret=ret+mem[n];
			n-=lowbit(n);
		}
		return ret;
	}
private:
	inline long long lowbit(long long x){return x&(-x);}
};

struct mlat{
	ll ml;
	double mt;
	mlat(ll ml=0,double mt=0):ml(ml),mt(mt){}
	mlat operator++()
	{
		return mlat(ml+1,mt);
	}
};
mlat operator+(const mlat& a,const mlat& b)
{
	if(a.ml>b.ml)return a;
	if(b.ml>a.ml)return b;
	return mlat(a.ml,a.mt+b.mt);
}
struct item{
	int h,v,t;
};
typedef bool (*CMP)(int a,int b);
const int N=5e5+10;
inline bool gt(int a,int b){return a>b;}
inline bool lt(int a,int b){return a<b;}
BinaryIndexedTree<mlat,N> bit;
int n;
bool rev=false;
item a[N];
mlat dp[2][N];
pair<int,int> ps[N];
CMP cmp=gt;
void sparse()
{
	for(int i=0;i<n;++i)ps[i].first=a[i].v,ps[i].second=i;
	sort(ps,ps+n,greater<pair<int,int>>());
	a[ps[0].second].v=1;
	for(int i=1;i<n;++i){
		a[ps[i].second].v=a[ps[i-1].second].v;
		if(ps[i].first!=ps[i-1].first)++a[ps[i].second].v;
	}
}
//first t, second h, third insert v.
void solve(int l,int r)//exclusive
{
	if(r-l<=1){
		dp[rev][a[l].t]=dp[rev][a[l].t]+mlat(1,1);
		return;
	}
	int mid=(l+r)/2;
	solve(l,mid);
	sort(a+l,a+mid,[](item a,item b){ return cmp(a.h,b.h);});
	sort(a+mid,a+r,[](item a,item b){ return cmp(a.h,b.h);});
	int p=l,q=mid;
	while(p<mid||q<r){
		if(q>=r||(p<mid&&(a[p].h==a[q].h||cmp(a[p].h,a[q].h)))){
			bit.update(dp[rev][a[p].t],a[p].v);
			++p;
		}
		else{
			dp[rev][a[q].t]=dp[rev][a[q].t]+(++bit.query(a[q].v));//TODO: solve this problem using some trick
			++q;
		}
	}
	for(int i=l;i<r;++i)bit.clear(a[i].v);//just clear all between l and r,too lazy to judge.
	sort(a+mid,a+r,[](item a,item b){ return cmp(b.t,a.t);});//t ascending
	solve(mid,r);
}
int main()
{
	cout<<fixed<<setprecision(5);
	cin>>n;
	for(int i=0;i<n;++i)cin>>a[i].h>>a[i].v,a[i].t=i;
	sparse();
	solve(0,n);
	rev=true;
	cmp=lt;
	for(int i=0;i<n;++i)a[i].v=n+1-a[i].v;
	reverse(a,a+n);
	solve(0,n);
	{
		for(int i=0;i<n;++i){
			cerr<<'('<<dp[0][i].ml<<','<<dp[0][i].mt<<')';	
		}
		cerr<<endl;
		for(int i=0;i<n;++i){
			cerr<<'('<<dp[1][i].ml<<','<<dp[1][i].mt<<')';	
		}
		cerr<<endl;
	}
	mlat mlt;
	for(int i=0;i<n;++i)mlt=mlt+dp[0][i];	
	cout<<mlt.ml<<endl;
	for(int i=0;i<n;++i){
		if(dp[0][i].ml+dp[1][i].ml-1==mlt.ml){
			assert(dp[0][i].mt*dp[1][i].mt<=mlt.mt);
			cout<<1.*dp[0][i].mt*dp[1][i].mt/mlt.mt<<' ';
		}
		else{
			cout<<0.<<' ';
		}
	}
    return 0;
}

2020/8/29 00:46
加载中...