srm 540

http://mlz000.github.io/2015/07/16/srm-540/

250


Description:

给定 一个数组B,和一个”+-“组成的字符数组,求有多少种A数组。

B数组是由A数组相邻的两个数和符号运算后的结果。

Solution

显然如果第一个数固定,整个A数组就固定下来了,所以就是求第一个数有多少种可能。我们发现给定的是A1+x2,A2?A3...这种形式。于是我们可以通过连续的运算得到A1和其他Ai的关系,取上下界即可。

Code

#include <bits/stdc++.h>
using namespace std;
#define pb push_back
#define mp make_pair
#define F first
#define S second
typedef long long LL;
typedef pair<int, int> pii;
vector<LL> B(51);
struct ImportantSequence {
    int getCount(vector <int> b, string operators) {
        int n = b.size();
        for (int i = 0; i < n; ++i) B[i] = b[i];
        LL L = 1, R = 1e18, now = -1, last = 0;
        for (int i = 0; i < n; ++i) {
            if (now == 1)   B[i] = last - B[i];
            else B[i] += last;
            now = (now == 1) ? (operators[i] == ‘+‘ ? -1 : 1) : (operators[i] == ‘+‘ ? 1 : -1);
            if (now == 1)   R = min(R, (LL)B[i] - 1);
            else L = max(L, (LL)B[i] + 1);
            last = B[i];
        }
        return L > R ? 0 : R - L > 2e9 ? -1 : R - L + 1;
    }
};

550


Description

N 个栅栏按照标号0,1,...,N?1围成一个圈,从0号栅栏开始染色。每一种颜色用(R,G,B)三原色表示,并且0≤R<maxR,0≤G<maxG,0≤B<maxB。规定相邻的两个栅栏颜色必须符合以下的颜色过渡条件:

  • 两种颜色的对应R,G,B差值全部都小于等于d2
  • 两种颜色的对应R,G,B差值至少有一个大于等于d1

将0号栅栏染色为(startR,startG,startB), 然后按编号逐一染色,每次选择颜色时都是考虑前一个栅栏的颜色,随机等概率从所有符合过渡条件的颜色中挑选。问当完成N?1号栅栏的染色时,N?1与0之间不符合颜色过渡条件的概率是多少。

数据范围为50

Solution

容易想到dp[i][r][g][b],但是暴力转移的复杂度显然是不能接受的,接下来很容易想到三维前缀和维护转移,不妨反向考虑第N?1不合理的情况,看有多少概率最后可以变成初始状态即可。复杂度O(n?maxR?maxG?maxB)。

Code

#include <bits/stdc++.h>
using namespace std;
#define pb push_back
#define mp make_pair
#define F first
#define S second
typedef long long LL;
typedef pair<int, int> pii;
const int N = 51;
double dp[41][N][N][N], _[N], sum[N][N][N];
struct RandomColoring {
    double getProbability(int n, int maxR, int maxG, int maxB, int startR, int startG, int startB, int d1, int d2) {
        for (int r = 0; r < maxR; ++r)
            for (int g = 0; g < maxG; ++g)
                for (int b = 0; b < maxB; ++b) {
                    int t1 = abs(r - startR), t2 = abs(g - startG), t3 = abs(b - startB);
                    if (!(t1 <= d2 && t2 <= d2 && t3 <= d2 && (t1 >= d1 || t2 >= d1 || t3 >= d1)))  dp[n - 1][r][g][b] = 1.0;
                }
        for (int i = n - 2; i >= 0; --i) {
            for (int r = 1; r <= maxR; ++r)
                for (int g = 1; g <= maxG; ++g)
                    for (int b = 1; b <= maxB; ++b)
                        sum[r][g][b] = dp[i + 1][r - 1][g - 1][b - 1] + sum[r - 1][g][b] + sum[r][g - 1][b] + sum[r][g][b - 1] - sum[r - 1][g - 1][b] - sum[r][g - 1][b - 1] - sum[r - 1][g][b - 1] + sum[r - 1][g - 1][b - 1];
            for (int r = 0; r < maxR; ++r)
                for (int g = 0; g < maxG; ++g)
                    for (int b = 0; b < maxB; ++b) {
                        double &t = dp[i][r][g][b];
                        int r1 = max(r - d2, 0), r2 = min(r + d2 + 1, maxR);
                        int g1 = max(g - d2, 0), g2 = min(g + d2 + 1, maxG);
                        int b1 = max(b - d2, 0), b2 = min(b + d2 + 1, maxB);
                        int tot = (r2 - r1) * (g2 - g1) * (b2 - b1);
                        t = sum[r2][g2][b2] - sum[r1][g2][b2] - sum[r2][g1][b2] - sum[r2][g2][b1] + sum[r1][g1][b2] + sum[r2][g1][b1] + sum[r1][g2][b1] - sum[r1][g1][b1];
                        if (d1) {
                            r1 = max(r - d1 + 1, 0), r2 = min(r + d1, maxR);
                            g1 = max(g - d1 + 1, 0), g2 = min(g + d1, maxG);
                            b1 = max(b - d1 + 1, 0), b2 = min(b + d1, maxB);
                            tot -= (r2 - r1) * (g2 - g1) * (b2 - b1);
                            t -= sum[r2][g2][b2] - sum[r1][g2][b2] - sum[r2][g1][b2] - sum[r2][g2][b1] + sum[r1][g1][b2] + sum[r2][g1][b1] + sum[r1][g2][b1] - sum[r1][g1][b1];
                        }
                        if (tot)    t /= tot;
                    }
        }
        return dp[0][startR][startG][startB];
    }
};

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

