计蒜之道 初赛 第三场 题解

腾讯手机地图

腾讯手机地图的定位功能用到了用户手机的多种信号,这其中有的信号的作用范围近,有的信号作用的范围则远一些。有的信号相对于用户在不同的方位强度是不同的,有的则是在任何一个方向上信号强度都一致的。

已知用户面向北方拿着自己的手机,在不同方位的各种信号覆盖区域可以被抽象成以用户为圆心的一系列扇形。已知每个扇形的半径 r,和每个扇形的两条边相对于正东方向的夹角度数。每个信号覆盖区域抽象出的扇形都可以通过从第一条边逆时针旋转到第二条边画出。

<img src="http://res.jisuanke.com/img/nanti/429.png" <="" a="" style="box-sizing: border-box; border: 0px;
vertical-align: middle; display: block; max-width: 100%; height: auto; margin: auto;">

请计算一下,用户手机所有信号覆盖到的区域的总面积。

输入格式

第一行输入一个整数 T (1 ≤ T ≤ 20),表示数据组数。

接下来一共 T 组数据,每组数据第一行输入一个整数 n (1 ≤ n ≤ 104),表示各种信号可以抽象出的不同扇形的总个数。接下来输入 n 行,每行 3 个整数表示扇形半径 r (1 ≤ r ≤ 105)、扇形第一条边与正东方向的夹角
α、扇形第二条边与正东方向的夹角 β (-90 ≤ α ≤ β < 270)。

输出格式

输出 T 行,每行一个非负浮点数,表示用户手机所有信号覆盖到的区域的范围的总面积。

每组输出与标准答案绝对误差在 10-3 内均认为是正确的。

样例1

输入:

1
4
2 -30 32
3 20 81
3 121 160
2 141 201

输出:

11.030

看题目,本来以为是要用线段树做的,最后,发现,数据很小,直接用数组暴力存下区间最大值就可以了。不过这里卡double的精度,要先/360才行

#define N 205
#define M 100005
#define maxn 205
#define MOD 1000000000000000007
int n,T,rr,aa,bb;
ll maxx[400];
int main()
{
    while(S(T)!=EOF)
    {
        while(T--){
            S(n);
            memset(maxx,0,sizeof(maxx));
            FI(n){
                S(rr);S2(aa,bb);aa+=90;bb+=90;
                for(int j = aa;j<bb;j++){
                    maxx[j] = max(maxx[j],(ll)rr);
                }
            }
            double sum = 0;
            ll sa = maxx[0];
            int ss = 0;
            for(int i =0;i<=360;i++){
                if(maxx[i] == sa)continue;
                sum +=  (double)sa / 360.0 * (double)sa * acos(-1) * (i - ss);
                sa = maxx[i],ss = i;
            }
            printf("%.3f\n",sum);
        }
    }
    return 0;
}

商品推荐走马灯(简单)

有一个新的研究显示,人在看见一系列的图片时,如果它们的排列有一定的轴对称性,则会更为觉得赏心悦目。根据这个特性,作为阿里巴巴旗下重要的电子商务交易平台的淘宝,希望了解商品推荐的图片走马灯现在的赏心悦目情况,以便判断是否之后需要做出调整。例如,当价值分别为 1,2,1 的商品图片排列在一起的时候,人们可以看到它的所有非空区间 [1]、[2]、[1]、[1,2]、[2,1]、[1,2,1] 中有四个是轴对称的,所以这组图片的展示价值是所有轴对称的非空区间的所有价值总和 1 + 2 + 1
+ (1 + 2 + 1) = 8。

<img src="http://res.jisuanke.com/img/nanti/433.png" <="" a="" style="box-sizing: border-box; border: 0px;
vertical-align: middle; display: block; max-width: 100%; height: auto; margin: auto;">

对于现在淘宝商品推荐的图片走马灯序列里的图片,我们从左到右将它们自 1 开始依次递增编号。现在我们希望了解,对于每次由两个编号 li, ri 组成的第i次询问,若将
li 到 ri 的这些图片选出进行展示,他们的展示价值是多少。

输入格式

第一行输入两个整数 n (1 ≤ n ≤ 105), m (1 ≤ m ≤ 105),分别代表图片总数和询问次数。

第二行一共 n 个整数 ci (-100 ≤ ci ≤
100),表示从编号 1 到编号 n 的图片价值。

接下来 m 行,每行两个整数 li, ri (1
≤ li ≤ ri ≤ n),表示一组询问 [li,
ri]。

输入数据保证询问区间合法,图片价值 ci 满足 -100 ≤ ci ≤
100。

对于简单版本,1 ≤ n, m ≤ 300;

对于中等版本,1 ≤ n ≤ 20000,1 ≤ m ≤ 3000;

对于困难版本,1 ≤ n, m ≤ 100000。

输出格式

一共输出 m 行,每行输出一组询问对应的展示价值。

样例1

输入:

5 2
1 1 0 1 0
2 4
1 2

输出:

4
4

区间dp,dp[i][j]表示是否是回文串,dp[i][j] 转移到dp[i+1][j-1],就可以了。总复杂度达到o(n*n),困难无法过,希望高手指点下。

