码迷,mamicode.com
首页 > 其他好文 > 详细

xxx

时间:2017-11-06 15:07:54      阅读:288      评论:0      收藏:0      [点我收藏+]

标签: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;
}

 

xxx

标签:ace   amp   a*   sum   lld   ring   void   code   bool   

原文地址:http://www.cnblogs.com/Blue233333/p/7792855.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!