【MX-X2-T1】「Cfz Round 4」Awaken 题解

· · 题解

注意到 Subtask 1 中 m=n。我们依次枚举 z,所有满足 x+y=z 的二元对 (x,y),要求 a_x+a_y 的值两两相等。时间复杂度:O(n^2)

应该随便写个指数级暴力就能过 Subtask 2 了吧。确信

先猜一手结论:a_i 是等差序列。接下来进行证明。

n=5,我们有以下式子:

不过要特判 $m\le 1$。 如果 $m\ge 2$,我们只需要算出公差(要求是**整数**),然后看是否能够还原出一个等差数列。 时间复杂度:$O(n+m)$。 ``` void solve(){ //don't forget to open long long; int n,m;IO::cin>>n>>m;std::vector<int>v(n,1e9+1); while(m--){int x,y;mp[x]++;;IO::cin>>x>>y;x--;v[x]=y;} while(!v.empty()&&v.back()==1e9+1)v.pop_back(); reverse(all(v)); while(!v.empty()&&v.back()==1e9+1)v.pop_back(); reverse(all(v)); if(v.size()<=1)return IO::cout<<"Yes"<<'\n',void(); int d=v.size()-1;ll L=v[0],R=v[d]; if((R-L)%d)return IO::cout<<"No\n",void(); ll B=(R-L)/d; for(int i=1;i<=d;i++){ if(v[i]==1e9+1)v[i]=v[i-1]+B; if(v[i]!=v[i-1]+B)return IO::cout<<"No"<<'\n',void(); }IO::cout<<"Yes"<<'\n'; } ``` 代码是去年的代码了,有点丑。/yun