首页 > 其他 > 详细

2019-2020 ICPC, Asia Jakarta Regional Contest (Online Mirror, ICPC Rules, Teams Preferred)

时间:2020-02-17 12:11:09      阅读:59      评论:0      收藏:0      [点我收藏+]

题目链接:https://codeforces.com/contest/1252

A - Copying Homework

题意:给一个[1,n]的排列A,构造另一个排列B,到它的距离最大。两个排列的距离,是每个对应位置的元素的差的绝对值之和。

题解:画在数轴上面很容易发现,例如n=6时,[1,2]这一段只会最多经过1次,[2,3]这一段只会最多经过2次,[3,4]这一段只会最多经过3次……然后看一下好像和奇偶性也没什么关系。而Bi=n+1-Ai恰好是上面的最大值的一种构造。

C - Even Path

题意:给一个数字maze,它的生成规则是A[i][j]=R[i]+C[j],给出R数组和C数组。定义“偶数路径”为一条所有点权都是偶数的路径。每次询问两个点,保证起点和终点必为偶数格子,回答是否存在至少一条偶数路径连接他们。

技术分享图片

题解:并查集?比上一题还水?但是数据范围是蛮大的,不能这样暴力。考虑相邻的两格是否能互相到达,由于对应位置由相同的C[j]贡献,所以当C[j]是奇数时,两个同为奇数的R[i]与R[i+1]就同为偶数,当C[j]是偶数时,两个同为偶数的R[i]与R[i+1]也同为偶数。假如把偶数格子染黑色,把奇数格子染白色,那么从上面的结果就感觉到相邻两行要么就是相同颜色要么就是相反颜色。看看上面这个图貌似是这个意思。所以得到一个结论,假如从起点所在的行和终点所在的行之间存在某次奇偶交替,则无解,列同理。假如不存在交替是否一定有解?答案显然是肯定的(因为起点和终点必为偶数格子,而行和列都没发生奇偶交替,所以随便走过去都可以)。

所以做两个前缀和表示奇偶交替的次数,然后验证这中间没有奇偶交替即可。

注意:是要求中间的奇偶交替的次数,而不是奇数的次数,所以是求出奇偶性之后再做一次“差分”,然后统计“差分”的前缀和。注意这里确实不需要-1。显然“差分”的前缀和并不是原数组,因为这里的“差分”只是代表奇偶性翻转。

int r[100005];
int R[100005];
int c[100005];
int C[100005];

void test_case() {
    int n, q;
    scanf("%d%d", &n, &q);
    for(int i = 1; i <= n; ++i) {
        scanf("%d", &r[i]);
        r[i] = r[i] & 1;
        R[i] = (r[i] != r[i - 1]);
        R[i] += R[i - 1];
    }
    for(int i = 1; i <= n; ++i) {
        scanf("%d", &c[i]);
        c[i] = c[i] & 1;
        C[i] = (c[i] != c[i - 1]);
        C[i] += C[i - 1];
    }
    while(q--) {
        int r1, c1, r2, c2;
        scanf("%d%d%d%d", &r1, &c1, &r2, &c2);
        if(r1 > r2)
            swap(r1, r2);
        if(c1 > c2)
            swap(c1, c2);
        if(R[r2] - R[r1] == 0 && C[c2] - C[c1] == 0)
            puts("YES");
        else
            puts("NO");
    }
}

*H - Twin Buildings

题意:要在 \(n\) 块长方形地上造两栋形状一样(长和宽一样,可以旋转90°)的建筑物,建筑物可以建在两块不同的地上,或者同一块地上。为了风水好,他们的边必须与地面的边平行。求一栋建筑的最大的面积。

题解:首先,答案不少于每块地的面积的一半,这就是两栋建在同一块地上的最大值。然后,对于某块地而言,要建一个最大的建筑物,应该就是拿另一块地和这块地取交或者旋转90°取交的最大值。可惜不能 \(n^2\) 搞。一个很显然的思路,就是把每块地和它的旋转90°的结果放进一个数据结构里,这个数据结构可以回答某块地作为A时,这个数据结构中的地作为B时的最大的面积。然后轮到这块地做A的时候,就从数据结构里面暂时移除它和它的旋转90°。所有比A长的矩形,答案就取A的长和AB的宽的最小值,所以就在比A长的矩形中求最大的宽。所有比A宽的矩形,答案就取A的宽和AB的长的最小值,所以就在比A宽的矩形中求最大的长。剩下的矩形一定是长比A小,宽也比A小的,答案就是B的面积的两倍。前面两种情况可以用平衡树或者权值线段树维护。对于第三种情况,可以直接跳过,等待A和B交换位置的时候就会被统计。

2019-2020 ICPC, Asia Jakarta Regional Contest (Online Mirror, ICPC Rules, Teams Preferred)

原文:https://www.cnblogs.com/KisekiPurin2019/p/12320770.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!