2021杭电多校03

1011 ( Segment Tree with Pruning )

过题:3
排名:230
记忆化、模拟。
CY

#include <bits/stdc++.h>
typedef long long ll;
std::map < ll, ll > mp;
ll k, n;
ll calc(ll len)
{
    if (len <= k) return 1;
    if (mp.find(len) != mp.end()) return mp[len];
    ll mid = len >> 1;
    ll ans = calc(mid) + calc(len - mid) + 1;
    return mp[len] = ans;
}
int main()
{
    int t; scanf("%d", &t);
    while (t--)
    {
        mp.clear();
        scanf("%lld%lld", &n, &k);
        printf("%lld\n", calc(n));
    }
    return 0;
}

1007 ( Photoshop Layers )

WYX

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int MAXN = 1e5 + 10;
const int inf = 0x3f3f3f3f;
char s[MAXN], temp[MAXN];
ll sum[MAXN][3], sum1[MAXN];
int f(char a, char b)
{
    int a1, b1;
    if (a <= '9' && a >= '0')
        a1 = a - '0';
    else
        a1 = a - 'A' + 10;
    if (b <= '9' && b >= '0')
        b1 = b - '0';
    else
        b1 = b - 'A' + 10;
    return 16 * a1 + b1;
}
int f1(int c)
{
    int cnt = 0;
    while (c)
    {
        int q = c % 16;
        c /= 16;
        if (q <= 9)
            temp[cnt++] = '0' + q;
        else
            temp[cnt++] = 'A' + q - 10;
    }
    while (cnt < 2)
        temp[cnt++] = '0';
    reverse(temp, temp + cnt);
    return cnt;
}
int main()
{
    int t;
    scanf("%d", &t);
    while (t--)
    {
        int n, q;
        scanf("%d%d", &n, &q);
        for (int i = 1; i <= n; i++)
        {
            int x;
            scanf("%d%s", &x, s);
            sum1[i] = sum1[i - 1];
            if (x == 1)
            {
                sum1[i]++;
                for (int j = 0; j < 3; j++)
                    sum[i][j] = f(s[j * 2], s[2 * j + 1]);
            }
            else
            {
                for (int j = 0; j < 3; j++)
                    sum[i][j] = sum[i - 1][j] + f(s[j * 2], s[2 * j + 1]);
            }
        }
        while (q--)
        {
            int l, r;
            scanf("%d%d", &l, &r);
            if (sum1[r] - sum1[l - 1] != 0)
            {
                int cnt = 0;
                for (int j = 0; j < 3; j++)
                {
                    int len = f1(min(sum[r][j], 1ll * 255));
                    for (int k = 0; k < len; ++k)
                        s[cnt++] = temp[k];
                }
                printf("%s\n", s);
            }
            else
            {
                int cnt = 0;
                for (int j = 0; j < 3; j++)
                {
                    int len = f1(min(sum[r][j] - sum[l - 1][j], 1ll * 255));
                    for (int k = 0; k < len; ++k)
                        s[cnt++] = temp[k];
                }
                printf("%s\n", s);
            }
        }
    }
    return 0;
}

1004 ( Game on Plane )

WYX

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int maxn=1e5+10;
typedef std::pair < int, int > pll;
std::map < pll, int > mp;
ll gcd(ll a, ll b)
{
    if (b == 0) return a;
    else return gcd(b, a % b);
}
int aa[maxn];
int main()
{
    int t; scanf("%d", &t);
    while (t--)
    {
        int n; scanf("%d", &n);
        mp.clear();
        int cnt=0;
        for (int i = 1; i <= n; ++i)
        {
            int a, b, c, d; scanf("%d%d%d%d", &a, &b, &c, &d);
            int gcdx = gcd(a - c, b - d);
            int u = (a - c) / gcdx, v = (b - d) / gcdx;
            if (u < 0) u *= -1, v *= -1;
            if(!mp[{u, v}]) {
                mp[{u, v}]=++cnt;
                aa[cnt]=0;
            }
            aa[mp[{u,v}]]++;
        }
        sort(aa+1,aa+1+cnt);
        int l=1;
        int ans = 0;
        bool f = true;
        while (f)
        {
            int cnt1 = 0; f = false;
            for (int i=l;i<=cnt;i++)
            {
                ++cnt1; f = true;
                if (cnt1 != 1) ++ans;
                printf("%d\n", ans);
                aa[i]--;
                if(aa[i]==0) l++;
            }
        }
    }
    return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值