惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

J
Java Code Geeks
Stack Overflow Blog
Stack Overflow Blog
B
Blog RSS Feed
C
Check Point Blog
D
Docker
Y
Y Combinator Blog
Recent Announcements
Recent Announcements
Google DeepMind News
Google DeepMind News
MongoDB | Blog
MongoDB | Blog
博客园_首页
Apple Machine Learning Research
Apple Machine Learning Research
量子位
有赞技术团队
有赞技术团队
IT之家
IT之家
大猫的无限游戏
大猫的无限游戏
D
DataBreaches.Net
M
MIT News - Artificial intelligence
B
Blog
阮一峰的网络日志
阮一峰的网络日志
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More
腾讯CDC
让小产品的独立变现更简单 - ezindie.com
让小产品的独立变现更简单 - ezindie.com
V
V2EX
月光博客
月光博客

Ariasakaの小窝

Ariasakaの小窝 Ariasakaの小窝 Ariasakaの小窝 Ariasakaの小窝 Ariasakaの小窝 Ariasakaの小窝 Ariasakaの小窝 Ariasakaの小窝 Ariasakaの小窝 Ariasakaの小窝 Ariasakaの小窝 Ariasakaの小窝 Ariasakaの小窝 Ariasakaの小窝 Ariasakaの小窝 Ariasakaの小窝 Ariasakaの小窝 Ariasakaの小窝 Ariasakaの小窝 Ariasakaの小窝 Ariasakaの小窝 Ariasakaの小窝 Ariasakaの小窝 Ariasakaの小窝 Ariasakaの小窝 Ariasakaの小窝 Ariasakaの小窝 Ariasakaの小窝 Ariasakaの小窝 Ariasakaの小窝
Ariasakaの小窝
2023-07-22 · via Ariasakaの小窝

前言

热乎着的一道题,昨晚上刚考完,然而这是一场悲剧。。。。

传送门:

前往以下网站,不保证安全性哦喵~E. Cardboard for PicturesCodeforces

题解

题目大意

给定 $a_1 ~ a_n$ 和 $c$ ,求 $(a_1+2\times w)^2+(a_2+2\times w)^2+...+(a_n+2\times w)^2=c$ 时 $w$ 的最小值

解析

我们来化简一下这个式子:

$(a_1+2\times w)^2+(a_2+2\times w)^2+...+(a_n+2\times w)^2$

根据完全平方公式 $(a+b)^2=a^2+b^2+2ab$ (对!初一数学!)可得

原式$=(a_1)^2+(2\times w)^2+2\times a_1\times (2\times w)+(a_2)^2+(2\times w)^2+2\times a_2\times (2\times w)+...+(a_n)^2+(2\times w)^2+2\times a_n\times (2\times w)$

$\begin{aligned}=\sum{i=1}^{i\le n} (a_i)^2+n(2\times w)^2+(\sum{i=1}^{i\le n} 2\times a_i)\times (2\times w)\end{aligned}$

所以预处理出 $\begin{aligned}\sum_{i=1}^{i\le n} (a_i)^2\end{aligned}$=sum1,$\begin{aligned}(\sum_{i=1}^{i\le n} 2\times a_i\end{aligned})$=sum2 即可。

然后考虑二分 $w$ ,check 函数这样子写:

CPP
inline bool check(ll x){
    ll t=x*2;
    return sum1+t*t*n+sum2*t<=c;
}

代码

思路很简单,那么就直接给出代码吧qwq!

CPP
#include <bits/stdc++.h>
#define i128 __int128 //不开int128见祖宗
using namespace std;
i128 T,n,c,t,sum1,sum2; //sum1 sum2见上
template<typename T> inline void read(T& n){
    T x=0;bool f=1; //int128特有的快读快写(悲)
    char c=getchar();
    while(c<48||c>57)
        f=c!=45,c=getchar();
    while(c>47&&c<58)
        x=(x<<3)+(x<<1)+(c^48),c=getchar();
    n=f?x:-x;
}
template<typename T> void write(T x){
    if(x<0) putchar(45),x=-x;
    if(x>9) write(x/10);
    putchar(x%10+48);
}
inline bool check(i128 x){
    i128 t=x*2; //check,见上
    return sum1+t*t*n+sum2*t<=c;
}
int main(){
    ios::sync_with_stdio(0);
    read(T);
    while(T--){
        read(n),read(c),sum1=0,sum2=0;
        for(int i=1;i<=n;i++)
            read(t),sum1+=t*t,sum2+=2*t; //预处理
        i128 l=0,r=1e9,mid;
        while(l<=r){ //二分
            mid=l+r>>1;
            if(check(mid)) l=mid+1;
            else r=mid-1;
        }
        write(r),puts("");
    }
    return 0;
}

彩蛋

聊聊赛时的一场悲剧:

还剩最后22分钟时,跟 cyh 交流出了解法,她表示:我不想打了,感觉调不出来了。

但是本蒟蒻上次被 Skipped 的Div.4(5.6那次)可是做了 5 道,可不能成为耻辱,上次加了164Rating!

然后就开始调二分了,然而一直卡题,卡了7次到处改都是WA在Test4。

当时打的是:

C++
#define ll __int128 //C++17,GCCmsys264能过
...
ll l=0,r=c,mid; //r太大了!!!,l=0用不着
while(l<r){ //PS:原版题解里的l<=r是怕玄学,实际上一样的
    mid=l+r>>1;
    if(check(mid)) l=mid+1;
    else r=mid;
}

时间飞逝,比赛结束,最后一次提交依然没过,难绷。

本来想打一个高精度的,但是感觉时间会炸就没打(实际上如果用python一切都能避免只可惜来不及改了)。

比赛完时突然想到 unsigned __int128 ,改了一下: #define ll unsigned __int128

比赛完之后大概 1:39 分时, CF 服务器终于不卡了,于是又提交上去,过了?

还我 T5,unsigned 我*!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!

真蚌埠住了,这场玩飘了。

然后根据 czy 在犇犇里说的 r=1e9 就行,改了一下,换回 signed __int128 就过了。。。。。。。

这份也是题解里面的版本。

CF1850E Cardboard for Pictures 题解