• 10.2 上午 考试


    T1

    移项,然后离散,dp即可

     

    #include <cstdio>
    #include <cstring>
    #include <cstdlib>
    #include <iostream>
    #include <ctime>
    #include <algorithm>
    #define mem(a,b) memset(a,b,sizeof(a))
    #define ll long long
    using namespace std;
    const int N=200006;
    const int N2=500006;
    
    struct LI
    {
        int pos,val,flag;
        bool friend operator < (LI a,LI b)
        {
            return a.val<b.val;
        }
    }li[N2];
    int con;
    
    struct son
    {
        int x,w,v[2];
        bool friend operator < (son a,son b)
        {
            return a.x<b.x;
        }
    }ji[N];
    
    int n;
    int f[N];
    int ans;
    int now;
    
    void lisan()
    {
        for(int i=1;i<=n;++i)
        {
            li[++con]=(LI){i,ji[i].x-ji[i].w,0};
            li[++con]=(LI){i,ji[i].x+ji[i].w,1};
        }
        sort(li+1,li+1+con);
        li[0].val=-0x7fffffff;
        for(int i=1;i<=con;++i)
        {
            if(li[i].val==li[i-1].val)
                ji[li[i].pos].v[li[i].flag]=now;
            else
                ji[li[i].pos].v[li[i].flag]=++now;
        }
    }
    
    void out11()
    {
        printf("
    ");
        for(int i=1;i<=n;++i)
            printf("%d ",f[i]);
        printf("
    ");
    }
    
    int c[N2];
    inline void add(int pos,int vv)
    {
        for(int i=pos;i<=now;i+=(i&(-i)) )
            if(c[i]<vv)
                c[i]=vv;
    }
    inline int qq(int pos)
    {
        int ans=0;
        for(int i=pos;i>0;i-=(i&(-i)) )
            if(ans<c[i])
                ans=c[i];
        return ans;
    }
    
    void dp()
    {
        int temp;
        for(int i=1;i<=n;++i)
        {
            temp=qq(ji[i].v[0]);
            f[i]=temp+1;
            if(ans<f[i])
                ans=f[i];
            add(ji[i].v[1],f[i]);
        }
    
        //out11();
    }
    
    int main(){
    
        //freopen("T1.in","r",stdin);
        //freopen("T1.out","w",stdout);
    
        scanf("%d",&n);
        for(int i=1;i<=n;++i)
            scanf("%d%d",&ji[i].x,&ji[i].w);
        sort(ji+1,ji+1+n);
        lisan();
        dp();
        cout<<ans;
    }
    T1

     

     

     

    T2

    分块

     

    #pragma GCC optimize("O2")
    #include <cstdio>
    #include <cstring>
    #include <cstdlib>
    #include <iostream>
    #include <cmath>
    #include <algorithm>
    #define mem(a,b) memset(a,b,sizeof(a))
    #define ll long long
    using namespace std;
    const int N=100006;
    
    int n,m;
    int a[N];
    
    int fen,dui[N],L[1006],R[1006];
    int mx[1006];
    ll ji[1006];
    
    void reset(int x)
    {
        mx[x]=ji[x]=0;
        for(int i=L[x];i<=R[x];++i)
        {
            if(mx[x]<a[i])
                mx[x]=a[i];
            ji[x]+=a[i];
        }
    }
    
    void mm(int l,int r,int mod)
    {
        int q1=min(R[dui[l]],r);
        for(int i=l;i<=q1;++i)
            a[i]%=mod;
        reset(dui[l]);
        if(dui[l]!=dui[r])
        {
            for(int i=L[dui[r]];i<=r;++i)
                a[i]%=mod;
            reset(dui[r]);
        }
        for(int i=dui[l]+1;i<dui[r];++i)
        {
            if(mx[i]<mod)
                continue;
            for(int j=L[i];j<=R[i];++j)
                a[j]%=mod;
            reset(i);
        }
    }
    
    void change(int pos,int val)
    {
        a[pos]=val;
        reset(dui[pos]);
    }
    
    ll qq(int l,int r)
    {
        ll ans=0;
        int q1=min(R[dui[l]],r);
        for(int i=l;i<=q1;++i)
            ans+=a[i];
        if(dui[l]!=dui[r])
            for(int i=L[dui[r]];i<=r;++i)
                ans+=a[i];
        for(int i=dui[l]+1;i<dui[r];++i)
            ans+=ji[i];
        return ans;
    }
    
    int main(){
    
        freopen("T2.in","r",stdin);
        freopen("T2.out","w",stdout);
    
        scanf("%d%d",&n,&m);
        fen=(int)ceil(sqrt(n+0.5));
        for(int i=1;i<=n;++i)
        {
            scanf("%d",&a[i]);
            dui[i]=(i-1)/fen+1;
            if(mx[dui[i]]<a[i])
                mx[dui[i]]=a[i];
            ji[dui[i]]+=a[i];
        }
        for(int i=1;i<=dui[n];++i)
        {
            L[i]=(i-1)*fen+1;
            R[i]=min(n,i*fen);
        }
        int op,tin1,tin2,tin3;
        for(int i=1;i<=m;++i)
        {
            scanf("%d",&op);
            if(op==1)
            {
                scanf("%d%d",&tin1,&tin2);
                if(tin1>tin2)
                    swap(tin1,tin2);
                printf("%lld
    ",qq(tin1,tin2));
            }
            else
                if(op==2)
                {
                    scanf("%d%d%d",&tin1,&tin2,&tin3);
                    if(tin1>tin2)
                        swap(tin1,tin2);
                    mm(tin1,tin2,tin3);
                }
            else
            {
                scanf("%d%d",&tin1,&tin2);
                change(tin1,tin2);
            }
        }
    }
    T2

     

     

     

    T3

    会炸long long INF 的SBT....

    打表发现规律,然后 二分n即可

    K=64,必须特判,不然炸了...

     

     

    #include <cstdio>
    #include <cstring>
    #include <iostream>
    #define mem(a,b) memset(a,b,sizeof(a))
    #define ll long long
    using namespace std;
    
    ll num[123];
    
    void chu(int x)
    {
        mem(num,0);
        int temp=2*x;
        for(int i=x+1;i<=temp;++i)
        {
            int cc=0;
            for(int j=0;j<32;++j)
                if( i&(1<<j) )
                    ++cc;
            ++num[cc];
        }
        for(int i=1;i<=32;++i)
        {
            if(num[i]==0)
                break;
            printf("%lld ",num[i]);
        }
        printf("  ");
        for(int i=7;i>=0;--i)
            printf("%d",(((1<<i)&x)?1:0) );
        printf("
    ");
    }
    
    int main(){
    
        freopen("biao.out","w",stdout);
    
        for(int i=1;i<=100;++i)
            chu(i);
    
    }
    da_biao

     

     

    #include <cstdio>
    #include <cstring>
    #include <iostream>
    #define mem(a,b) memset(a,b,sizeof(a))
    #define ll long long
    using namespace std;
    const ll INF=((ll)1<<63)-1;
    
    int T,K;
    ll m;
    
    ll C[106][106];
    void chu()
    {
        C[0][0]=1;
        for(int i=1;i<66;++i)
            C[i][0]=C[i][i]=1;
        for(int i=1;i<66;++i)
            for(int j=1;j<i;++j)
                C[i][j]=C[i-1][j]+C[i-1][j-1];
    }
    
    ll ji(ll x)
    {
        ll ans=0;
        int cc=0;
        for(int i=63;i>=0;--i)
            if( x&((ll)1<<i) )
            {
                //printf("i=%d
    ",i);
                ++cc;
                if(K-cc>=0)
                    ans+=C[i][K-cc];
            }
        return ans;
    }
    
    ll erl(ll l,ll r)
    {
        ll ans=INF,mid;
        ll temp;
        while(l<=r)
        {
            mid=(l+r)>>1;
            temp=ji(mid);
            if(temp==m&&ans>mid&&mid)
                ans=mid;
            if(l>=r)
                break;
            if(temp>=m)
                r=mid-1;
            else
                l=mid+1;
        }
        return ans;
    }
    
    ll err(ll l,ll r)
    {
        ll ans=1,mid;
        ll temp;
        while(l<=r)
        {
            mid=(l+r)>>1;
            //printf("l=%lld r=%lld mid=%lld
    ",l,r,mid);
            temp=ji(mid);
            //printf("temp=%lld
    ",temp);
            if(temp==m&&ans<mid)
                ans=mid;
            if(l>=r)
                break;
            if(temp<=m)
                l=mid+1;
            else
                r=mid-1;
        }
        return ans;
    }
    
    int main(){
        
        //freopen("number10.in","r",stdin);
        //freopen("in.in","r",stdin);
        //freopen("out.out","w",stdout);
    
        chu();
        scanf("%d",&T);
        ll l0,r0;
        while(T--)
        {
            scanf("%lld%d",&m,&K);
            if(K==0)
            {
                printf("0 1
    ");
                continue;
            }
            if(K==1)
            {
                printf("-1
    ");
                continue;
            }
            if(K==64)
            {
                printf("1 %lld
    ",INF);
                continue;
            }
            //K=5;
            //printf("adsd=%lld
    ",ji(97));
            l0=erl(0,INF);
            r0=err(0,INF);
            printf("%lld %lld
    ",l0,r0);
        }
     // cout<<(((ll)1<<63)-1);
    }
    T3

     

  • 相关阅读:
    java 服务端设置跨域
    Git 使用常用命令
    关于全局变量使用时编译问题
    从阿里云读取文档到后台
    kindeditor编辑器
    Java后台Excel表导出
    AVAudioPlayer
    网络第三节——NSURLSession
    KVC 和 KVO
    网络第二节——AFNworking
  • 原文地址:https://www.cnblogs.com/A-LEAF/p/7620227.html
Copyright © 2020-2023  润新知