CQOI2016集训定时作业1

很远古的题,然后被虐爆了

math

在这里插入图片描述
核心思路就是先考虑 n n n个数都是平均值,然后这时候方差为零。

怎么在平均数不变的情况下改变方差呢?我们可以用这一种模式:假设让方差改变 2 d 2 2d^2 2d2,我们把一个值变成 u + d u+d u+d,一个变成 u − d u-d ud,基于这种思路,我们可以先定一个较大的 n n n,然后每次找出最大的 d d d去消去方差,直到 0 0 0为止。

那么这个 n n n是多少呢?对于本题数据 20 20 20就足够了(当然数据宽松,你可以取得更大或枚举),原谅作者并不能说明为什么 20 20 20是足够的,留给读者自己思考吧。

//std的代码
#include<cstdio>
#include<cmath>
#define MAXN 1000
int A[MAXN+10];
int main()
{
    freopen("math.in", "r", stdin);
    freopen("math.out", "w", stdout);
    int T, n, mu, v, tot, x;
    long long nv;
    scanf("%d", &T);
    for(int i = 1; i <= T; i++)
    {
        scanf("%d%d", &mu, &v);
        n = 20;
        nv = 1LL * n * v;
        tot = 0;
        while(nv > 0)
        {
            x = (int)sqrt(nv/2);
            A[++tot] = mu + x;
            A[++tot] = mu - x;
            nv -= 2LL * x * x;
        }
        while(tot < n)
            A[++tot] = mu;
        printf("%d\n", n);
        for(int i = 1; i <= n; i++)
            if(i==1)
                printf("%d", A[i]);
            else
                printf(" %d", A[i]);
        puts("");
    }
    fclose(stdout);
    return 0;
}

小奇的数列

在这里插入图片描述
在这里插入图片描述
核心思路就是把 区间子串和 转化为 区间前缀的差。

对于每一个询问,我们把区间的每一个前缀插入到 s e t set set中,插入时查询一下前驱和后继,更新答案,时间复杂度 O ( n m log ⁡ n ) O(nm\log n) O(nmlogn)

这种做法明显过不了,但是考虑生日悖论,出现相同值的两个前缀概率是很高的,所以我们加入一个小优化,找到 0 0 0就直接跳出,会快很多 q w q qwq qwq

#include <cstdio>
#include <set>
using namespace std;
const int M = 10005;
int read()
{
    int x=0,flag=1;char c;
    while((c=getchar())<'0' || c>'9') if(c=='-') flag=-1;
    while(c>='0' && c<='9') x=(x<<3)+(x<<1)+(c^48),c=getchar();
    return x*flag;
}
int n,q,a[M];
int main()
{
    n=read();q=read();
    for(int i=1;i<=n;i++)
        a[i]=read();
    while(q--)
    {
        int l=read(),r=read(),p=read(),sum=0,ans=p;
        set<int> s;
        s.insert(0);
        for(int i=l;i<=r;i++)
        {
            sum=(sum+a[i])%p;
            set<int> :: iterator it=s.lower_bound(sum);
            if(it!=s.end() && (*it)==sum)
            {
                ans=0;
                break;
            }
            if(it!=s.end())
                ans=min(ans,((sum-(*it))%p+p)%p);
            if(it!=s.begin())
            {
                it--;
                ans=min(ans,((sum-(*it))%p+p)%p);
            }
            s.insert(sum);
        }
        printf("%d\n",ans);
    }
}

Tree

在这里插入图片描述
在这里插入图片描述
我第一眼看这不是树套树板题吗?然后一发树套树 MLE \text{MLE} MLE

正解是树链剖分维护路径异或和,这不是位运算常识吗?我搞得这么复杂。

没关系,就当练码力了吧,树套树万岁!代码就不贴了,相信你们都写得来。

后记

又被打击了一次,虽说就是平时的一个小测。

遇到问题就多想想,并不是所有题都是树套树,其他的,就是有些实在没想到吧 😔

然后就是 AK \color{red}\text{AK} AK 奆佬 S Y \color{blue}{SY} SY 的一波在线嘲讽:
在这里插入图片描述
加油吧 q w q qwq qwq,争取下次嘲讽 S Y \color{blue}{SY} SY 奆佬。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值