zoukankan      html  css  js  c++  java
  • 【BestCoder #44】

    因为这场比赛,我愉快地逃掉了晚自修。

    T1一开始各种SillyB,忘了40%的最低限制。。。

    T2各种想吐槽。。。

    明明OJ警告说%lld是不行的我就换成%I64D(上面写这样的)。。。

    结果各种WA

    改成%lld然后不顾警告提交

    AC。。。

    此时心里:“¥%……#¥……”

    后来想了想不是%I64d吗。。。。d是小写的啊。。。。

    BC的尿性。。。。

    累觉不爱

    T3和T4就都不会做啦。。。

    于是只能A两道,于是100+的排名,于是Rating也上1500了(噗

    代码:

    T1

    #include <cstdio>
    #include <algorithm>
    #include <cstring>
    #include <cctype>
    #include <deque>
    #include <cmath>
    #define rep(i, l, r) for(int i=l; i<=r; i++)
    #define down(i, l, r) for(int i=l; i>=r; i--)
    #define clr(x, c) memset(x, c, sizeof(x))
    #define travel(x) for(edge *p=fir[x]; p; p=p->n)
    #define maxn 50009
    #define maxm 300009
    #define inf 0x7fffffff
    #define ll long long
    using namespace std;
    int read()
    {
        int x=0, f=1; char ch=getchar();
        while (!isdigit(ch)) {if (ch=='-') f=-1; ch=getchar();}
        while (isdigit(ch)) x=x*10+ch-'0', ch=getchar();
        return x*f;
    }
    
    int main()
    {
        int t=read(), tt=0, a, b, ans; while (tt++<t)
        {
            ans=0;
            a=read(); b=read();
            ans+=max(1000*(250-a)/250-b*50, 1000/10*4);
            a=read(); b=read();
            ans+=max(1500*(250-a)/250-b*50, 1500/10*4);
            a=read(); b=read();
            ans+=max(2000*(250-a)/250-b*50, 2000/10*4);
            a=read(); b=read();
            ans+=max(2500*(250-a)/250-b*50, 2500/10*4);
            printf("Case #%d: %d
    ", tt, ans);
        }
        return 0;
    }

    T2

    #include <cstdio>
    #include <algorithm>
    #include <cstring>
    #include <cctype>
    #define rep(i, l, r) for(int i=l; i<=r; i++)
    #define down(i, l, r) for(int i=l; i>=r; i--)
    #define maxn 500009
    #define Q 998244353
    #define ll long long
    using namespace std;
    int read()
    {
        int x=0, f=1; char ch=getchar();
        while (!isdigit(ch)) {if (ch=='-') f=-1; ch=getchar();}
        while (isdigit(ch)) x=x*10+ch-'0', ch=getchar();
        return x*f;
    }
    int n;
    ll k[maxn], ans;
    bool cmp(ll x, ll y)
    {
        if (x==y) return true;
        while ((x&1)==(y&1)) x>>=1, y>>=1;
        return (x&1)==0;
    }
    void Cal(ll l, ll r, ll v)
    {
        if (l>=r || v==1073741824) return;
        ll mid=l; while (mid<=r && (k[mid]&v)==0) mid++;
        ans=(ans+(mid-l)*(r+1-mid)%Q*v%Q)%Q;
        Cal(l, mid-1, v<<1); Cal(mid, r, v<<1);
    }
    int main()
    {
        int t=read(), tt=0; while (tt++<t)
        {
            n=read(); ans=0;
            rep(i, 1, n) k[i]=read();
            sort(k+1, k+1+n, cmp);
            Cal(1, n, 1);
            printf("Case #%d: %lld
    ", tt, ans*2%Q);
        }
        return 0;
    }

    题解:

    1001 ZYB loves Score
    本题考察了选手的模拟能力,直接按照题目意思计算即可

    1002 ZYB loves Xor I
    我们考虑,当A xor B的答案为2p时,A和B表示成二进制数后末p−1位肯定相同
    于是我们维护一颗字母树,将每个数表示成二进制数后翻转可以下,插入字母树
    统计答案时,我们找出Ai的二进制数翻转后在字母树上的路径,对于路径上每个点x,设他走的边是v,且当前为第k位,则和他xor后lowbit为2k的数的个数为trans(x,v^1)的子树大小。
    trans(x,v)表示字母树上在结点x,走连出去的字母为v的边到达的结点
    时间复杂度:O(nlogA)

    1003 ZYB loves Xor II
    我们考虑两个数A,B。
    为了描述方便,我们设[P]的值为:当表达式P的值为真时,[P]=1,否则[P]=0
    我们现在考虑计算[(A+B)and(2i)>0]
    首先我们将A,B都对2i+1取模,显然这样是不会影响答案的
    则有一个十分显然的等式:
    [(A+B)and(2i)>0]=[(A+B)≥(2i)]−[(A+B)≥(2i+1)]+[(A+B)≥(3∗2i)]
    这个式子相当容易理解,这里不多述了
    考虑每一位对答案的贡献是独立的,我们每一位分开做
    于是现在问题变成了:给定数组A,B,求满足Ai+Bj≥limit的数对个数
    我们可以将A,B排序后,直接O(n)计算即可
    然而排序是O(nlogn)的,这样总复杂度就是O(nlognlogA)了,无法通过此题
    于是这里有个小技巧
    我们从高位往低位做,现在我们要实现的是:将A中每个数对P取模后将A排序
    我们发现A会被分成两段,一段小于P,一段大于等于P,只有后面一段要取模,我们可以取模后直接将这两段归并,复杂度是O(n)的
    时间复杂度:O(nlogA+nlogn)

    1004 ZYB loves product
    个人感觉这题没有上一题难
    首先我们考虑DP思路,设f[k][n]为n的k分解的权值和
    则有f[k][n]=∑d|nf[k−1][d]∗V(nd)
    我们可以发现上述DP方程是个狄利克雷卷积的形式
    然后我们可以发现权值函数V(x)是积性函数
    所以易得f[k]也是个积性函数
    于是我们把n质因数分解
    现在把n的规模变成了ap
    设g[k][p]=f[k][ap]
    设h[p]=V(ap)
    于是我们可以得到转移方程g[k][n]=∑ni=0g[k−1][i]∗h[n−i]
    这是个卷积形式,我们可以用倍增+FFT计算g
    时间复杂度:O(fplog(p)log(m))

  • 相关阅读:
    js 99乘法表
    微信小程序 富文本插件 循环渲染方式
    Mysql: mysqlbinlog命令查看日志文件
    Java Mail 发送邮件(SSL加密方式,TSL加密方式)
    进程和线程的区别
    Java 制作证书(Windows 和Linux)
    Linux 常用命令标记
    Java clone克隆方法 --深拷贝--浅拷贝 --原型模型
    tomcat内存溢出:PermGen space解决方法
    Java 多线程 ---- 线程中this与 Thread.currentThread()线程的区别
  • 原文地址:https://www.cnblogs.com/NanoApe/p/4574137.html
Copyright © 2011-2022 走看看