• codeforces Round #Pi (div.2) 567ABCD


    567A Lineland Mail
    题意:一些城市在一个x轴上,他们之间非常喜欢写信交流。送信的费用就是两个城市之间的距离,问每个城市写一封信给其它城市所花费的最小费用和最大的费用。


    没什么好说的。直接做。特判最左边的和最右边的。
    其它的最小值在相邻的城市取,最大的在两边的城市与本城市取最大值。


    代码:

    #include <set>
    #include <map>
    #include <queue>
    #include <stack>
    #include <deque>
    #include <math.h>
    #include <string>
    #include <vector>
    #include <stdio.h>
    #include <iostream>
    #include <string.h>
    #include <algorithm>
    #include <functional>
    #define mem(a) memset(a,0,sizeof(a));
    #define mem_1(a) memset(a,-1,sizeof(a));
    #define sf(a) scanf("%d",&a)
    #define sff(a,b) scanf("%d%d",&a,&b)
    #define sfff(a,b,c) scanf("%d%d%d",&a,&b,&c)
    const int INF = 0x7FFFFFFF;
    const int MAXN = 201000;
    const double PI = acos(-1.0);
    const double esp = 1e-10;
    using namespace std;
    int data[MAXN];
    int main()
    {
        int n;
        sf(n);
        for(int i=1;i<=n;i++)
        {
            sf(data[i]);
        }
        for(int i=1;i<=n;i++)
        {
            if(i == 1)
                printf("%d %d
    ",data[2] - data[1],data[n] - data[1]);
            else if(i==n)
                printf("%d %d
    ",data[n] - data[n-1],data[n] - data[1]);
            else
                printf("%d %d
    ",min(data[i+1] - data[i],data[i]-data[i-1]),max(data[i]-data[1],data[n] - data[i]));
        }
    }

    567B Berland National Libray
    题意:图书馆进出的时候都要刷卡进去,每个人都有一个ID号。给你一段时间的进出记录,让你算出图书馆的最小容量为多少。


    跟模拟几乎相同。注意一下进出时候的容量细节。
    代码:

    #include <set>
    #include <map>
    #include <queue>
    #include <stack>
    #include <deque>
    #include <math.h>
    #include <string>
    #include <vector>
    #include <stdio.h>
    #include <iostream>
    #include <string.h>
    #include <algorithm>
    #include <functional>
    #define mem(a) memset(a,0,sizeof(a));
    #define mem_1(a) memset(a,-1,sizeof(a));
    #define sf(a) scanf("%d",&a)
    #define sff(a,b) scanf("%d%d",&a,&b)
    #define sfff(a,b,c) scanf("%d%d%d",&a,&b,&c)
    const int INF = 0x7FFFFFFF;
    const int MAXN = 1010000;
    const double PI = acos(-1.0);
    const double esp = 1e-10;
    using namespace std;
    bool flag[MAXN];
    int ans,now;
    int main()
    {
        int n,num;
        char c;
        sf(n);
        while(n--)
        {
            cin >> c;
            sf(num);
            if(c=='+')
            {
                flag[num]++;
                now++;
                if(now>ans) ans = now;
            }
            else
            {
                if(flag[num])
                {
                    flag[num] = 0;
                    now--;
                }
                else
                {
                    ans++;
                }
            }
           // cout << ans << endl;
        }
        printf("%d
    ",ans);
        return 0;
    }
    567C. Geometric Progression
    题意:有一个三岁的小屁孩特别喜欢三个数组成的等差数列。他如今有一组数,特别想知道里面含多少由三个数组成的等比数列,他年纪太小不会算,想难为一下搞ACM的。

    注意 能够不连续,可是等比数列在数组中的位置必须是递增的。
    思路:遍历数组,对于每个值都把他当做等比数列的中间的值x,对K求余。余数为零时,看(x/k)在该数之前出现了多少次,(x*k)在该数之后出现了多少次,求和就可以。


    如今问题转换成,在x之前 x/k,x*k 出现了多少次?
    用map数组处理一下左右的数出现了多少次。在遍历数组的时候。每到一个数mapR[x]--;处理完之后mapL[x]++;具体看代码
    代码:

    #include <set>
    #include <map>
    #include <queue>
    #include <stack>
    #include <deque>
    #include <math.h>
    #include <string>
    #include <vector>
    #include <stdio.h>
    #include <iostream>
    #include <string.h>
    #include <algorithm>
    #include <functional>
    #define mem(a) memset(a,0,sizeof(a));
    #define mem_1(a) memset(a,-1,sizeof(a));
    #define sf(a) scanf("%d",&a)
    #define sff(a,b) scanf("%d%d",&a,&b)
    #define sfff(a,b,c) scanf("%d%d%d",&a,&b,&c)
    #define lson l,mid,i<<1
    #define rson mid+1,r,i<<1|1
    #define LL long long
    const int INF = 0x7FFFFFFF;
    const int MAXN = 1010000;
    const double PI = acos(-1.0);
    const double esp = 1e-10;
    using namespace std;
    map<LL,LL> L;
    map<LL,LL> R;
    LL data[MAXN];
    int main()
    {
        LL n,k;
        scanf("%I64d %I64d",&n,&k);
        for(int i=1;i<=n;i++)
        {
            scanf("%I64d",&data[i]);
            R[data[i]]++;
        }
        LL ans = 0;
        for(int i=1;i<=n;i++)
        {
            R[data[i]]--;
            if(data[i]%k==0)
            {
                ans += L[data[i]/k] * R[data[i]*k];
            }
            L[data[i]]++;
        }
        printf("%I64d
    ",ans);
        return 0;
    }

    567D. One-Dimensional Battle Ships
    题意:又是熟悉的爱丽丝和啵啵。他们在一起玩游戏。简化一下说吧。爱丽丝有K个1*a大小的长方形的木块。不相邻。不相交的放在1~n的方格上。爱丽丝不告诉啵啵他放在了哪里,让啵啵猜。啵啵猜一次。爱丽丝无论啵啵猜中与否。都说“No”,你帮帮啵啵在第几次的时候就能够断定爱丽丝在说谎。问N次无法确定时输出“-1”。
    思路:一開始是连续的区间,每猜一次,连续的区间缩小。连续的区间怎么放不下K个小木块都方不下为止,就能够断定她是个小骗子。
    我是用set来做的,我想想也能够用线段树来做。用线段树每次来维护区间如今最多还能放下多少下木块,单点更新线段树,可是眼下没能写出来。希望用线段树写出该题的大牛@我,定向您请教。
    代码:

    #include <set>
    #include <map>
    #include <queue>
    #include <stack>
    #include <deque>
    #include <math.h>
    #include <string>
    #include <vector>
    #include <stdio.h>
    #include <iostream>
    #include <string.h>
    #include <algorithm>
    #include <functional>
    #define mem(a) memset(a,0,sizeof(a));
    #define mem_1(a) memset(a,-1,sizeof(a));
    #define sf(a) scanf("%d",&a)
    #define sff(a,b) scanf("%d%d",&a,&b)
    #define sfff(a,b,c) scanf("%d%d%d",&a,&b,&c)
    #define lson l,mid,i<<1
    #define rson mid+1,r,i<<1|1
    const int INF = 0x7FFFFFFF;
    const int MAXN = 1010000;
    const double PI = acos(-1.0);
    const double esp = 1e-10;
    using namespace std;
    struct node
    {
        int l,r;
    }temp;
    set<int> S;
    set<int> :: iterator it,it1,it2,it3;
    int main()
    {
        int n,k,a,m,num,num1,num2,num3;
        sfff(n,k,a);
        S.clear();
        S.insert(0);
        S.insert(n+1);
        sf(m);
        int aim = (n+1) / (a+1);
       // cout << aim << endl;
        int i = 0;
        int flag = 0;
        int Be = 0;
        int En = n+1;
        while(m--)
        {
            i++;
           sf(num);
           S.insert(num);
           it = S.find(num);
           it--;
           it1 = it;
           it++;
           it2 = it;
           it++;
           it3 = it;
           num1 = *it1;
           num2 = *it2;
           num3 = *it3;
           aim -= (num3 - num1 )/(a+1) -((num3 - num2 )/(a+1) + (num2 - num1 )/(a+1));
         // cout<< aim << endl;
           if(aim < k)
           {
               flag = 1;
               break;
           }
        }
        if(flag) printf("%d
    ",i);
        else  puts("-1");
    
    }

    代码都特别短的~~~~
  • 相关阅读:
    数组相关常见的三种错误
    JMeter连接MYSQL数据库并进行操作详解
    JMeter实现动态关联——两个接口在不同的线程组
    Android : kernel中添加虚拟文件节点
    Android O : 系统原生锁屏密码位数限制及自动检查
    Android O : DNS列表获取及IPv4/IPv6优先级修改
    Android 打印调用栈的方法
    Android TV : 系统分区配置及增加私有分区
    Android TV : Mstar平台Audio Path及声音曲线配置
    Android TV : Mstar平台 GPIO 调试
  • 原文地址:https://www.cnblogs.com/llguanli/p/8676631.html
Copyright © 2020-2023  润新知