• 二维偏序


    Laptop

    要求的是所有的存在s,w都比它大的物品的物品的个数

    正着不好去重

    倒着枚举s,当前位置后面的物品s都比它大,减掉w比他小的,就能判断是否有w也比他大的

    如果有 ans++

    #include<bits/stdc++.h>
    using namespace std;
    #define int long long
    #define sc(x) scanf("%lld",&x);
    #define si signed
    int n;
    int M[100005];
    int S[100005];
    int I[100005];
    int m[100005];
    int B[100005];
    bool cmp(int x,int y)
    {
        return S[x]<S[y];
    }
    void add(int x)
    {
        int i=x;
        for(;i<=100000;i+=(i&(-i))){
            B[i]++;
        }
    }
    int ask(int x)
    {
        int i=x;
        int ans=0;
        for(;i>0;i-=(i&(-i))){
            ans+=B[i];
            //cout<<ans<<endl;
        }
        return ans;
    }
    si main()
    {
        sc(n);
        for(int i=1;i<=n;i++){
            sc(M[i])sc(S[i])
            I[i]=i;m[i]=M[i];
        }
        sort(I+1,I+n+1,cmp);
        sort(m+1,m+1+n);
        int len=unique(m+1,m+1+n)-(m+1);
    
        for(int i=1;i<=n;i++)
         M[i]= lower_bound(m+1,m+1+len,M[i])-(m);
    
        int ans=0;
        //cout<<"TRUE"<<endl;
        for(int i=n;i>=1;i--){
            int t=ask(M[I[i]]);
    
            if(n-t-i>0)ans++;
            //cout<<ans<<endl;
            add(M[I[i]]);
        }
        cout<<ans<<'
    ';
    }

    10114. 「一本通 4.1 例 2」数星星 Stars

    排序时注意下第二个维度

    #include<bits/stdc++.h>
    using namespace std;
    #define int long long
    #define sc(x) scanf("%lld",&x);
    #define si signed
    int n;
    int M[100005];
    int S[100005];
    int I[100005];
    int m[100005];
    int B[100005];
    int Ans[100005];
    bool cmp(int x,int y)
    {
        if(S[x]==S[y])return M[x]<M[y];
        return S[x]<S[y];
    }
    void add(int x)
    {
        int i=x;
        for(;i<=100000;i+=(i&(-i))){
            B[i]++;
        }
    }
    int ask(int x)
    {
        int i=x;
        int ans=0;
        for(;i>0;i-=(i&(-i))){
            ans+=B[i];
            //cout<<ans<<endl;
        }
        return ans;
    }
    si main()
    {
        sc(n);
        for(int i=1;i<=n;i++){
            sc(M[i])sc(S[i])
            I[i]=i;m[i]=M[i];
        }
        sort(I+1,I+n+1,cmp);
        sort(m+1,m+1+n);
        int len=unique(m+1,m+1+n)-(m+1);
    
        for(int i=1;i<=n;i++)
         M[i]= lower_bound(m+1,m+1+len,M[i])-(m);
    
        int ans=0;
        //cout<<"TRUE"<<endl;
        for(int i=1;i<=n;i++){
            int t=ask(M[I[i]]);
    
            Ans[t]++;
            //cout<<ans<<endl;
            add(M[I[i]]);
        }
        for(int i=0;i<n;i++){
            cout<<Ans[i]<<endl;
        }
    }
  • 相关阅读:
    vue2.0 动画
    I. 对缓存进行处理
    G. 【案例】Ajax实现无刷新分页效果
    H. Ajax对XML信息的接收与处理
    F. 异步同步请求
    D. 接收服务器端返回的信息
    E. 请求GET和POST的不同
    C. 发起对服务器的请求
    B. 创建Ajax对象
    A. AJAX介绍
  • 原文地址:https://www.cnblogs.com/liulex/p/11782272.html
Copyright © 2020-2023  润新知