D. Range = √Sum #836 div2

Problem - D - Codeforces

题意是给你一个数n,让你构造一串序列a,使得a的极差==根号下的求和,问你构造的序列是什么

分析:

最近写题的思维度有些下降,并不是说这题我写不出,而是因为当时思考的角度就是错的,很离谱。这两天写题的精神状态不佳,思路乱的一塌糊涂,很怪

以下思路来源于Codeforces Round #836 (Div. 2) A-E - 知乎 (zhihu.com)

这题的构造可以不同,其实有这样的一个关系的,可以推一推关系式中的联系

因为是极差要和求和之后开根号相等

所以我们可以构造极差为2*n(n好像也行?)

所以求和就是4*n*n

所以先令每一个数为4*n,所以容易看出a[1]为3*n,a[n]为5*n

因为极差是2*n,所以首尾两个数之间所填的数是肯定不会超出的

下面采用多退少补原则

前面一半每次减去k(k递增)

后面一半对应着加上k

这样就能保证总和是4*n*n,极差是2*n

因为是对称,所以从中间往两边就可以。其实是不好从前往后的去填数,不好保证开头和最后结尾是不是在(a[1],a[n])的范围里面。

下面是代码:

//#pragma GCC optimize(1)
//#pragma GCC optimize(2)
//#pragma GCC optimize(3,"Ofast","inline")
#define IOS ios::sync_with_stdio(false), cin.tie(0);
#include<iostream>
#include<map>
#include<set> 
#include<cstdio>
#include<cstring>
#include<vector>
#include<stack>
#include<algorithm>
#include<cmath>
#include<queue>
#include<deque>
using namespace std;
#define int long long
typedef long long ll;
typedef pair<int,int> PAII;
const int N=2e6+10,M=5050,INF=1e18,mod=998244353;
int a[N];
signed main(){
    //IOS;
    int T;
    //T=1;
    cin>>T;
    while(T--)
    {
		int n;
		cin>>n;
		for(int i=1;i<=n;i++) a[i]=4*n;
		int x=n/2;
		int k=0;
		for(int i=x;i>1;i--)
		{
			k++;
			a[i]-=k;
		}
		a[1]=3*n;
		a[n]=5*n;
		if(n&1) x+=2;
		else x++;
		k=0;
		for(int i=x;i<n;i++)
		{
			k++;
			a[i]+=k;
		}
		for(int i=1;i<=n;i++) cout<<a[i]<<" ";
		cout<<"\n";
	}
    return 0;
} 
/*



*/ 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
帮我给每一行代码添加注释 class DeepKalmanFilter(nn.Module): def __init__(self, config): super(DeepKalmanFilter, self).__init__() self.emitter = Emitter(config.z_dim, config.emit_hidden_dim, config.obs_dim) self.transition = Transition(config.z_dim, config.trans_hidden_dim) self.posterior = Posterior( config.z_dim, config.post_hidden_dim, config.obs_dim ) self.z_q_0 = nn.Parameter(torch.zeros(config.z_dim)) self.emit_log_sigma = nn.Parameter(config.emit_log_sigma * torch.ones(config.obs_dim)) self.config = config @staticmethod def reparametrization(mu, sig): return mu + torch.randn_like(sig) * sig @staticmethod def kl_div(mu0, sig0, mu1, sig1): return -0.5 * torch.sum(1 - 2 * sig1.log() + 2 * sig0.log() - (mu1 - mu0).pow(2) / sig1.pow(2) - (sig0 / sig1).pow(2)) def loss(self, obs): time_step = obs.size(1) batch_size = obs.size(0) overshoot_len = self.config.overshooting kl = torch.Tensor([0]).to(self.config.device) reconstruction = torch.Tensor([0]).to(self.config.device) emit_sig = self.emit_log_sigma.exp() for s in range(self.config.sampling_num): z_q_t = self.z_q_0.expand((batch_size, self.config.z_dim)) for t in range(time_step): trans_loc, trans_sig = self.transition(z_q_t) post_loc, post_sig = self.posterior(trans_loc, trans_sig, obs[:, t]) z_q_t = self.reparametrization(post_loc, post_sig) emit_loc = self.emitter(z_q_t) reconstruction += ((emit_loc - obs[:, t]).pow(2).sum(dim=0) / 2 / emit_sig + self.emit_log_sigma * batch_size / 2).sum() if t > 0: over_loc, over_sig = self.transition(overshooting[:overshoot_len - 1]) over_loc = torch.cat([trans_loc.unsqueeze(0), over_loc], dim=0) over_sig = torch.cat([trans_sig.unsqueeze(0), over_sig], dim=0) else: over_loc = trans_loc.unsqueeze(0) over_sig = trans_sig.unsqueeze(0) overshooting = self.reparametrization(over_loc, over_sig) kl = kl + self.kl_div(post_loc.expand_as(over_loc), post_sig.expand_as(over_sig), over_loc, over_sig) / min(t + 1, self.config.overshooting) reconstruction = reconstruction / self.config.sampling_num kl = kl / self.config.sampling_num return reconstruction, kl
02-22

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值