本地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;
}