时间: 2024-10-25 01:28:25

srm 540的相关文章

汕头市队赛 SRM 09 A 撕书

A 撕书I-3 SRM 09 背景&&描述 琉璃在撕书.     书总共有n页,都悬浮在数轴上,第i页的位置为,上面写着一个数字.     琉璃从右往左撕书.假如看到了第i页,就把在第i页左边,且与之距离<=的书都撕掉.(第i页本身不撕)     夜子为了尽量地保全魔法书,决定偷偷在琉璃开始撕之前,增加一页.增加的这一页必须在所有书页的右边,数字随意.     夜子想知道,最少会有多少页书被撕毁. 输入格式 第一行一个整数n,表示书页数. 接下来n行,第i行的俩整数分别为和. 输出格

汕头市队赛 SRM 09 B 撕书

B 撕书II-3 SRM 09 背景&&描述 琉璃手头有一黑一白两本魔法书,一本是<缟玛瑙的不在证明>,另一本是<白色相簿1.5>     传说同时打开这两本书会有奇怪的事情发生.     琉璃打开一看,果然非常奇怪:两本书上都各自写着一个正整数(可能他买到盗版了),分别是a和b.     试图撕书的汀想借过来看看,但琉璃只告诉了他这俩数加起来的值x和异或起来的值y.     汀发现有很多种(a,b)满足琉璃告诉他的信息...你能帮他算出来有多少种吗? 输入格式 两

TopCoder SRM 625 Incrementing Sequence 题解

本题就是给出一个数k和一个数组,包括N个元素,通过每次增加数组中的一个数的操作,最后需要得到1 - N的一个序列,不用排序. 可以从暴力法入手,然后优化. 这里利用hash表进行优化,最终得到时间效率是O(n*n)的算法,而且常数项应该很低,速度还挺快的. 思路: 1 如果数组A[i]在1 -N 范围内,就利用bool B[]记录,这个数已经找到了: 2 如果A[i]的值之前已经找到了,那么就增加k操作,得到新的值A[i]+k,看这个值是否找到了,如果没找到,就使用B记录,如果之前已经找到了,那

汕头市队赛 SRM 06 C 秀恩爱

C 秀恩爱 SRM 06 背景&&描述 KPM坐在直升机上俯瞰小渔村景象. 渔村可看作二维平面,密密麻麻地到处都是单身狗,KPM当前所在坐标为(sx,sy). KPM的后宫团们自发地聚集在一起为他送行,从空中看,后宫团形成了一个多边形. 当然了KPM是不在那个多边形内的. 直升机突然开始原地转圈,后宫团们因为想看着KPM的正脸,所以也跟着以KPM所在坐标为中心旋转. 后宫团所经之处单身狗尸横遍野.赶来救治伤员的医护人员想知道,多边形扫过的面积是多少. 注意,本题不保证横坐标互不相同.纵坐标

[TC SRM 697 div1 lev1] DivisibleSetDiv1

Tutorial:https://apps.topcoder.com/wiki/display/tc/SRM+697#DivisibleSetDiv1 Note:证明过程值得一看. 主要内容:寻找[x1,x2,...,xn]使得满足bi * xi >= S - xi,其中S = x1 + x2 + ... + xn.

Topcoder SRM 刷题企划

1.本文用来记录自己在Topcoder上刷过的题目.不过重点是记录心得,记录自己的思路问题. 2.刷的题目全部都是Div2 1000分的题目,小概率会去做Div1 的进阶题. 3.基本上自己写出来的题目都不会另开一篇来写. 4.Topcoder使用: [教程1][教程2] SRM 508 Div2 YetAnotherORProblem (Div2 Hard) 题意:构造长度为N,各元素上限为R的序列,并且满足$A_1+A_2+\cdots+A_n=A_1|A_2|\cdots|A_n$,求方案

SRM 513 2 1000CutTheNumbers(状态压缩)

SRM 513 2 1000CutTheNumbers Problem Statement Manao has a board filled with digits represented as String[] board. The j-th character of the i-th element of board represents the digit written in cell in row i, column j of the board. The rows are numbe

Topcoder SRM 643 Div1 250&lt;peter_pan&gt;

Topcoder SRM 643 Div1 250 Problem 给一个整数N,再给一个vector<long long>v; N可以表示成若干个素数的乘积,N=p0*p1*p2*......*pn,我们假设p0,p1,...,pn是单调不降的,那么v里存储的是下标为偶数 的N的质因数p0,p2,p4,...,p(2k).现在要求写一个程序,返回一个vector<long long>ans; ans里存储的是p0,p1,p2,...,pn. Limits Time Limit(m

TopCoder SRM 634 Div.2[ABC]

TopCoder SRM 634 Div.2[ABC] ACM 题目地址: TopCoder SRM 634 赛后做的,感觉现场肯定做不出来Orz,简直不能多说. Level One-MountainRanges[水题] 题意: 问序列中有几个完全大于旁边的峰. 分析: 傻逼题,不多说. 代码: /* * Author: illuz <iilluzen[at]gmail.com> * File: one.cpp * Create Date: 2014-09-26 21:01:23 * Desc