• 2018/7/20 模拟赛


    T1 以前做过的原题 GSS3。线段树。

    代码

    #include<iostream>
    #include<cstdio>
    #include<cstring>
    #include<cmath>
    
    using namespace std;
    const int MAXN = 500005;
    
    inline int rd(){
        int x=0,f=1;char ch=getchar();
        while(!isdigit(ch))  {if(ch=='-')f=-1;ch=getchar();}
        while(isdigit(ch))  {x=(x<<1)+(x<<3)+ch-'0';ch=getchar();}
        return x*f;
    }
    
    int n,m,a[MAXN];
    struct Node{
        int mx,lx,rx,sum;
    }node[MAXN<<2];
    
    inline void pushup(int x){
        node[x].sum=node[x<<1].sum+node[x<<1|1].sum;
        node[x].lx=max(node[x<<1].lx,node[x<<1].sum+node[x<<1|1].lx);
        node[x].rx=max(node[x<<1|1].rx,node[x<<1|1].sum+node[x<<1].rx);
        node[x].mx=max(node[x<<1|1].mx,max(node[x<<1].mx,node[x<<1].rx+node[x<<1|1].lx));
    }
    
    inline void build(int x,int l,int r){
        if(l==r){
            node[x].sum=node[x].lx=node[x].rx=node[x].mx=a[l];
            return ;
        }
        int mid=l+r>>1;
        build(x<<1,l,mid);build(x<<1|1,mid+1,r);
        pushup(x);
    }
    
    inline Node query(int x,int l,int r,int L,int R){
        if(L<=l && r<=R) return node[x];
        int mid=l+r>>1;
        if(mid<L) return query(x<<1|1,mid+1,r,L,R);
        if(mid>=R) return query(x<<1,l,mid,L,R);
        else{
            Node A=query(x<<1,l,mid,L,R);
            Node B=query(x<<1|1,mid+1,r,L,R);
            Node ans;
            ans.sum=A.sum+B.sum;
            ans.lx=max(A.lx,A.sum+B.lx);
            ans.rx=max(B.rx,B.sum+A.rx);
            ans.mx=max(max(A.mx,B.mx),A.rx+B.lx);
            return ans;
        }
    }
    
    inline void update(int x,int l,int r,int L,int R,int k){
        if(l==r && l==L){
            node[x].sum=node[x].mx=node[x].lx=node[x].rx=k;
            return;
        }
        int mid=l+r>>1;
        if(mid>=L) update(x<<1,l,mid,L,R,k);
        if(mid<R)  update(x<<1|1,mid+1,r,L,R,k);
        pushup(x);
    }
    
    int main(){
        freopen("BRS.in","r",stdin);
        freopen("BRS.out","w",stdout);
        n=rd();m=rd();
        for(register int i=1;i<=n;i++) a[i]=rd();
        build(1,1,n);
        for(register int i=1;i<=m;i++){
            int op=rd(),x=rd(),y=rd();
            if(op==1)   printf("%d
    ",query(1,1,n,x,y).mx);
            else update(1,1,n,x,x,y);
        }
        return 0;
    }

    T2打表找规律,最后发现是一个类似斐波那契的,矩阵乘法直接搞。结果考场上最后一步没有取模爆零?????233333.。。

    代码

    #include<iostream> 
    #include<cstdio>
    #include<cstring>
    #include<cmath>
    #define LL long long
    
    using namespace std;
    const int mod = 7777777;
    
    int n,k;
    
    struct Mat{
        LL a[15][15];
        Mat(){
            memset(a,0,sizeof(a));
        }
        Mat operator*(const Mat &h){
            Mat c;
            for(register int i=1;i<=k;i++)
                for(register int j=1;j<=k;j++)
                    for(register int o=1;o<=k;o++)
                        (c.a[i][j]+=(a[i][o]%mod*h.a[o][j]%mod))%=mod;
            return c;
        }
    }f,ans,st;
    
    inline void fast_pow(Mat A,int b){
        for(;b;b>>=1){
            if(b&1) st=st*A;
            A=A*A;
        }
    }
    
    int main(){
        freopen("fyfy.in","r",stdin);
        freopen("fyfy.out","w",stdout);
        scanf("%d%d",&k,&n);
        if(k==1){
            puts("1");
            return 0;
        }
        for(register int i=2;i<=k;i++)  f.a[i][i-1]=1;
        for(register int i=1;i<=k;i++)  f.a[i][k]=1;
        for(register int i=1;i<=k;i++)  st.a[i][i]=1;
        fast_pow(f,n);
        printf("%lld
    ",st.a[k][k]);
        return 0;
    }

    T3,扫描线。。当时的坑没填,暴力30分走人。先把纵坐标离散化,之后将横坐标排序,然后一个个的跳。因为数据范围小,直接O(n^2) 能过,就没线段树优化。

    代码

    #include<iostream>
    #include<cstdio>
    #include<cstring>
    #include<algorithm>
    #define LL long long
    #define int long long 
    
    using namespace std;
    const int MAXN = 105;
    
    inline int rd(){
        int x=0,f=1;char ch=getchar();
        while(!isdigit(ch)) {if(ch=='-') f=-1;ch=getchar();}
        while(isdigit(ch))  {x=(x<<1)+(x<<3)+ch-'0';ch=getchar();}
        return x*f;
    }
    
    int n;
    
    struct Node{
        int x1,x2,y1,y2;
    }node[MAXN];
    
    struct A{
        int y1,y2,x,k;
    }a[MAXN<<1];
    
    int y[MAXN<<1],cnt;
    int c[MAXN<<1];
    LL ans;
    
    inline bool cmp(A a,A b){
        return a.x<b.x;
    }
    
    signed main(){
        freopen("olddriver.in","r",stdin);
        freopen("olddriver.out","w",stdout);
        n=rd();
        for(register int i=1;i<=n;i++){
            node[i].x1=rd(),node[i].y1=rd();
            node[i].x2=rd(),node[i].y2=rd();
            y[++cnt]=node[i].y1;
            y[++cnt]=node[i].y2;
        }
        sort(y+1,y+1+cnt);
        int u=unique(y+1,y+1+cnt)-y-1;
        for(register int i=1;i<=n;i++){
            node[i].y1=lower_bound(y+1,y+1+u,node[i].y1)-y;
            node[i].y2=lower_bound(y+1,y+1+u,node[i].y2)-y;
        }
    //  for(register int i=1;i<=n;i++)
    //      cout<<node[i].y1<<" "<<node[i].y2<<endl;
        cnt=0;
        for(register int i=1;i<=n;i++){
            a[++cnt].y1=node[i].y1;
            a[cnt].y2=node[i].y2;
            a[cnt].x=node[i].x1;
            a[cnt].k=1;
            a[++cnt].y1=node[i].y1;
            a[cnt].y2=node[i].y2;
            a[cnt].x=node[i].x2;
            a[cnt].k=-1;
        }
        sort(a+1,a+1+cnt,cmp);
        for(register int i=1;i<=cnt;i++){
            for(register int j=1;j<=u;j++)
                if(c[j]) ans+=(a[i].x-a[i-1].x)*(y[j+1]-y[j]);
            for(register int j=a[i].y1;j<a[i].y2;j++)
                 c[j]+=a[i].k;
        }
        printf("%lld",ans);
        return 0;
    }
  • 相关阅读:
    NOIP2009 靶形数独
    NOIP2014 寻找道路
    NOIP2005 篝火晚会
    NOIP2014 联合权值
    NOIP2011 选择客栈
    luogu2659 美丽的序列
    NOIP2008 传纸条
    vijos1642 班长的任务
    codevs1427 RQNOJ204 特种部队
    AC自动机
  • 原文地址:https://www.cnblogs.com/sdfzsyq/p/9676935.html
Copyright © 2020-2023  润新知