#define N 505
#define M 100005
#define maxn 205
#define MOD 1000000000000000007
int n,m,l,r;
ll sum[N][N],pri[N],all;
bool dp[N][N];
int main()
{
    while(S2(n,m)!=EOF)
    {
        FI(n) scanf("%lld",&pri[i]);
        for(int len = 0;len<n;len++){
            for(int i =0;i<n && i + len < n;i++){
                int j = i + len;
                if(i == j){
                    dp[i][j] = true;
                    sum[i][j] = pri[i];
                }
                else if(i + 1 == j){
                    if(pri[i] == pri[j]){
                        dp[i][j] = true;
                        sum[i][j] = pri[i] + pri[i+1];
                    }
                    else {
                        dp[i][j] = false;
                        sum[i][j] = 0;
                    }
                }
                else {
                    if(pri[i] == pri[j] && dp[i+1][j-1]){
                        dp[i][j] = true;
                        sum[i][j] = pri[i] + pri[j] + sum[i+1][j-1];
                    }
                    else {
                        dp[i][j] = false;
                        sum[i][j] = 0;
                    }
                }
            }
        }
        while(m--){
            S2(l,r);all = 0;l--,r--;
            for(int i = l;i<=r;i++){
                for(int j = i;j<=r;j++){
                    if(dp[i][j])
                    {
                        all+= sum[i][j];
                    }
                }
            }
            printf("%lld\n",all);
        }
    }
    return 0;
}

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-09-28 19:33:09

计蒜之道 初赛 第三场 题解的相关文章

计蒜之道 初赛 第三场--腾讯手机地图

题目大意是: 在坐标系里给你n个扇形的半径.起始,结束度数,计算扇形覆盖的面积. 如图: (因为现在无法提交了,所以无法验证代码,若有错的地方请指正) 这题首先要做的是对边的度数排序,不过是对所有度数排序,最开始想的时候只对扇形开始边的那个度数排序,写了半天一堆if else,后来突然想到了用所有边的度数排序. 首先需要对输进去每每条边度数进行处理,我用的是这个结构体 struct DU { int du;//度数 int r;//当前度数所对应的半径 bool if_end;//是否为扇形的结

2018 计蒜之道 初赛 第三场

A. 贝壳找房性价比 题解:按s排序后,斜率最大的点必定在相邻的两点之间. #pragma warning(disable:4996) #include<queue> #include<map> #include<string> #include<cstdio> #include<cstring> #include<iostream> #include<algorithm> #define ll long long #de

2017 计蒜之道 初赛 第三场 D. 腾讯狼人杀 (点边都带权的最大密度子图)

点边都带权的最大密度子图,且会有必须选的点. 写到一半没保存实验室断电,气炸.明天补详细题解. #include<bits/stdc++.h> using namespace std; const double eps = 1e-7; const int INF = 0x3f3f3f3f; const int MAXN= 405;//点数的最大值 const int MAXM= 1e6 + 10;//边数的最大值 #define captype double struct Edge{ int

2017 计蒜之道 初赛 第五场 UCloud 的安全秘钥(中等)

每个 UCloud 用户会构造一个由数字序列组成的秘钥,用于对服务器进行各种操作.作为一家安全可信的云计算平台,秘钥的安全性至关重要.因此,UCloud 每年会对用户的秘钥进行安全性评估,具体的评估方法如下: 首先,定义两个由数字序列组成的秘钥 aa 和 bb近似匹配(\approx≈) 的关系.aa 和 bb 近似匹配当且仅当同时满足以下两个条件: |a|=|b|∣a∣=∣b∣,即 aa 串和 bb 串长度相等. 对于每种数字 cc,cc 在 aa 中出现的次数等于cc 在 bb 中出现的次数

2018 计蒜之道 初赛 第五场

这次的比赛没有现场打,而是等到了今天才来补. 主要是因为那时候和HHHOJ上的比赛冲突了,所以就没写. 这次前三题的难度都比较低,但是就是一个T4要莫比乌斯反演.又是不可食用的. 好了我们开始看题. A. 贝壳找房搬家 这道题刚开始看的时候没看懂题意,觉得T1就是这种立体几何的题目,有种想死的感觉. 因为我认为这个方块可以不规则地想怎么放就怎么放的,其实题目中有一句话: 我们可以把这堆箱子看成一个\(x \times y \times z\) 的长方体. 什么?刚开始只能是长方体吗?好吧好像还是

2017 计蒜之道 初赛 第五场 D. UCloud 的安全秘钥(困难)

小数据打表,大数据暴力. 导致超时的主要原因是$m$小的询问次数太多,可以把$m≤10$的答案直接暴力打表存起来,$m>10$的用$C$题的方法即可. #include <iostream> #include <cstdio> #include <cstring> #include <string> #include <algorithm> #include <vector> #include <queue> #in

2017 计蒜之道 初赛 第五场 B. UCloud 的安全秘钥(简单)

暴力. 暴力枚举$S$串的每一个长度为$m$的子串,排序判断即可. #include <iostream> #include <cstdio> #include <cstring> #include <string> #include <algorithm> #include <vector> #include <queue> #include <stack> #include <map> #inc

2017 计蒜之道 初赛 第五场 C. UCloud 的安全秘钥(中等)

暴力. $O(m*n)$的算法可以通过此题,每次询问$O(m)$扫S数组,统计不同数字的个数,每次移动最多只会变化两个数字,如果不同数字个数为$0$,那么答案加$1$. #include <iostream> #include <cstdio> #include <cstring> #include <string> #include <algorithm> #include <vector> #include <queue&g

2017 计蒜之道 初赛 第五场 A. UCloud 机房的网络搭建

贪心. 从大到小排序之后进行模拟,注意$n=1$和$n=0$的情况. #include <iostream> #include <cstdio> #include <cstring> #include <string> #include <algorithm> #include <vector> #include <queue> #include <stack> #include <map> #in