1 条题解

  • 0
    @ 2024-4-4 14:36:48

    原文来自洛谷 @ljlbj_fengyuwuzu,如有侵权可邮箱 tanqf7@163.com 申请下架。

    手推几组数据不难发现,如果有两个相同的 hih_i 之间最多只隔着一个其他元素,那么 hih_i 一定是答案。

    分两种情况证明:

    • hi=hi+1h_i = h_{i+1},那么对区间 [i,i+2][i, i+2] 进行一次会议肯定会让 hi+2=hih_{i+2} = h_i,同理,对 [i1,i+1][i-1, i+1] 进行会议很定会让 hi1=hih_{i-1}=h_i。以此类推,就可以让所有的 hih_i 相同。
    • hi=hi+2h_i = h_{i+2}hihi+1h_i \ne h_{i+1}​,那么对区间 [i,i+2][i, i+2] 进行一次会议很定会让 hi+1=hih_{i+1} = h_i。依次类推,就可以让所有的 hih_i 相同。

    代码:

    #include <bits/stdc++.h>
    using namespace std;
    
    const int MAXN = 2e5 + 5;
    
    int n;
    int a[MAXN];
    bool in_ans[MAXN];
    int last[MAXN];
    
    void solve() {
    	memset(in_ans, 0, sizeof(in_ans));
    	memset(last, 0, sizeof(last));
    	vector<int> ans;
    	scanf("%d", &n);
    	for (int i = 1; i <= n; i++) {
    		scanf("%d", &a[i]);
    	}
    	for (int i = 1; i <= n; i++) {
    		if(last[a[i]]) {
    			if(i - last[a[i]] < 3 && !in_ans[a[i]]) {
    				in_ans[a[i]] = true;
    				ans.push_back(a[i]);
    			}
    		}
    		last[a[i]] = i;
    	}
    	sort(ans.begin(), ans.end());
    	if(ans.empty()) printf("-1\n");
    	else {
    		for (int i = 0; i < (int)ans.size(); i++) {
    			cout << ans[i] << " \n"[i == (int)ans.size() - 1];
    		}
    	}
    }
    
    int main() {
    	int T;
    	scanf("%d", &T);
    	while(T--) {
    		solve();
    	}
    	return 0;
    }v
    
    • 1

    【USACO 2024 January Contest, Bronze】Majority Opinion

    信息

    ID
    30
    时间
    1000ms
    内存
    256MiB
    难度
    2
    标签
    递交数
    3
    已通过
    1
    上传者