• NowCoder Contest 894


    牛客练习赛46。比cf div2稍难一些。题目区分度倒是很高。

    题目链接:https://ac.nowcoder.com/acm/contest/894#question


    A:

    一看就知道两个小半圆半径相等时满足题意。

     1 #include <bits/stdc++.h>
     2 #define ll long long
     3 #define pb push_back
     4 #define mp make_pair
     5 #define sot(a,b) sort(a+1,a+1+b)
     6 #define rep(i,a,b) for (int i=a;i<=b;i++)
     7 #define eps 1e-8
     8 #define int_inf (1<<30)-1
     9 #define ll_inf (1LL<<62)-1
    10 #define lson curPos<<1
    11 #define rson curPos<<1|1
    12 
    13 using namespace std;
    14 
    15 double a;
    16 const double pi = acos(-1.0);
    17 
    18 int main()
    19 {
    20     scanf("%lf", &a);
    21     printf("%.3f
    ", 2.0 * sqrt(a / pi));
    22     return 0;
    23 }
    View Code

    B:

    设sum_a为a的前缀和,sum_b为b的前缀和。则以(x1,y1)为左上角,以(x2,y2)为右下角的矩阵的权值为(sum_a[x2]-sum_a[x1-1])*(sum_b[y2]-sum_b[y1-1]),其中要满足x1<=x2,y1<=y2。x1,x2的选择与y1,y2的选择相互独立。可以预处理所有y1,y2的组合,然后排序。接下来枚举x1,x2,对y二分即可。时间复杂度O(n^2*log(m^2))

     1 #include <bits/stdc++.h>
     2 #define ll long long
     3 #define pb push_back
     4 #define mp make_pair
     5 #define sot(a,b) sort(a+1,a+1+b)
     6 #define rep(i,a,b) for (int i=a;i<=b;i++)
     7 #define eps 1e-8
     8 #define int_inf (1<<30)-1
     9 #define ll_inf (1LL<<62)-1
    10 #define lson curPos<<1
    11 #define rson curPos<<1|1
    12 
    13 using namespace std;
    14 
    15 const int maxn = 1e3 + 10;
    16 int n, m;
    17 ll l, r, a[maxn], b[maxn], c[maxn * maxn], ans = 0; //a b是a b数组前缀和
    18 
    19 int main()
    20 {
    21     scanf("%d%d%lld%lld", &n, &m, &l, &r);
    22     for (int i = 1; i <= n; i++)
    23     {
    24         ll x; scanf("%lld", &x);
    25         a[i] = a[i - 1] + x;
    26     }
    27     for (int i = 1; i <= m; i++)
    28     {
    29         ll x; scanf("%lld", &x);
    30         b[i] = b[i - 1] + x;
    31     }
    32     int cnt = 0;
    33     for (int i = 0; i < m; i++) //不同区间的b数组之和
    34     {
    35         for (int j = i + 1; j <= m; j++)
    36             c[++cnt] = b[j] - b[i];
    37     }
    38     sort(c + 1, c + 1 + cnt);
    39     for (int i = 0; i < n; i++)
    40         for (int j = i + 1; j <= n; j++) //枚举a数组区间
    41         {
    42             ll x = a[j] - a[i], u = (l - 1) / x + 1, v = r / x;
    43             ll lab1 = lower_bound(c + 1, c + 1 + cnt, u) - c;
    44             ll lab2 = upper_bound(c + 1, c + 1 + cnt, v) - c;
    45             ans += lab2 - lab1;
    46         }
    47     printf("%lld
    ", ans);
    48     return 0;
    49 }
    View Code

    C:

    推起来有点麻烦的一道概率题。不妨设a[i]为进行了i轮游戏黑球个数的期望,显然a[0]=n。a[i+1]=

    化简得a[i+1]=(a[i]+p)*(n+m)/(n+m+1),可用矩阵快速幂求解。也可以接着推下去:

    a[0]=n

    a[1]=s*n+p*s=n*s+p*s

    a[2]=s*a[1]+p*s=n*s^2+p*s^2+p*s

    a[3]=s*a[2]+p*s=n*s^3+p*s^3+p*s^2+p*s

    不难得出a[k]=n*s^k+p*(s^1+s^2+...+s^k) 

     1 /* basic header */
     2 #include <bits/stdc++.h>
     3 /* define */
     4 #define ll long long
     5 #define dou double
     6 #define pb emplace_back
     7 #define mp make_pair
     8 #define sot(a,b) sort(a+1,a+1+b)
     9 #define rep1(i,a,b) for(int i=a;i<=b;++i)
    10 #define rep0(i,a,b) for(int i=a;i<b;++i)
    11 #define eps 1e-8
    12 #define int_inf 0x3f3f3f3f
    13 #define ll_inf 0x7f7f7f7f7f7f7f7f
    14 #define lson curPos<<1
    15 #define rson curPos<<1|1
    16 /* namespace */
    17 using namespace std;
    18 /* header end */
    19 
    20 const int mod = 1e9 + 7;
    21 int n, m, k, a, b;
    22 
    23 ll qp(ll a, ll b)
    24 {
    25     ll ret = 1;
    26     while (b)
    27     {
    28         if (b & 1) ret = ret * a % mod;
    29         a = a * a % mod;
    30         b >>= 1;
    31     }
    32     return ret;
    33 }
    34 
    35 int main()
    36 {
    37     scanf("%d%d%d%d%d", &n, &m, &k, &a, &b);
    38     int p = ((ll)a * qp(b, mod - 2)) % mod, s = (qp(n + m + 1, mod - 2) * ((ll)n + m)) % mod;
    39     int ans = ((ll)n * qp(s, k) % mod + (ll)p * s % mod * (1 - qp(s, k) + mod) % mod * qp(1 - s, mod - 2) % mod) % mod;
    40     printf("%d
    ", (ans+mod)%mod);
    41     return 0;
    42 }
    View Code

    D:

    看题都有点费劲……

    二分时间。后面贪心的选择攻击策略。对于二分出来的时间t,因为a是循环数组,对于每个i,1<=i<=n,可以算出最大的整数d,使得i+d*n<=t,实际上可以看作a[i]*b[j]可以使用d次。可以把所有的a[i]*b[1]存在一个优先队列,每次取最小,次数用光后在放入a[i]*b[2],直到C或W小于等于0。 

     E:

    由物理知识我们知道,若某一时刻a球比b球速度快,则a球始终比b球速度快。对于1操作 v1,t1,m1。可以算出V1=v1+g*(T-t1)。对于2操作,可以算出V2=v2+g*(T-t2)。则需要查询的小球即是满足V1<=V2的小球。然后根据公式m1*(v1+g*(t2-t1))^2,拆开,维护三个树状数组即可。

    这题如果线段树姿势不对有可能会TLE。

     1 /* basic header */
     2 #include <bits/stdc++.h>
     3 /* define */
     4 #define ll long long
     5 #define dou double
     6 #define pb emplace_back
     7 #define mp make_pair
     8 #define sot(a,b) sort(a+1,a+1+b)
     9 #define rep1(i,a,b) for(int i=a;i<=b;++i)
    10 #define rep0(i,a,b) for(int i=a;i<b;++i)
    11 #define eps 1e-8
    12 #define int_inf 0x3f3f3f3f
    13 #define ll_inf 0x7f7f7f7f7f7f7f7f
    14 #define lson curPos<<1
    15 #define rson curPos<<1|1
    16 /* namespace */
    17 using namespace std;
    18 /* header end */
    19 
    20 const int maxn = 5e6 + 10;
    21 const int mod = 1e9 + 7;
    22 
    23 struct Node
    24 {
    25     ll mv_2, _2mvg, mg_2;
    26     Node()
    27     {
    28         mv_2 = _2mvg = mg_2 = 0;
    29     }
    30 } bit[maxn];
    31 int q, op;
    32 ll v, m, t;
    33 
    34 void add(ll pos, ll a, ll b, ll c)
    35 {
    36     while (pos < maxn)
    37     {
    38         bit[pos].mv_2 += a;
    39         bit[pos]._2mvg += b;
    40         bit[pos].mg_2 += c;
    41         pos += pos & -pos;
    42     }
    43 }
    44 
    45 Node sum(ll pos)
    46 {
    47     Node ret = Node();
    48     while (pos)
    49     {
    50         ret.mv_2 = (ret.mv_2 + bit[pos].mv_2) % mod;
    51         ret._2mvg = (ret._2mvg + bit[pos]._2mvg) % mod;
    52         ret.mg_2 = (ret.mg_2 + bit[pos].mg_2) % mod;
    53         pos -= pos & -pos;
    54     }
    55     return ret;
    56 }
    57 
    58 int main()
    59 {
    60     scanf("%d", &q);
    61     while (q--)
    62     {
    63         scanf("%d", &op);
    64         if (op == 1)
    65         {
    66             scanf("%lld%lld%lld", &v, &t, &m);
    67             v = v - 10 * t;
    68             add(v + 2e6, (m * v * v) % mod, (2LL * m * v * 10 % mod + mod) % mod, m * 100 % mod);
    69         }
    70         else
    71         {
    72             scanf("%lld%lld", &v, &t);
    73             v = v - 10 * t + 2e6;
    74             Node ans = sum(v);
    75             ll sum = ans.mv_2 % mod;
    76             sum = (sum + ans._2mvg % mod * t % mod) % mod;
    77             sum = (sum + ans.mg_2 % mod * t % mod * t % mod) % mod;
    78             printf("%lld
    ", (sum + mod) % mod);
    79         }
    80     }
    81     return 0;
    82 }
    View Code

    F:

    有点神仙的题,以后再说吧(咕咕咕

  • 相关阅读:
    [转]Spring.NET企业架构实践之 NHibernate + Spring.NET + WCF + Windows服务 + Silverlight 中小企业应用架构完整Demo
    [转]用EA 建模设计Blog全过程
    下载页面
    Expression Studio 4 ultimate x86 下载含序列号
    ACS.NET缓存技术
    Case
    再谈C#中的委托,匿名方法和Lambda表达式
    代理服务器的设置
    软件架构师之职责范围和高级软件工程师的职责范围
    WPF博客
  • 原文地址:https://www.cnblogs.com/JHSeng/p/10895187.html
Copyright © 2020-2023  润新知