bzoj 1702 贪心,前缀和

[Usaco2007 Mar]Gold Balanced Lineup 平衡的队列

Time Limit: 5 Sec  Memory Limit: 64 MB
Submit: 807  Solved: 317
[Submit][Status][Discuss]

Description

Farmer John‘s N cows (1 <= N <= 100,000) share many similarities. In fact, FJ has been able to narrow down the list of features shared by his cows to a list of only K different features (1 <= K <= 30). For example, cows exhibiting feature #1 might have spots, cows exhibiting feature #2 might prefer C to Pascal, and so on. FJ has even devised a concise way to describe each cow in terms of its "feature ID", a single K-bit integer whose binary representation tells us the set of features exhibited by the cow. As an example, suppose a cow has feature ID = 13. Since 13 written in binary is 1101, this means our cow exhibits features 1, 3, and 4 (reading right to left), but not feature 2. More generally, we find a 1 in the 2^(i-1) place if a cow exhibits feature i. Always the sensitive fellow, FJ lined up cows 1..N in a long row and noticed that certain ranges of cows are somewhat "balanced" in terms of the features the exhibit. A contiguous range of cows i..j is balanced if each of the K possible features is exhibited by the same number of cows in the range. FJ is curious as to the size of the largest balanced range of cows. See if you can determine it.

N(1<=N<=100000)头牛,一共K(1<=K<=30)种特色,
每头牛有多种特色,用二进制01表示它的特色ID。比如特色ID为13(1101),
则它有第1、3、4种特色。[i,j]段被称为balanced当且仅当K种特色在[i,j]内
拥有次数相同。求最大的[i,j]段长度。

Input

* Line 1: Two space-separated integers, N and K.

* Lines 2..N+1: Line i+1 contains a single K-bit integer specifying the features present in cow i. The least-significant bit of this integer is 1 if the cow exhibits feature #1, and the most-significant bit is 1 if the cow exhibits feature #K.

Output

* Line 1: A single integer giving the size of the largest contiguous balanced group of cows.

Sample Input

7 3
7
6
7
2
1
4
2

INPUT DETAILS:

The line has 7 cows with 3 features; the table below summarizes the
correspondence:
Feature 3: 1 1 1 0 0 1 0
Feature 2: 1 1 1 1 0 0 1
Feature 1: 1 0 1 0 1 0 0
Key: 7 6 7 2 1 4 2
Cow #: 1 2 3 4 5 6 7

Sample Output

4

OUTPUT DETAILS:

In the range from cow #3 to cow #6 (of size 4), each feature appears
in exactly 2 cows in this range:
Feature 3: 1 0 0 1 -> two total
Feature 2: 1 1 0 0 -> two total
Feature 1: 1 0 1 0 -> two total
Key: 7 2 1 4
Cow #: 3 4 5 6

HINT

鸣谢fjxmyzwd

Source

Gold

题解:多维的前缀和。

 1 #include<iostream>
 2 #include<cstring>
 3 #include<algorithm>
 4 #include<cmath>
 5 #include<cstdio>
 6 using namespace std;
 7
 8 int k;
 9 int hash[100007][34],mod=100007,a[100001][31],s[100001][31];
10
11 inline bool check(int t,int xt)
12 {
13      int i;
14      bool flag=true;
15      for(i=0;i<=k-1;i++)
16           if(s[xt][i]!=hash[t][i])
17                return false;
18      return true;
19 }
20 inline int find(int x,int xt,int xp)
21 {
22      int t=x;
23      while(hash[t][32]!=-1)
24      {
25           if(!check(t,xt)) t=(t+1)%mod;
26           else break;
27      }
28      if(hash[t][32]==-1)
29      {
30           int i;
31           for(i=0;i<=k-1;i++)
32                hash[t][i]=s[xt][i];
33           hash[t][33]=xp;
34           hash[t][32]=1;
35           return xp;
36      }
37      return hash[t][33];
38 }
39 int main()
40 {
41      int n;
42      scanf("%d%d",&n,&k);
43      int i,j;
44      int x;
45      for(i=1;i<=n;i++)
46      {
47           scanf("%d",&x);
48           int p=0;
49           while(x!=0)
50           {
51                  a[i][p]=x%2;
52                x=x/2;
53                p++;
54           }
55      }
56      for(i=1;i<=n;i++)
57           for(j=0;j<=k-1;j++)
58                s[i][j]=s[i-1][j]+a[i][j];
59      for(i=1;i<=n;i++)
60           for(j=k-1;j>=0;j--)
61                s[i][j]-=s[i][0];
62      memset(hash,-1,sizeof(hash));
63      int ans=0;
64      for(i=0;i<=n;i++)
65      {
66            int p=0;
67           for(j=k-1;j>=0;j--)
68           {
69                p=(p*4+s[i][j])%mod;
70                while(p<0)
71                     p=-p;
72           }
73           int loc=find(p,i,i);
74           ans=max(ans,i-loc);
75      }
76      printf("%d\n",ans);
77 }
时间: 2024-10-08 15:57:36

