CF1704D Magical Array - 构造 -

题目链接:https://codeforces.com/contest/1704/problem/D

题意:
有n个序列,初始都一样,选定某一个序列ck,对ck做至少一次操作②,对除ck以外的每一个数列至少做一次操作①,给出最后得到的n个数列,问k和操作②的次数
操作①:选定2i,jm(m为序列长度),ci1cj+11cicj+1
操作①:选定2i,jm1ci1cj+21cicj+1

题解:
F(k)=ck[i]i
对于操作①,计算F(k)的新值为(ck[i1]+1)(i1)+(ck[i]1)i+(ck[j]1)j+(ck[j+1]+1)(j+1)
对应的旧值为(ck[i1])(i1)+(ck[i])i+(ck[j])j+(ck[j+1])(j+1)
观察可知,二者结果相等

同理对于操作②,我们发现其新的结果恰好多了一个1((j+1)变成了(j+2),结果多1)
于是我们统计一下每个数列对应的F(k)值即可

代码:

// by Balloons
#include <cstdio>
#include <vector>
#include <cstring>
#include <iostream>
#include <algorithm>
#define mpr make_pair
#define debug() cerr<<"Madoka"<<endl
#define rep(i,a,b) for(int (i)=(a);(i)<=(b);(i)++)

using namespace std;

typedef long long LL;
#define int LL

const int inf = 1e9,maxn=1e5 + 5;

int n,m;

void solve(){
	scanf("%I64d%I64d",&n,&m);
	int mxx = -1e18,mnn = 1e18,p;
	for(int i=1;i<=n;i++){
		int mx=0;
		for(int j=1;j<=m;j++){
			int t;scanf("%I64d",&t);
			mx += t*j;
		}
		if(mxx < mx)p = i;
		mxx = max(mxx, mx);
		mnn = min(mnn, mx);
	}
	printf("%I64d %I64d\n",p,mxx - mnn);
}

signed main(){
	int te;scanf("%I64d",&te);
	while(te --)solve();

	return 0;
}


posted @   SkyRainWind  阅读(69)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 分享4款.NET开源、免费、实用的商城系统
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
· 记一次.NET内存居高不下排查解决与启示
点击右上角即可分享
微信分享提示