9-28 DAIRY

今天到现在只搞懂了第一题和第三题,并且由于不会第三题一些操作啥的还没写出来….
T1 prize
考试的时候连暴力都没写出来,但其实这道题是将题目巧妙地转化为最小生成树就是裸题了。
我讲不清楚,直接放solution:
发现其实我们询问区间 [ i , j ] 得到的是 sum [ j ]  sum [ i  1 ] 的奇偶性。
只需要知道所有 sum 之间的差的奇偶性即可通过每个 sum [ i ]  sum [ i  1 ] 得到答案。
同时我们可以通过 sum [ j ] 和 sum [i ] 之间的奇偶性及 sum [i ] 和 sum [k ] 之间的奇偶性推
出 sum [ j ] 和 sum [k ] 之间的奇偶性。
那么把所有询问看成一条边,只要两个 sum 之间互相联通,那么它们之间的奇偶性已
知。
要求知道所有 sum 之间的差的奇偶性,那就是要求所有 sum 互相连通。
那么这就变成了一个裸的最小生成树了。
【也不是特别清楚】
以下为修改正确程序

#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<iostream>
#include<algorithm>

using namespace std;

typedef long long ll;
const int N = 1500 * 1500+10;
const ll oo = 1e18+7;

int n, ans, cnt;
int f[N];
struct node{
    int u, v, w;
}e[N];

template <typename T>
T read(){
    T N(0), F(1);
    char C = getchar();
    for(; !isdigit(C); C = getchar()) if(C == '-') F = -1;
    for(; isdigit(C); C = getchar()) N = N*10 + C-48;
    return N*F;
}

int cmp(node x, node y){
    return x.w < y.w;
}

int find(int x){
    return x == f[x] ? x : f[x] = find(f[x]);
}

int main(){
    freopen("prize.in", "r", stdin);
    freopen("prize.out","w",stdout);

    n = read<int>();
    for(int i = 1; i <= n; i++){
        for(int j = 1; j <= n-i+1; j++){
            int x = read<int>();
            e[++cnt] = (node){i, i+j, x};
        }
    }   
    sort(e+1, e+cnt+1, cmp);

    for(int i = 1; i <= n+1; i++) f[i] = i;
    for(int i = 1; i <= cnt; i++){
        int u = find(e[i].u); int v = find(e[i].v);
        if(u != v){
            f[u] = v;
            ans += e[i].w;
        }
    }

    printf("%d\n", ans);
    return 0;
}

T2 star
考试的时候暴力都没对,样例中点编号对应的就是颜色号,我就没有仔细些这个地方,被坑了。。
现在只改好了30分暴力,满分做法还是不会,没完全理解代码。

T3 bodybuilding
【吐槽】题目真长。
听说只要判断每个点连接的边删去后的情况就可以水过去,因为数据很水…但其实是一个正确性和时限性都错误的做法×
正确:
观察我们建出来的只由最短路构成的新图,可以发现这是个 DAG【p.s.有向无环图】。
可以发现,一个点的所有子节点在 DAG 上的公共祖先即为所有删除后能时当前点不可达
的点。
这很显然可以描述成一个树形关系:如果删除 x 会使 y 不可达,删除 y 会使 z 不可达,
那么删除 x 一定会使 z 不可达。
那么一个节点的父亲就一定会是它的所有子节点在 DAG 上的最近公共祖先。
考虑用拓扑排序逐步构建这棵树,在这个过程中使用倍增(或 LCT【p.s.link-cut-tree】)来维护 LCA【p.s.最近公共祖先】。
那么最后建出来的树中,子树大小最大的一个不为根结点的点的子树大小即为答案。
总之我还写不出这个程序,要晕死了。
今天垫底了。。10分..

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值