bzoj 1702 贪心,前缀和的相关文章

bzoj 1193 贪心

如果两点的曼哈顿距离在一定范围内时我们直接暴力搜索就可以得到答案,那么开始贪心的跳,判断两点横纵坐标的差值,差值大的方向条2,小的条1,不断做,直到曼哈顿距离较小时可以暴力求解. 备注:开始想的是确定一点周围跳到这个点的答案,然后再枚举周围的点,判断这个点和另一个点的曼哈顿距离,如果能被3整除就说明之前可以一直跳过来,不知道怎么不对. /************************************************************** Problem: 1193 Use

bzoj 1029 贪心

贪心的一种,维护一种尽可能优的状态(即不会比最优解差),将这种状态保持到最后. 1 /************************************************************** 2 Problem: 1029 3 User: idy002 4 Language: C++ 5 Result: Accepted 6 Time:400 ms 7 Memory:2368 kb 8 *********************************************

bzoj 2563 贪心 思想

2563: 阿狸和桃子的游戏 Time Limit: 3 Sec  Memory Limit: 128 MBSubmit: 952  Solved: 682[Submit][Status][Discuss] Description 阿狸和桃子正在玩一个游戏,游戏是在一个带权图G=(V, E)上进行的,设节点权值为w(v),边权为c(e).游戏规则是这样的: 1. 阿狸和桃子轮流将图中的顶点染色,阿狸会将顶点染成红色,桃子会将顶点染成粉色.已经被染过色的点不能再染了,而且每一轮都必须给一个且仅一个

[贪心][前缀和] JZOJ P1795 教主的别墅

Description [题目背景] LHX教主身为宇宙第一富翁,拥有一栋富丽堂皇的别墅,由于别墅实在太大了,于是教主雇佣了许许多多的人来负责别墅的卫生工作,我们不妨称这些人为LHXee. [题目描述] 教主一共雇佣了N个LHXee,这些LHXee有男有女. 教主的大别墅一共有M个房间,现在所有的LHXee在教主面前排成了一排.教主要把N个LHXee分成恰好M个部分,每个部分在队列中都是连续的一段,然后分别去打扫M个房间. 教主身为全世界知识最渊博的人,他当然知道男女搭配干活不累的道理,以及狼多

bzoj 1702: [Usaco2007 Mar]Gold Balanced Lineup 平衡的队列【hash】

我%&&--&()&%????? 双模hashWA,unsigned long longAC,而且必须判断hash出来的数不能为0???? 我可能学了假的hash 这个题求个前缀和,然后目标是找到距离当前位置最远,且能使这两个数组差分后2-k位相同 hash把差分后数组的2到k位压起来即可,用map存这个hash值最早出现的位置 但是我还是不明白为啥hash值不能为0啊?? #include<iostream> #include<cstdio> #i

[贪心][前缀和] Jzoj P4256 平均数

Description 给出包含一个N个整数的数组A.找出一段长度至少为K的连续序列,最大化它的平均值.请注意:一段子序列的平均值是子序列中所有数的和除以它的长度. Input 第一行包含两个整数N(1<=N<=300000),K(1<=K<=N). 第二行包含N个整数,代表数组A,1<=ai<=10^6. Output 一行一个实数,代表最大的平均值.允许在0.001以内的绝对误差. Sample Input 输入1:4 11 2 3 4输入2:4 22 4 3 4输

bzoj 3671 贪心

想到了从小到大依次填,但想到可能有重复元素,那是就会有分支,就不知怎样办了,最后才发现它是用随机数来调整排列,所以没有重复元素,唉..... 1 /************************************************************** 2 Problem: 3671 3 User: idy002 4 Language: C++ 5 Result: Accepted 6 Time:39644 ms 7 Memory:196984 kb 8 **********

bzoj 1110 贪心 + 进制转换

思路:感觉脑洞好大啊... 因为每两个砝码其中一个都是另一个的倍数,我们可以知道砝码的种数很少,我们将所有容器的 容量都转换成用这些砝码的重量的进制表示,然后将所有砝码排序,然后贪心地取,取到不能再取. #include<bits/stdc++.h> #define LL long long #define fi first #define se second #define mk make_pair #define pii pair<int, int> using namespa

Codeforces 578B Or Game (前缀和 + 贪心)

Codeforces Round #320 (Div. 1) [Bayan Thanks-Round] 题目链接:B. "Or" Game You are given \(n\) numbers \(a_1,?a_2,?...,?a_n\). You can perform at most \(k\) operations. For each operation you can multiply one of the numbers by \(x\). We want to make