代码源 Div1 - 106#456. 选数(抽屉原理) POJ2356

Posted 小哈里

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了代码源 Div1 - 106#456. 选数(抽屉原理) POJ2356相关的知识,希望对你有一定的参考价值。

problem

solution

  • 原本以为是01背包,但只能求出是否有解,没法求解
  • 对原数组求取模后的前缀和 sum ,则对于sum数组中的每个数,均位于[0,n - 1],共 n 种取值,而 sum[0 ~ n] 有n + 1 个数。
  • 根据抽屉原理,必定至少存在两个取值相同的数,设为l ,r,也就是说,sum[l] = sum[r],区间[l + 1,r]的和为零,就是答案。
#include<bits/stdc++.h>
using namespace std;
const int maxn = 1e5+10;
int s[maxn];
int main()
    int n;  cin>>n;
    for(int i = 1; i <= n; i++)
        int x;   cin>>x; 
        s[i] = (s[i-1]+x)%n;
    
    int l, r;
    map<int,int>ma;
    for(int i = 0; i <= n; i++)
        if(!ma.count(s[i]))ma[s[i]] = i;
        else
            l = ma[s[i]]+1; r = i;
            break;
        
    
    cout<<r-l+1<<"\\n";
    for(int i = l; i <= r; i++)cout<<i<<" ";
    return 0;

以上是关于代码源 Div1 - 106#456. 选数(抽屉原理) POJ2356的主要内容,如果未能解决你的问题,请参考以下文章

代码源 Div1 - 101#61. 二分答案(贪心)

代码源 Div1 - 105#451. Dis(倍增求LCA)

代码源 Div1 - 101#61. 二分答案(贪心)

代码源 Div1 - 107#452. 序列操作(思维)CF1198B

代码源 Div1 - 102#323. 最长因子链(dp)

代码源 Div1#104no crossing,Codeforces 793D,2100分,区间dp