• Codeforces Round #539 (Div. 1)


    A - Sasha and a Bit of Relax

    code:

    #include <cstdio>
    #include <map> 
    #include <cstring>
    #include <algorithm>
    #define N 300006   
    #define ll long long  
    #define setIO(s) freopen(s".in","r",stdin)
    using namespace std;
    int a[N],n;      
    map<int,int>mp[2];    
    int main()
    { 
        // setIO("input");   
        int i,j;  
        scanf("%d",&n);  
        ll ans=0ll;  
        mp[0][0]++;   
        for(i=1;i<=n;++i) 
        {
            scanf("%d",&a[i]),a[i]^=a[i-1];    
            ans+=(ll)mp[i&1][a[i]];        
            mp[i&1][a[i]]++;   
        }
        printf("%lld
    ",ans);   
        return 0;
    }
    

      

    B - Sasha and One More Name

    code:

    #include <cstdio>
    #include <map> 
    #include <cstring>
    #include <algorithm>
    #define N 300006   
    #define ll long long  
    #define setIO(s) freopen(s".in","r",stdin)
    using namespace std;
    char S[N],A[N];   
    int n;     
    int check() 
    {
        int i,j,flag=0,mid=n/2;            
        for(i=2;i<=mid;++i) if(S[i]!=S[i-1]) { flag=1;  break; }    
        return flag;    
    }
    int check_1() 
    {
        int i,j;       
        for(i=2;i<n;++i) 
        { 
            int tmp=0; 
            for(j=i;j<=n;++j) A[++tmp]=S[j];   
            for(j=1;j<i;++j)  A[++tmp]=S[j]; 
            int flag=0;    
            int mid=n/2;    
            for(j=1;j<=mid;++j) if(A[j]!=A[n-j+1]) flag=1;     
            if(!flag) 
            {            
                int flag2=0; 
                for(j=1;j<=n;++j) if(A[j]!=S[j]) flag2=1;          
                if(flag2) return 1;  
            }       
        }
        return 0;   
    }
    int main() 
    { 
        // setIO("input");  
        int i,j;     
        scanf("%s",S+1),n=strlen(S+1);      
        if(!check()) printf("Impossible
    ");  
        else if(check_1()) printf("1
    ");     
        else printf("2
    ");   
        return 0;
    }
    

      

    D - Sasha and Interesting Fact from Graph Theory

    code:

    #include <cstdio> 
    #include <algorithm> 
    #include <cstring>     
    #define N 2000001     
    #define ll long long 
    #define mod 1000000007  
    #define setIO(s) freopen(s".in","r",stdin) 
    using namespace std;    
    int fac[N],inv[N];     
    int qpow(int x,int y) 
    {
        if(y<0) return qpow(x,y+mod-1);   
        int tmp=1;    
        for(;y>0;y>>=1,x=(ll)x*x%mod) 
            if(y&1) tmp=(ll)tmp*x%mod;  
        return tmp;   
    }  
    int C(int x,int y) 
    { 
        if(x<0||y<0||x<y) return 0;   
        return (ll)fac[x]*inv[y]%mod*inv[x-y]%mod; 
    }
    int main() 
    { 
        // setIO("input");   
        int i,j,n,m,a,b,ans=0;      
        fac[0]=inv[0]=1;  
        for(i=1;i<N;++i) fac[i]=(ll)fac[i-1]*i%mod,inv[i]=qpow(fac[i],mod-2);   
        scanf("%d%d%d%d",&n,&m,&a,&b);   
        for(i=0;i<=n-2;++i) 
        {                 
            (ans+=(ll)C(m-1,i)*C(n-2,i)%mod*(i+2)%mod*qpow(n,n-i-3)%mod*qpow(m,n-2-i)%mod*fac[i]%mod)%=mod;   
        }
        printf("%d
    ",ans);   
        return 0;
    }
    

      

    CF1109F Sasha and Algorithm of Silence's Sounds

    code:

    #include <cstdio> 
    #include <map> 
    #include <vector>  
    #include <cmath>    
    #include <cstring>
    #include <algorithm>    
    #define M 2006  
    #define N 200009   
    #define inf 1000000  
    #define ll long long   
    #define setIO(s) freopen(s".in","r",stdin) 
    using namespace std;
    int n,m,total;    
    namespace LCT 
    {       
        #define lson s[x].ch[0] 
        #define rson s[x].ch[1]  
        int sta[N];   
        struct data 
        {   
            int ch[2],rev,f;               
        }s[N];          
        int get(int x)  { return s[s[x].f].ch[1]==x; }  
        int isrt(int x) { return !(s[s[x].f].ch[0]==x||s[s[x].f].ch[1]==x); }     
        void rotate(int x) 
        { 
            int old=s[x].f,fold=s[old].f,which=get(x);  
            if(!isrt(old)) s[fold].ch[s[fold].ch[1]==old]=x;   
            s[old].ch[which]=s[x].ch[which^1],s[s[old].ch[which]].f=old;  
            s[x].ch[which^1]=old,s[old].f=x,s[x].f=fold;    
        }    
        void mark(int x) 
        {
            swap(lson,rson),s[x].rev^=1;    
        } 
        void pushdown(int x) 
        { 
            if(s[x].rev) 
            {
                if(lson) mark(lson); 
                if(rson) mark(rson); 
                s[x].rev=0;   
            }
        }
        void splay(int x) 
        { 
            int u=x,v=0,fa;  
            for(sta[++v]=u;!isrt(u);u=s[u].f) sta[++v]=s[u].f;        
            for(;v;--v) pushdown(sta[v]);   
            for(u=s[u].f;(fa=s[x].f)!=u;rotate(x))  
                if(s[fa].f!=u) 
                    rotate(get(fa)==get(x)?fa:x);   
        }
        void Access(int x) 
        {
            for(int y=0;x;y=x,x=s[x].f) 
            {
                splay(x); 
                rson=y;    
            }
        }  
        void makert(int x) 
        {
            Access(x),splay(x),mark(x);  
        }      
        int findrt(int x) 
        {       
            Access(x),splay(x);     
            while(s[x].ch[0]) pushdown(x),x=s[x].ch[0];               
            return x;      
        }
        void link(int x,int y) 
        {        
            makert(x),makert(y),s[y].f=x;    
        }       
        void cut(int x,int y) 
        {
            makert(x),Access(y),splay(y);   
            s[y].ch[0]=s[x].f=0;         
        }
        #undef lson 
        #undef rson 
    };  
    namespace seg
    {   
        #define lson now<<1   
        #define rson now<<1|1   
        struct node 
        {    
            int mn,num_mn,sum;           
            node() { mn=num_mn=sum=0; }         
            node operator+(const node &b) const 
            {
                node c;     
                c.sum=sum+b.sum;     
                c.mn=min(b.sum+mn,b.mn);                 
                if(b.sum+mn==c.mn) c.num_mn+=num_mn;   
                if(b.mn==c.mn) c.num_mn+=b.num_mn;   
                return c;   
            }
        }s[N<<2];    
        void build(int l,int r,int now) 
        {
            s[now].mn=inf;   
            if(l==r)  
            {              
                s[now].mn=s[now].num_mn=s[now].sum=1;  
                return;  
            }   
            int mid=(l+r)>>1;                
            build(l,mid,lson),build(mid+1,r,rson);  
            s[now]=s[lson]+s[rson];   
        }        
        void update(int l,int r,int now,int p,int v) 
        {      
            if(l==r) 
            {
                s[now].sum+=v;  
                s[now].mn+=v;    
                s[now].num_mn=1;    
                return;  
            }
            int mid=(l+r)>>1;  
            if(p<=mid)  update(l,mid,lson,p,v);  
            else update(mid+1,r,rson,p,v);  
            s[now]=s[lson]+s[rson];  
        }
        node query(int l,int r,int now,int L,int R) 
        {
            if(l>=L&&r<=R) return s[now];     
            int mid=(l+r)>>1;     
            if(L<=mid&&R>mid)  return query(l,mid,lson,L,R)+query(mid+1,r,rson,L,R);  
            else if(L<=mid) return query(l,mid,lson,L,R);   
            else return query(mid+1,r,rson,L,R);   
        }   
        #undef lson 
        #undef rson   
    };   
    int l,r;   
    struct Pos
    {
        int x,y; 
        Pos(int x=0,int y=0):x(x),y(y){}  
    }pos[M*M];      
    int G[M][M];          
    int go(int x,int y) 
    {   
        if(y>=l&&y<=r)  
        {
            if(LCT::findrt(x)==LCT::findrt(y)) return 1;  
            else { LCT::link(x,y); return 0; } 
        }
        else return 0;  
    }
    void recover(int x,int y) 
    { 
        if(y>=l&&y<=r) 
        {
            if(LCT::findrt(x)==LCT::findrt(y)) LCT::cut(x,y);  
        }
    }
    int check(int x) 
    {    
        int flag=1;  
        int xx=pos[x].x,yy=pos[x].y;       
        if(xx-1>=1&&go(x,G[xx-1][yy])) flag=0;    
        if(xx+1<=n&&go(x,G[xx+1][yy])) flag=0;   
        if(yy-1>=1&&go(x,G[xx][yy-1])) flag=0;   
        if(yy+1<=m&&go(x,G[xx][yy+1])) flag=0;         
        recover(x,G[xx-1][yy]); 
        recover(x,G[xx+1][yy]); 
        recover(x,G[xx][yy-1]); 
        recover(x,G[xx][yy+1]);   
        return flag;    
    }          
    void update(int x,int y) 
    {    
        if(y>=l&&y<=r) 
        {         
            LCT::cut(x,y);     
            seg::update(1,total,1,x,1);    
        }
    }
    void Del(int x) 
    {
        int xx=pos[x].x,yy=pos[x].y;                 
        update(x,G[xx-1][yy]);    
        update(x,G[xx+1][yy]);    
        update(x,G[xx][yy-1]);     
        update(x,G[xx][yy+1]);   
    }
    void rese(int x,int y) 
    {    
        if(y>=l&&y<=r) 
        {         
            LCT::link(x,y);     
            seg::update(1,total,1,y,-1);       
        }
    }
    void Add(int x) 
    {       
        int xx=pos[x].x,yy=pos[x].y;   
        rese(x,G[xx-1][yy]);  
        rese(x,G[xx+1][yy]);   
        rese(x,G[xx][yy-1]); 
        rese(x,G[xx][yy+1]);    
    }
    int main() 
    { 
        // setIO("input");  
        int i,j;   
        ll ans=0;   
        scanf("%d%d",&n,&m),total=n*m;    
        seg::build(1,total,1);   
        for(i=1;i<=n;++i) 
            for(j=1;j<=m;++j) scanf("%d",&G[i][j]),pos[G[i][j]]=Pos(i,j);              
        for(l=r=1;r<=total;++r) 
        {
            while(!check(r))   
            {    
                Del(l),++l;    
            }      
            Add(r);     
            seg::node p=seg::query(1,total,1,l,r);        
            if(p.mn==1) ans+=(ll)p.num_mn;    
        }
        printf("%lld
    ",ans);   
        return 0;  
    }
    

      

  • 相关阅读:
    改变oracle数据库归档模式_译文
    改变数据库归档模式
    oracle状态
    oracle开启一个用户
    plsql中文乱码问题方案解决
    mybatis 和hibernate的区别
    jquery
    servlet 相应头重定向
    自定义鼠标右键
    关于select input(选中,取值,赋值等)--------方便自己查阅
  • 原文地址:https://www.cnblogs.com/guangheli/p/12274648.html
Copyright © 2020-2023  润新知