美文网首页
Codeforces Round #576 (Div. 2) A

Codeforces Round #576 (Div. 2) A

作者: 林即中 | 来源:发表于2019-07-31 11:38 被阅读0次

    A. City Day

    暴力搜索就可以了

        #include <iostream>
        #include <cstdio>
        #include <queue>
        using namespace std;
        int n, x, y;
        const int N = 100002;
        int arr[N];
        bool valid[N];
         
        int main()
        {
            #ifdef CODEBLOCKS
            freopen("in.txt", "r", stdin);
            #endif // CODEBLOCKS
         
            while(cin>>n>>x>>y)
            {
                for(int i=0;i<n;i++)
                {
                    cin>>arr[i];
                    valid[i] = false;
                }
                for(int i=0;i<n;i++)
                {
                    bool flag = true;
                    for(int j=0;j<x&&i-j-1>=0;j++)
                    {
                        if(arr[i]>=arr[i-j-1])
                        {
                            flag = false;
                            break;
                        }
                    }
                    valid[i] = flag;
                }
        //        for(int i=0;i<n;i++)
        //        {
        //            cout<<valid[i]<<' ';
        //        }
        //        cout<<endl;
         
                for(int i=0;i<n;i++)
                {
                    bool flag = true;
                    for(int j=0;j<y&&i+j+1<n;j++)
                    {
                        if(arr[i]>=arr[i+j+1])
                        {
         
                            flag = false;
                            break;
                        }
                    }
                    if(valid[i] && flag)
                    {
                        cout<<i+1<<endl;
                        break;
                    }
                }
            }
            return 0;
        }
    

    B. Water Lily

    设高度是x,则斜边是H+x。有(H+x)^2 = L^2 + x^2,得x^2 = (L^2 - H^2)/2H

        #include <iostream>
        #include <cstdio>
        using namespace std;
        int h,l;
        int main()
        {
            #ifdef CODEBLOCKS
            freopen("in.txt", "r", stdin);
            #endif // CODEBLOCKS
            while(cin>>h>>l)
            {
                printf("%.7f\n",(1.0*l/2/h*l - 1.0*h/2));
            }
            return 0;
        }
    

    C. MP3

    需要nk<=8I,则k=\lfloor 8I/n\rfloor。首先如果2^k>=n,则无需做任何修改。
    排序a_1,a_2,...,a_n,然后顺序统计cnt[j]为相同数字的数目,第j大的数字有多少格,假设有cn个不同数字,cnt数组的长度为cn。然后计算sum[j] = \Sigma_{x=1}^j cnt[x],所求答案为min(sum[cn] - (sum[j] - sum[j-2^k]))

        #include <iostream>
        #include <cstdio>
        #include <algorithm>
        using namespace std;
        int n, I;
        const int N = 4*100001;
        int arr[N];
        int sum[N];
        int sn;
        int main()
        {
            #ifdef CODEBLOCKS
            freopen("in.txt", "r", stdin);
            #endif // CODEBLOCKS
            while(cin>>n>>I)
            {
                for(int i=0;i<n;i++)
                {
                    cin>>arr[i];
                }
                sort(arr, arr+n);
                sn = 0;
                for(int i=0;i<n;i++)
                {
                    if(i==0||arr[i]!=arr[i-1])
                    {
                        sum[sn] = 1;
                        if(sn>0)
                        {
                            sum[sn]+=sum[sn-1];
                        }
                        sn++;
                    }
                    else
                    {
                        sum[sn-1] ++;
                    }
                }
                int k = 8*I/n;
                int K = 1;
                for(int i=0;i<k;i++)
                {
                    K<<=1;
                    if(K >= sn)
                    {
                        break;
                    }
                }
                if(K>=sn)
                {
                    cout<<0<<endl;
                }
                else
                {
                    int ret = sum[sn-1] - sum[K-1];
                    for(int i=K;i<sn;i++)
                    {
                        ret = min(ret, sum[sn-1]-(sum[i] - sum[i-K]));
                    }
                    cout<<ret<<endl;
                }
            }
            return 0;
        }
    

    D. Welfare State

    构造线段树,线段树节点seg.val保存该区间的最小值是多少。
    对于2类操作,直接使树根节点root.val=x,表明该区间的最小值将调整为x
    对于1类操作,从树根往下更新对应点所在区间的节点。更新一个节点时,首先把当前节点的seg.val往下传递,使child.val = max(child.val, seg.val),然后递归往下。遇到叶子节点时,如果下标是操作目标p,使a_p=x,如果不是,则是a_{seg.index}=max(seg.val, a_{seg.index})。所有操作完成后,再对整个线段树进行更新,如果a_i小于所在区间的最小值val,把它更新为val。

        #include <iostream>
        #include <cstdio>
        using namespace std;
        int n;
        const int N = 2*100001;
        int arr[N];
        int q;
        struct seg
        {
            int l,r;
            int val;
            seg(){}
            seg(int l, int r):l(l),r(r){}
         
        }segs[N*4];
        seg build_tree(int root, int l, int r)
        {
            segs[root] = seg(l, r);
            if(l==r)
            {
                segs[root].val = arr[l];
            }
            else
            {
                int mid = (l+r)/2;
                build_tree(2*root, l, mid);
                build_tree(2*root+1, mid+1, r);
                segs[root].val = min(segs[2*root].val, segs[2*root+1].val);
            }
        }
        void apply(int root, int index, int val)
        {
        //    cout<<"apply"<<segs[root].l <<' '<< segs[root].r<<' '<<index<<' '<<val<<endl;
            if(segs[root].l == segs[root].r)
            {
                if(segs[root].l == index)
                {
                    arr[index] = val;
                    segs[root].val = val;
                }
                else
                {
                    if(segs[root].val > arr[segs[root].l])
                    {
                        arr[segs[root].l] = segs[root].val;
                    }
                }
                return;
            }
            if(segs[root].l<=index && index<=segs[root].r)
            {
                seg left = segs[2*root];
                seg right = segs[2*root + 1];
                if(left.val < segs[root].val)
                {
                    segs[2*root].val = segs[root].val;
                }
                if(right.val < segs[root].val)
                {
                    segs[2*root+1].val = segs[root].val;
                }
                if(left.l<=index && index<=left.r)
                {
                    apply(2*root, index, val);
                }
                else
                {
                    apply(2*root, index, segs[root].val);
                }
                if(right.l<=index &&index<=right.r)
                {
                    apply(2*root+1, index, val);
                }
                else
                {
                    apply(2*root+1, index, segs[root].val);
                }
                segs[root].val = min(segs[2*root].val, segs[2*root+1].val);
            }
            else
            {
                if(val>segs[root].val)
                {
                    segs[root].val = val;
                }
            }
        }
        void applyFinal(int root, int val)
        {
        //    cout<<"apply final"<<segs[root].l <<' '<< segs[root].r<<' '<<segs[root].val<<endl;
            if(segs[root].l == segs[root].r)
            {
                arr[segs[root].l] = max(segs[root].val, val);
                return;
            }
            applyFinal(2*root, max(val, segs[root].val));
            applyFinal(2*root+1, max(val, segs[root].val));
        }
        int main()
        {
            #ifdef CODEBLOCKS
            freopen("in.txt","r", stdin);
            #endif // CODEBLOCKS
            while(cin>>n)
            {
                for(int i=0;i<n;i++)
                {
                    cin>>arr[i];
                }
                build_tree(1, 0, n-1);
        //        cout<<"build end"<<endl;
                cin>>q;
                for(int i=0;i<q;i++)
                {
                    int t,p,x;
                    cin>>t;
                    if(t==1)
                    {
                        cin>>p>>x;
                        apply(1, p-1, x);
        //                for(int i=0;i<n;i++)
        //                {
        //                    cout<<arr[i]<<' ';
        //                }
        //                cout<<endl;
                    }
                    else
                    {
                        cin>>x;
                        if(x > segs[1].val)
                        {
                            segs[1].val = x;
                        }
                    }
                }
                applyFinal(1, segs[1].val);
                for(int i=0;i<n;i++)
                {
                    if(i)cout<<' ';
                    cout<<arr[i];
                }
                cout<<endl;
            }
            return 0;
        }
    

    相关文章

      网友评论

          本文标题:Codeforces Round #576 (Div. 2) A

          本文链接:https://www.haomeiwen.com/subject/zvrzrctx.html