首页 > 其他分享 >Codeforces Round #418 (Div. 2) D. An overnight dance in discotheque 题解

Codeforces Round #418 (Div. 2) D. An overnight dance in discotheque 题解

时间:2022-11-24 16:23:51浏览次数:55  
标签:p2 结点 p1 discotheque dance 题解 ll 面积 int

圆由于没有相交,之间的关系要么毫无关系,要么就是包含,所以能形成树。直接包含的就是父节点。

如果只有一组,不分前半夜后半夜的话,那么舒适度就是每棵树的根节点(深度为0)面积 - 深度为1的面积 + 深度为2的面积 ...

现在把每棵树分成2组,用DP来考虑到底这个结点是分到第1组还是第2组。

\(f[u][p1][p2]\) 表示假设结点 \(u\) 有 \(p1\) 个祖先在第1组,有 \(p2\) 个祖先在第2组时,舒适度的最大值。
显然以 \(u\) 为根节点的子树的舒适度的最大值为 \(f[u][0][0]\)。

状态计算如下

当 \(p1 \% 2 = 0\) , 即 \(u\) 的深度为偶数时,说明 \(u\) 结点放在第1组里是要加上的,当 \(p1 \% 2 = 1\) 即 \(u\) 的深度为奇数时,说明 \(u\) 结点放在第1组里是要减去的。

叶子结点(边界)的 \(f[u][p1][p2]\) 就是直接加上自己的面积与直接减去自己的面积取最大值。而非叶子结点则需要把所有子树的值先统计起来,再分别与自己的面积相加或相减。

当 \(p1=0, p2=0\) 时,说明在2组内都应加上面积。

当 \(p1=0, p2=1\) 时,说明在第1组内应加上面积,第2组内应减去面积。

当 \(p1=1, p2=0\) 时,说明在第2组内应加上面积,第1组内应减去面积。

当 \(p1=1, p2=1\) 时,说明在2组内都应减去面积。

这样计算出结点 \(u\) 的 \(4\) 种情况。

#include <iostream>
#include <algorithm>
#include <cmath>
#include <vector>

using namespace std;
using ll = long long;
using Cir = struct _circle{
    int x, y, r;
};

const double pi = acos(-1.0);
const int N = 1010;
Cir a[N];
int n, p[N];
vector<int> e[N];
ll f[N][2][2];

// 求2个圆是否有包含关系
bool contain(int i, int j){
    return (ll)(a[i].x-a[j].x)*(a[i].x-a[j].x) + (ll)(a[i].y-a[j].y)*(a[i].y-a[j].y)
         <= (ll)(a[i].r-a[j].r)*(a[i].r-a[j].r);
}

void dfs_dp(int u){
    vector<vector<ll>> g(2, vector<ll>(2, 0));

    for(int i=0; i<e[u].size(); i++){
        int j = e[u][i];
        dfs_dp(j);
        for(int x=0; x<2; x++)
            for(int y=0; y<2; y++)
                g[x][y] += f[j][x][y];
    }

    for(int i=0; i<2; i++)
        for(int j=0; j<2; j++)
            f[u][i][j] = max(
                g[i^1][j] + (ll)a[u].r*a[u].r * (i==0 ? 1 : -1),
                g[i][j^1] + (ll)a[u].r*a[u].r * (j==0 ? 1 : -1)
            );
}

int main(){
    scanf("%d", &n);
    for(int i=1; i<=n; i++){
        int x, y, r;
        scanf("%d%d%d", &x, &y, &r);
        a[i] = {x, y, r};
    }

    // 建树
    for(int i=1; i<=n; i++){
        p[i] = -1;
        for(int j=1; j<=n; j++){
            if(a[j].r > a[i].r && contain(i, j))
                if(p[i] == -1 || (a[p[i]].r > a[j].r))
                    p[i] = j;
        }
        if(p[i] != -1) e[p[i]].push_back(i);
    }

    // 可能不止一棵树
    ll res = 0;
    for(int i=1; i<=n; i++)
        if(p[i] == -1){
            dfs_dp(i);
            res += f[i][0][0];
        }

    printf("%.8lf\n", (double)res*pi);
    return 0;
}

标签:p2,结点,p1,discotheque,dance,题解,ll,面积,int
From: https://www.cnblogs.com/1v7w/p/16922248.html

相关文章

  • Unknown column 'c.name' in 'field list'问题解决
    第二次碰到这个问题,记录一下问题原因和解决;  c.name这个从tal_sss_camera_info这个表里面找不到,因为tal_sss_camera_info这个表里面没有name这个字段。  如上图......
  • luogu1253 [yLOI2018] 扶苏的问题 题解
    扶苏的问题题目题目描述给定一个长度为\(n\)的序列\(a\),要求支持如下三个操作:给定区间\([l,r]\),将区间内每个数都修改为\(x\)。给定区间\([l,r]\),将区间内每......
  • adb 坑之第三方手机管家如腾讯统一360 刷机助手导致开发出现严重问题解决方案
    adbdevices能看到设备adbshellunknownhostservice 甚至有的电脑还提示adb.exe已停止工作我的刷机精灵就是这样。端口占用根本检查不到netstat-ano|findstr"5037"这......
  • CF1452D Radio Towers 题解
    可能更好的阅读体验题目传送门题目大意在数轴上有\(n+2\)个小镇,位置为\(0,1,\dots,n,n+1\)。现在在\(1,2,\dots,n\)的小镇都有\(\dfrac{1}{2}\)的概率建设一个......
  • codeforce E - Binary Inversions题解
    题目:给你一个01串,现在你可以(或者不用)选取其中一个元素进行一次反转操作0-1,1-0;从而使得串中的逆序对个数最多。题目链接:codeforceoriginproblem思路:1.如何统计逆序对......
  • 老杜mysql34题解答
    1取得每个部门最高薪水的人员名称mysql>selectename,sal,deptnofromemp->wheresalin->(selectmax(sal)fromempgroupbydeptno);2找出哪些人......
  • 题解 LGP7914【[CSP-S 2021] 括号序列】
    solution最终括号串形如:(***(...)(...)***(...)),或者((...)(...)***(...)***),或者((...)(...)***(...)),就是说中间可有可无,两边只留一个。令\(st_{l,r}\)表示\([l,r......
  • python http.server 的测试和常见问题解决方法
    一.测试准备先分别写一个简单httpserver 和一个html文件。html文件只是引入了jquery, 后面测试用<!DOCTYPEhtml><htmllang="en"><head><metacharset="UTF-8">......
  • UVA-422 题解
    正文♦最坏时间复杂度:\(\mathcal{O}(l^3)\)由于\(1\leql\leq100\),\(\mathcal{O}(l^3)\)可以过。输入字符阵,枚举\(i,j\)指向二维数组中的字符,向八个方向暴力搜索。......
  • 题解 LGP4211【[LNOI2014]LCA】
    problem一棵树,多次给定\(l,r,z\)询问\(\sum_{l\leqi\leqr}dep_{lca(i,z)}\),允许离线,\(n\leq50000\)。solution转换:这个\(dep_u\)的定义为\(u\)到根节点的点数......