标签:ace amp a* sum lld ring void code bool
#include<stdio.h> #include<string.h> #include<stdlib.h> #include<math.h> #include<algorithm> //#include<iostream> using namespace std; bool isdigit(char c) {return c>=‘0‘ && c<=‘9‘;} int qread() { char c;int s=0,t=1;while (!isdigit(c=getchar())) (c==‘-‘ && (t=-1)); do s=s*10+c-‘0‘; while (isdigit(c=getchar())); return s*t; } const int mod=1e9+7; int n; #define maxn 400011 struct SMT { struct Node { int sum; int tag; int l,r; int ls,rs; }a[maxn<<1]; int size; SMT() {size=0;} void up(int x) { const int &p=a[x].ls,&q=a[x].rs; a[x].sum=a[p].sum+a[q].sum; a[x].sum-=a[x].sum>=mod?mod:0; } void build(int &x,int L,int R) { x=++size; a[x].l=L;a[x].r=R; a[x].tag=1; if (L==R) { a[x].sum=1; a[x].ls=a[x].rs=0; } else { const int mid=(L+R)>>1; build(a[x].ls,L,mid); build(a[x].rs,mid+1,R); up(x); } } void build() {int x;build(x,1,n*2);} void modifysingle(int x,int v) { a[x].sum=1ll*a[x].sum*v%mod; a[x].tag=1ll*a[x].tag*v%mod; } void down(int x) { const int &p=a[x].ls,&q=a[x].rs; if (a[x].tag!=1) { modifysingle(p,a[x].tag); modifysingle(q,a[x].tag); a[x].tag=1; } } int ql,qr,v; void modify(int x) { if (ql<=a[x].l && a[x].r<=qr) modifysingle(x,v); else { down(x); const int mid=(a[x].l+a[x].r)>>1; if (ql<=mid) modify(a[x].ls); if (qr> mid) modify(a[x].rs); up(x); } } void modify(int L,int R,int v) { ql=L;qr=R;this->v=v; modify(1); } }t; struct Edge{int l,r,v,next;}edge[maxn<<1];int first[maxn],le=2; void in(int x,int l,int r,int v) {Edge &e=edge[le];e.l=l;e.r=r;e.v=v;e.next=first[x];first[x]=le++;} int tag[maxn],yy[maxn]; struct Line { int l,r; }a[maxn]; int powmod(int a,int b) { int ans=1;a%=mod; while (b) { if (b&1) ans=1ll*ans*a%mod; a=1ll*a*a%mod; b>>=1; } return ans; } int main() { n=qread(); for (int i=1;i<=n;i++) a[i].l=qread(),a[i].r=qread(),tag[a[i].l]++,tag[a[i].r+1]--, in(a[i].l,a[i].l,a[i].r,1),in(a[i].r+1,a[i].l,a[i].r,-1); int now=0; for (int i=1;i<=n*2;i++) now+=tag[i],yy[i]=now; t.build(); long long ans=0; for (int i=1;i<=n*2;i++) { for (int j=first[i];j;j=edge[j].next) { const Edge &e=edge[j]; if (e.v==1) t.modify(e.l,e.r,(mod+1)>>1); else t.modify(e.l,e.r,2); } int pp=powmod(2,yy[i]); ans=(ans+1ll*pp*n*2%mod-1ll*pp*t.a[1].sum%mod)%mod; // cout<<t.a[1].sum<<‘ ‘; // cout<<ans<<endl; } printf("%lld\n",(ans+mod)%mod); return 0; }
标签:ace amp a* sum lld ring void code bool
原文地址:http://www.cnblogs.com/Blue233333/p/7792855.html