2 条题解

  • 2
    @ 2024-8-10 19:18:58

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

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

    我会正解。

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

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

    1. a1+a4=a2+a3a_1+a_4=a_2+a_3;
    2. a1+a5=a2+a4a_1+a_5=a_2+a_4;
    3. a2+a5=a3+a4a_2+a_5=a_3+a_4

    22 式减去 11 式得到 a5a4=a4a3a_5-a_4=a_4-a_3。以此类推,不难发现 aia_i 序列为等差数列。

    不过要特判 m1m\le 1

    如果 m2m\ge 2,我们只需要算出公差(要求是整数),然后看是否能够还原出一个等差数列。

    时间复杂度:O(n+m)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';
    }
    
    • -4
      @ 2024-8-24 9:25:17

      标题

      思路

      解题方法

      复杂度

      时间复杂度:

      添加时间复杂度, 示例: O(n)O(n)

      空间复杂度:

      添加空间复杂度, 示例: O(n)O(n)

      Code

      • 1

      信息

      ID
      26
      时间
      1000ms
      内存
      512MiB
      难度
      2
      标签
      递交数
      1183
      已通过
      327
      上传者