CF1545D AquaMoon and Wrong Coordinate 题解
RedLycoris · · 题解
赛时看到“误差修复”就一直往随机化方面想了
假设对于时刻
那么我们令
再令
令
观察发现,由于在求和后,顺序就变得无关紧要了,故在没有改动数据的情况下,
根据这个性质,我们就可以求出哪一个时刻进行了更改。令更改的时刻为
如果第
所以,我们可以求出所有的
现在,我们求出了那个时刻进行了更改。然后我们需要求出哪个数值需要更改。
观察
由于累加后顺序不重要,故可以展开,得到
在没有改动数据的情况下,又
看到这里可能没有什么发现
但是如果我们再进一步,令
就有
所以,在不改动数据的情况下,
根据这个性质,我们就可以轻易推断出,在更改数据前,
最后我们就可以求出那个值了。
令更改数据前的
令
观察更改前后
令更改后那个值为
故
答案就是
完结~~~
Code:
#include<bits/stdc++.h>
#define ll long long
#define mp make_pair
using namespace std;
const int mxn=1e3+3;
ll a[mxn][mxn],n,m;
ll sum[mxn],squsum[mxn];
pair<int,int> delta[mxn];
int err;
ll sumdelta,squsumdelta;
ll orgsum,orgsqusum;
ll sumchange,squsumchange;
ll deltasqusumchange,basesqusumchange;
ll ans;
inline void solve(){
cin>>n>>m;
for(int i=1;i<=m;++i)for(int j=1;j<=n;++j)cin>>a[i][j],sum[i]+=a[i][j],squsum[i]+=a[i][j]*a[i][j];
for(int i=1;i<m;++i)delta[i].first=sum[i+1]-sum[i],delta[i].second=i;
sort(delta+1,delta+m);
sumdelta=delta[2].first;
if(delta[1].second<delta[m-1].second)err=delta[m-1].second;
else err=delta[1].second;
if(err==2){
deltasqusumchange=((squsum[5]-squsum[4])-(squsum[4]-squsum[3]));
basesqusumchange=(squsum[5]-squsum[4])-deltasqusumchange*3;
}else{
basesqusumchange=squsum[2]-squsum[1];
if(err==3)deltasqusumchange=((squsum[5]-squsum[4])-(squsum[2]-squsum[1]))/3;
else deltasqusumchange=((squsum[3]-squsum[2])-(squsum[2]-squsum[1]));
}
orgsum=sum[err-1]+sumdelta;
sumchange=orgsum-sum[err];
orgsqusum=squsum[err-1]+basesqusumchange+deltasqusumchange*(err-2);
squsumchange=orgsqusum-squsum[err];
ans=(squsumchange-sumchange*sumchange)/2/sumchange;
cout<<err-1<<' '<<ans+sumchange<<'\n';//至于为什么err要-1:我时刻是从1开始算的
}
int main(){
ios_base::sync_with_stdio(false);
cin.tie(0),cout.tie(0);
int T;T=1;
// cin>>T;
for(;T--;)solve();
}