2017年浙江中医药大学大学生程序设计竞赛(重现赛)D - CC的神奇背包

题目描述

CC is a smart girl and she is curious about everything. One day she starts to analyze her lifestyle and finds out that she either feels happy or unhappy in any day, then she collects her mood data and makes numerical representation. She writes down 1 if she is happy, otherwise she writes down 0. 
For example, if CC is happy, happy, unhappy, happy, happy, unhappy in the next 6 days, a numerical sequence which stands for it is 1,1,0,1,1,0

Meanwhile, smart CC finds her mood sequence is always periodic. She also finds the repeated segment like 1,1,0 in the aforementioned example and calls it “feeling repetend”. As a curious girl, CC wants to make another deep analysis. After she gets the length of “feeling repetend” n, she defines a rule: she tries to find a day whose index is d and considers the next d+n-1 days. For each day d‘ in [d, d+n-1], CC guarantee that the number of happy days is more than unhappy days in [1, d‘] days.

Now, CC wonder that how many days which satisfy the rule in n “feeling repetend” days.

输入描述:

Input contains multiple test cases.The first line contains an integer T (1<=T<=20), which is the number of test cases.Then the first line of each test case contains an integer n (1<=n<=100000), which is the length of “feeling repetend”.The second line of each test case contains n integers, each integer is either 0 or 1, standing for unhappy or happy.

输出描述:

output a integer represents the answer.

示例1

输入

2
5
1 0 1 1 0
5
1 1 1 1 1

输出

1
5

说明

For the sample,the days from the third day as a starting point are as follows:Day1: 1 day happy : 0 days unhappyDay2: 2 days happy : 0 days unhappyDay3: 2 days happy : 1 day unhappyDay4: 3 days happy : 1 day unhappyDay5: 3 days happy : 2 days unhappy

题解

$O(n)$扫描。

题意比较难懂,而且题意中有描述错的东西,看了样例才渐渐明白。

题意:有一个长度为$2*n$的数组,输入了$a[1]$到$a[n]$,剩下的是前面的拷贝。问有多少个$x$满足$x$属于$[1, n]$,且在区间$[x, x+n-1]$中,$1$的个数大于$0$的个数。

维护两个值,$1$的个数和$0$的个数,每次区间往后面移动一下,两个值更新一下,看有多少符合要求的就可以了。

赛中比较蠢蛋,弄了个前缀和在搞,不过也是可以的。

#include <bits/stdc++.h>
using namespace std;

const int maxn = 200000 + 10;
int T, n;
int a[maxn], sum[maxn];
int m[4 * maxn];

void build(int l, int r, int rt) {
  if(l == r) {
    m[rt] = sum[l];
    return;
  }
  int mid = (l + r) / 2;
  build(l, mid, 2 * rt);
  build(mid + 1, r, 2 * rt + 1);
  m[rt] = min(m[2 * rt], m[2 * rt + 1]);
}

int get(int L, int R, int l, int r, int rt) {
  if(L <= l && r <= R) {
    return m[rt];
  }
  int mid = (l + r) / 2;
  int left = 300000;
  int right = 300000;
  if(L <= mid) left = get(L, R, l, mid, 2 * rt);
  if(R > mid) right = get(L, R, mid + 1, r, 2 * rt + 1);
  return min(left, right);
}

int main() {
  scanf("%d", &T);
  while(T --) {
    scanf("%d", &n);
    for(int i = 1; i <= n; i ++) {
      scanf("%d", &a[i]);
      if(a[i] == 0) a[i] --;
      a[n + i] = a[i];
    }
    for(int i = 1; i <= 2 * n; i ++) {
      sum[i] = sum[i - 1] + a[i];
    }
    build(1, 2 * n, 1);
    int ans = 0;
    for(int i = 1; i <= n; i ++) {
      if(get(i, i + n - 1, 1, 2 * n, 1) <= sum[i - 1]) {
        continue;
      }
      ans ++;
    }
    printf("%d\n", ans);
  }
  return 0;
}

  

时间: 2024-10-19 13:47:45

2017年浙江中医药大学大学生程序设计竞赛(重现赛)D - CC的神奇背包的相关文章

第八届福建省大学生程序设计竞赛-重现赛

