这篇代码:
#pragma GCC optimize(3)
#pragma GCC target("avx,sse2,sse3,sse4,mmx")
#pragma GCC optimize("Ofast")
#pragma GCC optimize("inline")
#pragma GCC optimize("-fgcse")
#pragma GCC optimize("-fgcse-lm")
#pragma GCC optimize("-fipa-sra")
#pragma GCC optimize("-ftree-pre")
#pragma GCC optimize("-ftree-vrp")
#pragma GCC optimize("-fpeephole2")
#pragma GCC optimize("-ffast-math")
#pragma GCC optimize("-fsched-spec")
#pragma GCC optimize("unroll-loops")
#pragma GCC optimize("-falign-jumps")
#pragma GCC optimize("-falign-loops")
#pragma GCC optimize("-falign-labels")
#pragma GCC optimize("-fdevirtualize")
#pragma GCC optimize("-fcaller-saves")
#pragma GCC optimize("-fcrossjumping")
#pragma GCC optimize("-fthread-jumps")
#pragma GCC optimize("-funroll-loops")
#pragma GCC optimize("-fwhole-program")
#pragma GCC optimize("-freorder-blocks")
#pragma GCC optimize("-fschedule-insns")
#pragma GCC optimize("inline-functions")
#pragma GCC optimize("-ftree-tail-merge")
#pragma GCC optimize("-fschedule-insns2")
#pragma GCC optimize("-fstrict-aliasing")
#pragma GCC optimize("-fstrict-overflow")
#pragma GCC optimize("-falign-functions")
#pragma GCC optimize("-fcse-skip-blocks")
#pragma GCC optimize("-fcse-follow-jumps")
#pragma GCC optimize("-fsched-interblock")
#pragma GCC optimize("-fpartial-inlining")
#pragma GCC optimize("no-stack-protector")
#pragma GCC optimize("-freorder-functions")
#pragma GCC optimize("-findirect-inlining")
#pragma GCC optimize("-fhoist-adjacent-loads")
#pragma GCC optimize("-frerun-cse-after-loop")
#pragma GCC optimize("inline-small-functions")
#pragma GCC optimize("-finline-small-functions")
#pragma GCC optimize("-ftree-switch-conversion")
#pragma GCC optimize("-foptimize-sibling-calls")
#pragma GCC optimize("-fexpensive-optimizations")
#pragma GCC optimize("-funsafe-loop-optimizations")
#pragma GCC optimize("inline-functions-called-once")
#pragma GCC optimize("-fdelete-null-pointer-checks")
#include<bits/stdc++.h>
using namespace std;
namespace IO {
#define iL (1 << 20)
char ibuf[iL], *iS = ibuf + iL, *iT = ibuf + iL;
#define gc() ((iS == iT) ? (iT = (iS = ibuf) + fread(ibuf, 1, iL, stdin), iS == iT ? EOF : *iS ++) : *iS ++)
template<class T> inline void read(T &x) {
x = 0;int f = 0;char ch = gc();
for (; !isdigit(ch); f |= ch == '-', ch = gc());
for (; isdigit(ch); x = (x << 1) + (x << 3) + (ch ^ 48), ch = gc());
x = (f == 1 ? ~ x + 1 : x);
}
template<class T, class... Args> inline void read(T &x, Args&... args) { read(x), read(args...); }
template<class T> inline void readch(T &x) { char ch = gc(); for (; !isalpha(ch); ch = gc()); x = ch; }
char Out[iL], *iter = Out;
#define flush() fwrite(Out, 1, iter - Out, stdout), iter = Out
template<class T> inline void write(T x, char ch = '\n') {
T l, c[35];
if (x < 0) *iter ++ = '-', x = ~ x + 1;
for (l = 0; !l || x; c[l] = x % 10, l++, x /= 10);
for (; l; -- l, *iter ++ = c[l] + '0');*iter ++ = ch;
flush();
}
template<class T, class... Args> inline void write(T x, Args... args) { write(x, ' '), write(args...); }
} // IO
using namespace IO;
const int N=5e5+7,B=2400;
const int mod=1e9+7;
inline int quick(int sum,int b)
{
int res=1;
while(b)
{
if(b&1) res=1ll*res*sum%mod;
sum=1ll*sum*sum%mod,b>>=1;
}
return res;
}
int n,m,l,r,x[N],y[N];
long long sum,al=1;
bitset<B> st[N];
bool vis[N];
int t[4000500],cnt[500500],inv[500500],tl[4000400],tr[4000400];
inline void build(int u,int l,int r)
{
tl[u]=l,tr[u]=r;
if(l==r) return ;
int mid=(l+r)>>1;
build(u<<1,l,mid),build(u<<1|1,mid+1,r);
}
inline void updata(int x, int ll, int rr, int d)
{
if(ll<=tl[x]&&rr>=tr[x]){t[x]=d;return ;}
if(t[x]) t[x<<1]=t[x<<1|1]=t[x],t[x]=0;
int mid=(tl[x]+tr[x])>>1;
if(ll<=mid) updata((x<<1),ll,rr,d);
if(rr>mid) updata((x<<1|1),ll,rr,d);
}
inline int query(int x, int d)
{
if(tl[x]==tr[x]) return t[x];
if(t[x]) t[x<<1]=t[x<<1|1]=t[x],t[x]=0;
int mid=(tl[x]+tr[x])>>1;
return (d<=mid)?query(x<<1,d):query(x<<1|1,d);
}
int main()
{
//freopen("P10365_98.in","r",stdin);
read(n);
const int m=2*n;
build(1,1,m);
for(int i=1;i<=n;i++)
{
read(l,r);
x[i]=query(1,l),y[i]=query(1,r);
updata(1,l,r,i);
}
for(int i=1;i<=n;i++) al=al*i%mod;
inv[0]=inv[1]=1;
for(int i=2;i<=n;i++) inv[i]=(mod-1ll*mod/i*inv[mod%i]%mod)%mod;
int l=1;
while(l<=n)
{
const int r=min(n,l+B-1);
int i=r+1;
while(--i)
{
if(i>=l) st[i][i-l]=true,vis[i]=true;
if(vis[i]==true)
{
cnt[i]+=st[i].count();
if(x[i]) st[x[i]]|=st[i],vis[x[i]]=true;
if(y[i]&&x[i]!=y[i]) st[y[i]]|=st[i],vis[y[i]]=true;
st[i].reset();vis[i]=false;
}
}
l=r+1;
}
for(int i=1;i<=n;i++) sum=(sum+inv[cnt[i]]);sum%=mod;
write(sum*quick(al,mod-1)%mod);
return 0;
}
在本地和 LOJ 上都能过编,为啥在 Luogu 上不行?