Codeforces Round #576 (Div. 2) A-D

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;
    }
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 213,014评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,796评论 3 386
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 158,484评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,830评论 1 285
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,946评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,114评论 1 292
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,182评论 3 412
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,927评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,369评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,678评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,832评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,533评论 4 335
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,166评论 3 317
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,885评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,128评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,659评论 2 362
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,738评论 2 351

推荐阅读更多精彩内容