第八届福建省大学生程序设计竞赛-重现赛 B   计算几何 题意:问两个三角形是相交.包含还是相离. tags:套板子..求出相交的面积,再判断一下 /* 多边形相交面积模板 */ #define maxn 510 const double eps=1E-8; int sig(double d){ return(d>eps)-(d<-eps); } struct Point{ double x,y; Point(){} Point(double x,double y):x(x),y(y){} b

2016CCPC东北地区大学生程序设计竞赛 - 重现赛 1008(hdu 5929)

题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=5929 Problem Description Mr. Frog learned a basic data structure recently, which is called stack.There are some basic operations of stack: ? PUSH x: put x on the top of the stack, x must be 0 or 1.? POP

2016CCPC东北地区大学生程序设计竞赛 - 重现赛 1003

链接http://acm.hdu.edu.cn/showproblem.php?pid=5924 题意:根据公式求C,D 解法:打表找规律 #include <bits/stdc++.h> using namespace std; #define ll long long int main() { int t,cnt=1; scanf("%d",&t); while(t--) { ll a,b; scanf("%I64d%I64d",&a

2016CCPC东北地区大学生程序设计竞赛 - 重现赛 1005

链接http://acm.hdu.edu.cn/showproblem.php?pid=5926 题意:给我们一个矩阵,问你根据连连看的玩法可以消去其中的元素 解法:连连看怎么玩,就怎么写,别忘记边界 #include<stdio.h> //#include<bits/stdc++.h> #include<string.h> #include<iostream> #include<math.h> #include<sstream> #

2016CCPC东北地区大学生程序设计竞赛 - 重现赛 1001

链接http://acm.hdu.edu.cn/showproblem.php?pid=5922 题意:最小生成树,但边的权值是连接两点的最小公倍数 解法:不要真的写最小生成树啦,只要其他点和第一点相连,边的权值就是最小的,相加就好了 #include <bits/stdc++.h> using namespace std; #define ll long long int main() { int t,cnt=1; scanf("%d",&t); while(t-

2016CCPC东北地区大学生程序设计竞赛 - 重现赛 1008

链接http://acm.hdu.edu.cn/showproblem.php?pid=5929 题意:给你一种数据结构以及操作,和一种位运算,最后询问:从‘栈’顶到低的运算顺序结果是多少 解法:根据位运算,发现出现0,结果就是1,那么就记录两端0的位置就好,中间不管出现什么,结果大部分都是1,考虑还有反转操作,使用双端队列,用flag标记反转后的情况,然后根据需要添加元素记录位置,最后根据标记,出现元素等进行讨论计算 #include <iostream> #include <dequ

RunningMan【第六届福建省大学生程序设计竞赛-重现赛】

RunningMan Time Limit: 1000ms Memory Limit: 32768KB This problem will be judged on FZU. Original ID: 2221 64-bit integer IO format: %I64d      Java class name: Main Prev Submit Status Statistics Discuss Next ZB loves watching RunningMan! There's a ga

2017西安电子科技大学第十五届“华为杯”大学生程序设计竞赛网络赛

问题 B: 笑爷买房 时间限制: 1 Sec  内存限制: 128 MB提交: 456  解决: 116[提交][状态][讨论版] 题目描述 笑爷打算在北京三环买一套房. 现在笑爷手上有一些房源的户型图,她想知道每套房屋的室内面积是多少.房屋的墙壁由'#'表示,一平方米的地面由一个'*'表示.请统计被墙壁包围住的地面面积是多少平方米. 输入 一个由#和*组成的字符矩阵,行列数均不超过50.(不一定是矩形) 输出 输出房屋有多少平方米并换行. 样例输入 #*####### ##******# *#

ZZUOJ - 1245 - 寻找幸福的小L ( 郑州大学第八届ACM大学生程序设计竞赛正式赛F题)

1245: 寻找幸福的小L Time Limit: 1 Sec  Memory Limit: 128 MB Submit: 60  Solved: 14 [Submit][Status][Web Board] Description 小L最近看上了一个女同学叫小A,但是小A是个高冷的姑娘,所以她给小L出了个难题,她给小L留下了一张纸条,上面只有一个坐标,和一个时间,所以小L需要在规定时间找到这个坐标的地点,并在那个时间到哪个地点等待小A,但是很无奈,小L不是一个地理通,所以他找到了小A的室友,想