• gym101522 [小熊骑士限定]La Salle-Pui Ching Programming Challenge 培正喇沙編程挑戰賽 2017


    西瓜队(划掉),Kuma Rider久违的第一场训练,四小时瞎打.jpg

    A.水题,排序

    #include<cstdio>
    #include<iostream>
    #include<algorithm>
    #include<queue>
    #include<cstring>
    #include<string>
    #include<vector>
    #include<map>
    #include<functional>
    #include<vector>
    using namespace std;
    typedef long long ll;
    #define lowbit(i) ((i)&(-i))
    const ll maxv = 1e5 + 5;
    
    ll n,d[maxv], c[maxv];
    
    void update(ll x, ll v)
    {
        for (ll i = x; i < maxv; i+=lowbit(i))
        {
            c[i] += v;
        }
    }
    
    ll getsum(ll x)
    {
        ll sum = 0;
        for (ll i = x; i > 0; i -= lowbit(i))
        {
            sum += c[i];
        }
        return sum;
    }
    
    int main()
    {
        scanf("%lld", &n);
        for (ll i = 1; i <= n; i++)
        {
            scanf("%lld", &d[i]);
        }
        sort(d+1 , d+1 + n);
        ll ans = 0;
        for (ll i = 1; i <=  n; i++)
        {
            ll num = getsum(i-1);
            num = (i - 1) - num;
            //printf("%lld %lld
    ", i, num);
            ans += num;
            update(d[i], 1);
        }
        ans *= 2;
        printf("%lld
    ", ans);
    }
    View Code

    B.找到树的直径,倍增地跳跃计算答案

    #include<cstdio>
    #include<iostream>
    #include<algorithm>
    #include<queue>
    #include<cstring>
    #include<string>
    #include<vector>
    #include<map>
    #include<functional>
    #include<vector>
    using namespace std;
    typedef long long LL;
    
    
    int n;
    vector<int>e[500005];
    bool vis[500005];
    int Root, Tail;
    
    int BFS(int st)
    {
        for (int i = 1; i <= n; i++)vis[i] = false;
        queue<int>q;
        q.push(st);
        vis[st] = true;
        int ret = st;
        while (!q.empty())
        {
            int t = q.front(); q.pop();
            ret = t;
            for (int i = 0; i < e[t].size(); i++)
            {
                int to = e[t][i];
                if (!vis[to])
                {
                    q.push(to);
                    vis[to] = true;
                }
            }
        }
        return ret;
    }
    
    int len;
    
    void DFS(int nx, int pr, int st)
    {
        len = max(len, st);
        for (int i = 0; i < e[nx].size(); i++)
        {
            int to = e[nx][i];
            if (to != pr)
            {
                DFS(to, nx, st + 1);
            }
        }
    }
    
    int main()
    {
        scanf("%d", &n);
        for (int i = 1; i <= n - 1; i++)
        {
            int u, v;
            scanf("%d %d", &u, &v);
            e[u].push_back(v);
            e[v].push_back(u);
        }
        Root = BFS(1);
        Tail = BFS(Root);
        len = 0;
        DFS(Root, -1, 1);
        //printf("%d  %d
    ", Root, Tail);
        int ans = 0;
        int tl = 1;
        while (tl<len-1)
        {
            ans++;
            tl <<= 1;
        }
        printf("%d
    ", ans);
    
    }
    View Code

    C.水题

    #include<cstdio>
    #include<iostream>
    #include<algorithm>
    #include<queue>
    #include<cstring>
    #include<string>
    #include<vector>
    #include<map>
    using namespace std;
    
    
    
    char s[10005];
    int main()
    {
        scanf("%s", s);
        int len = strlen(s);
        int lsc = 0, pcms = 0;
        for (int i = 0; i < len-2; i++)
        {
            if (s[i] == 'L'&&s[i + 1] == 'S'&&s[i + 2] == 'C')lsc++;
        }
        for (int i = 0; i < len - 3; i++)
        {
            if (s[i] == 'P'&&s[i + 1] == 'C'&&s[i + 2] == 'M'&&s[i + 3] == 'S')pcms++;
        }
        if (pcms > lsc)printf("PCMS
    ");
        else if (pcms < lsc)printf("LSC
    ");
        else printf("Tie
    ");
    
    
    }
    View Code

    D.比赛没来得及写的题。(1953.1.1居然是星期六!!一直以为是星期日!!!)

    #include<cstdio>
    #include<cmath>
    #include<algorithm>
    #include<cstring>
    #include<string>
    #include<iostream>
    #include<map>
    #include<vector>
    #include<set>
    #include<queue>
    using namespace std;
    int days[13] = { 0, 31, 28 ,31 ,30 ,31 ,30 ,31 ,31 ,30 ,31 ,30 ,31 };
    
    int q, st, ed, day, month, gi[8], ans[404];
    
    bool isleap(int year)
    {
        return (year % 400 == 0) || ((year % 4 == 0) && (year % 100));
    }
    
    int cal(int yy, int mm, int dd)
    {
        int sum = 0;
        for (int i = 1; i < mm; i++)
        {
            sum += days[i];
            if (isleap(yy) && i == 2)
                sum++;
        }
        return sum+dd-1;
    }
    
    void cycle(int mm,int dd)
    {
        int cnt=1,now = 6;//1953/1/1是星期六
        for (int i = 1583; i <= 1583 + 399; i++)
        {
            if (mm == 2 && dd == 29 && !isleap(i))
            {
                ans[cnt++] = 0;
            }
            else
            {
                ans[cnt++] = (cal(i, mm, dd) + now - 1) % 7 + 1;
            }
            if (isleap(i))
                now = (now + 366 - 1) % 7 + 1;
            else
                now = (now + 365 - 1) % 7 + 1;
        }
    }
    
    
    int main()
    {
        scanf("%d", &q);
        while (q--)
        {
            memset(ans, 0, sizeof(ans));
            memset(gi, 0, sizeof(gi));
            scanf("%d %d %d %d", &st, &ed, &month, &day);
            cycle(month, day);
            int numed = (ed-1583 + 1) / 400;
            int numst = (st - 1583) / 400;
            for (int i = 1; i <= 400; i++)
            {
                gi[ans[i]] += (numed - numst);
            }
            int mped = ed - 1583 + 1 - numed * 400;
            int mpst = st - 1583 - numst * 400;
            for (int i = 1; i <= mpst; i++)
            {
                gi[ans[i]]--;
            }
            for (int i = 1; i <= mped; i++)
            {
                gi[ans[i]]++;
            }
            printf("%d", gi[7]);
            for (int i = 1; i <= 6; i++)
            {
                printf(" %d", gi[i]);
            }
            puts("");
        }
        return 0;
    }
    View Code

    E.还没看,待补

    F.还没写,待补

    G.还没写,待补

    H.几何板子题,两圆交点,我抄错板子错了好久quq

    #include<cstdio>
    #include<iostream>
    #include<algorithm>
    #include<queue>
    #include<cstring>
    #include<string>
    #include<vector>
    #include<cmath>
    #include<map>
    #include<functional>
    #include<vector>
    using namespace std;
    const double eps = 1e-5;
    
    struct Point
    {
        double x, y;
        Point(double _a, double _b) :x(_a), y(_b) {}
        Point() {}
    };
    
    Point intersection(const Point &u1, const Point &u2, const Point &v1, const Point &v2)
    {
        Point res = u1;
        double t = ((u1.x - v1.x)*(v1.y - v2.y) - (u1.y - v1.y)*(v1.x - v2.x)) / ((u1.x - u2.x)*(v1.y - v2.y) - (u1.y - u2.y)*(v1.x - v2.x));
        res.x += (u2.x - u1.x)*t;
        res.y += (u2.y - u1.y)*t;
        return res;
    }
    
    double dis(const Point &p1, const Point &p2)
    {
        return sqrt((p1.x - p2.x)*(p1.x - p2.x) + (p1.y - p2.y)*(p1.y - p2.y));
    }
    
    void play(const Point &c, double r, const Point &l1, const Point &l2, Point &p1, Point &p2)
    {
        Point p = c;
        p.x += l1.y - l2.y;
        p.y += l2.x - l1.x;
        p = intersection(p, c, l1, l2);
        double t = sqrt(r*r - dis(p, c)*dis(p, c)) / dis(l1, l2);
        p1.x = p.x + (l2.x - l1.x)*t;
        p1.y = p.y + (l2.y - l1.y)*t;
        p2.x = p.x - (l2.x - l1.x)*t;
        p2.y = p.y - (l2.y - l1.y)*t;
    }
    
    void play2(const Point &c1, double r1, const Point &c2, double r2, Point &p1, Point &p2)
    {
        Point u, v;
        double t = (1 + (r1*r1 - r2*r2) / dis(c1, c2) / dis(c1, c2)) / 2;
        u.x = c1.x + (c2.x - c1.x)*t;
        u.y = c1.y + (c2.y - c1.y)*t;
        v.x = u.x + c1.y - c2.y;
        v.y = u.y - c1.x + c2.x;
        play(c1, r1, u, v, p1, p2);
    }
    
    double x1, x2, r1, yy, y2, r2;
    
    int main()
    {
        cin >> x1 >> yy >> r1;
        cin >> x2 >> y2 >> r2;
        Point ans1, ans2;
        if (r1 > r2) {
            swap(x1, x2);
            swap(yy, y2);
            swap(r1, r2);
        }
        double ds = dis(Point(x1, yy), Point(x2, y2));
        if (r2 >= ds)
        {
            printf("%.6lf %.6lf
    ", x1, yy);
            return 0;
        }
        play2(Point(x1, yy), r1, Point(x2, y2), r2, ans1, ans2);
        printf("%.6lf %.6lf
    ", ans1.x, ans1.y);
        return 0;
    }
    View Code

    I.瞎搞

    #include<cstdio>
    #include<iostream>
    #include<algorithm>
    #include<queue>
    #include<cstring>
    #include<string>
    #include<vector>
    #include<cmath>
    #include<map>
    #include<functional>
    #include<vector>
    using namespace std;
    typedef long long ll;
    const double eps = 1e-5;
    ll ax[1001000];
    int main(void) {
        ll n;
        scanf("%lld", &n);
        for (int i = 0; i < n; i++) {
            scanf("%lld", &ax[i]);
        }
        if (n == 1) {
            printf("0
    ");
            return 0;
        }
        else if (n == 2) {
            printf("%lld
    ", min(abs(ax[1] - ax[0]),abs(ax[1]+ax[0])));
            return 0;
        }
        vector<ll>v;
        ll sum = 0;
        for (int i = 0; i<n - 1; i++) {
            sum += abs(ax[i + 1] - ax[i]);
            v.push_back(abs(ax[i + 1] + ax[i]) - abs(ax[i + 1] - ax[i]));
        }
        sort(v.begin(), v.end());
        if (v[0] < 0) {
            sum += v[0];
        }
        if (v[1] < 0) {
            sum += v[1];
        }
        printf("%lld
    ", sum);
    }
    View Code

    J.还没写,待补

    K.水题,四个角满足即可

    #include<cstdio>
    #include<iostream>
    #include<algorithm>
    #include<queue>
    #include<cstring>
    #include<string>
    #include<vector>
    #include<map>
    #include<functional>
    #include<vector>
    using namespace std;
    typedef long long LL;
    
    int n;
    
    int main()
    {
        int n, m, k;
        int cnt = 0;
        scanf("%d %d %d", &n, &m, &k);
        for (int i = 1; i <= k; i++)
        {
            int x, y;
            scanf("%d %d", &x, &y);
            if (x == 1 && y == m)
                cnt++;
            else if (x == 1 && y == 1)
                cnt++;
            else if (x == n&&y == 1)
                cnt++;
            else if (x == n&&y == m)
                cnt++;
        }
        int tmp = 4;
        if (n == 1 && m == 1)
            tmp = 1;
        else if (n == 1 || m == 1)
            tmp = 2;
        printf("%d
    ", tmp - cnt);
        return 0;
    }
    View Code

    L.还没写,待补

  • 相关阅读:
    关于研发核心团队建设的一些思考
    无法打开物理文件xxx.mdf操作系统错误 5:“5(拒绝访问。)” (Microsoft SQL Server,错误: 5120)的解决方法
    自适应网页设计(Responsive Web Design)
    css浮动与绝对定位小记
    WEB进度条控件
    GitHub上整理的一些工具
    雾里看花般的迷茫--货运APP
    揭秘史上最完美一步到位的搭建Andoriod开发环境
    我是如何在SQLServer中处理每天四亿三千万记录的
    货运APP产品魔力=卓越功能×情感诉求
  • 原文地址:https://www.cnblogs.com/fishdog/p/10458840.html
Copyright © 2020-2023  润新知