[yLOI2020] 灼
我把F题做出来了???
思路
显然,对每一个地点的期望\(E(x_m)\)可以认为是由左右两边的期望\(E(x_l),E(x_r)\)推得,那必然有这样一个期望式子
\[E[x_m] = \frac{1}{2}\times(E[x_l]+E[x_r])+1
\]
考虑到题目是在一维空间里进行,对于每个\(E(x)\)又受左右期望的影响,假如我们考虑动态规划,就会发现存在后效性,而解决后效性的一种常用手段就是高斯消元
如果想到了高斯消元,那么我们就至少可以打出来这个题朴素解法
枚举每两个虫洞,然后对他们之间的距离进行高斯消元,
显然这个算法时间和空间复杂度都双双爆炸
显然可以发现两个虫洞间的距离是唯一能影响矩阵元素的变量,那必然可以能想到打表每种长度的矩阵
打表结果
2 2
3 4 3
4 6 6 4
5 8 9 8 5
6 10 12 12 10 6
7 12 15 16 15 12 7
8 14 18 20 20 18 14 8
9 16 21 24 25 24 21 16 9
10 18 24 28 30 30 28 24 18 10
11 20 27 32 35 36 35 32 27 20 11
12 22 30 36 40 42 42 40 36 30 22 12
13 24 33 40 45 48 49 48 45 40 33 24 13
14 26 36 44 50 54 56 56 54 50 44 36 26 14
15 28 39 48 55 60 63 64 63 60 55 48 39 28 15
16 30 42 52 60 66 70 72 72 70 66 60 52 42 30 16
17 32 45 56 65 72 77 80 81 80 77 72 65 56 45 32 17
18 34 48 60 70 78 84 88 90 90 88 84 78 70 60 48 34 18
19 36 51 64 75 84 91 96 99 100 99 96 91 84 75 64 51 36 19
20 38 54 68 80 90 98 104 108 110 110 108 104 98 90 80 68 54 38 20
诶,莫名其妙就发现规律了呀!
\(1°\)首项必然是虫洞间距离的大小
\(2°\)当首项为奇数时,满足$ a[i] +2\times(mid-i)-1=a[i+1],i+1≤mid $ ,$ mid $ 为数列的对称轴
\(3°\)当首项为偶数时,满足 \(a[i] +2\times(mid-i) = a[i+1],i+1≤mid\) , \(mid\) 为对称轴左边第一个数
然后就差不多了吧?
Code
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<cmath>
using namespace std;
#define INF 1<<30
#define int long long
const int mod=998244353;
const int N=1e5+5;
const int M=5e6+5;
int x[N];
int n,m,T;
int Ans[M];
int tot,minx=INF,maxx,ji;
inline void loading(int x)
{
tot^=x;
minx = min(minx,x);
maxx = max(maxx,x);
if(x&1) ji++;
}
signed main()
{
ios_base::sync_with_stdio(false);
cout.tie(NULL);
cin.tie(NULL);
cin>>T>>n>>m;
if(n == 1)
{
cout<<0<<'\n'<<0<<'\n'<<0<<'\n'<<0;
return 0;
}
for(int i=1;i<=n;i++)
cin>>x[i];
for(int i=1,d;i<=m;i++)
cin>>Ans[i];
sort(x+1,x+1+n);
int cnt = 1;
for(int i=1,len,place,mid,g,y,z;i<n;i++)
{
len = x[i+1]-x[i]-1;
while(x[i]<=Ans[cnt]&&Ans[cnt]<=x[i+1] && cnt<=m)
{
if(Ans[cnt]==x[i]||Ans[cnt]==x[i+1])loading(0);
else
{
x[i+1]--;x[i]++;
if(len&1)
{
mid = (1+len)/2;
if(Ans[cnt] >(x[i]-1)+mid)
{
g=Ans[cnt]-(x[i]-1)-mid;
Ans[cnt] = (x[i]-1)+mid-g;
}
}
else
{
mid = (1+len)/2;
if(Ans[cnt] >(x[i]-1)+mid)
{
g=Ans[cnt]-(x[i]-1)-mid;
Ans[cnt] = (x[i]-1)+mid+1-g;
}
}
place = Ans[cnt]-x[i];
x[i+1]++;x[i]--;
y=len;
if(len&1)
{
y+=2*place*mid-(place+1)*place-place;
y%=mod;
}
else
{
y+=(2*place*mid)-(place+1)*place;
y%=mod;
}
loading(y);
}
cnt++;
}
}
cout<<tot<<'\n'<<ji<<'\n'<<maxx<<'\n'<<minx;
}

浙公网安备 33010602011771号