最近做了usaco2014 open的金组,果然美帝的题还是没有太简单啊QAQ,被每年的月赛骗了QAQ

不过话说官方题解真心棒(虽然英文的啃得好艰难,我英语渣你们别鄙视我= =),标程超级优美QAQ

按照标程打,学到了好多STL的用法= =(没办法,我c++底子弱)

这道题嘛,可以发现对于每个区间,只要左边界确定,可能的集合就一共只有8种了

考虑前缀和,发现若L~R为可行解,则对于所有种类的牛,有S[R]-S[L]=K或0

如何防止枚举K,可以发现在该集合中B的s[L][bi]减去s[L][b0]就行了

那么就hash,枚举集合B,求出hash值,直接做就行了

CODE:(直接贴标程了,Map真的用的是神出鬼没啊QAQ)

#include <iostream>
#include <vector>
#include <algorithm>
#include <cstring>
#include <cstdio>
#include <cassert>
#include <map> using namespace std; #define MAXN 100010
#define GROUPS 8 int MB[MAXN][GROUPS];
int MF[MAXN][GROUPS];
int PS[MAXN][GROUPS]; int main() {
freopen("fairphoto.in", "r", stdin);
freopen("fairphoto.out", "w", stdout); int N, K; cin >> N >> K;
vector<pair<int, int> > A(N);
for(int i = 0; i < N; i++) {
cin >> A[i].first >> A[i].second;
A[i].second--;
}
sort(A.begin(), A.end()); /* Construct backstep masks */
for(int i = 0; i < GROUPS; i++) {
MB[0][i] = 1 << A[0].second;
}
for(int i = 1; i < N; i++) {
int bt = 1 << A[i].second; MB[i][0] = bt;
for(int j = 1; j < GROUPS; j++) {
if(MB[i - 1][j] & bt) {
MB[i][j] = MB[i - 1][j];
} else {
MB[i][j] = bt | MB[i - 1][j - 1];
}
}
} /* Construct forward step masks */
for(int i = 0; i < GROUPS; i++) {
MF[N - 1][i] = 1 << A[N - 1].second;
}
for(int i = N - 2; i >= 0; i--) {
int bt = 1 << A[i].second; MF[i][0] = bt;
for(int j = 1; j < GROUPS; j++) {
if(MF[i + 1][j] & bt) {
MF[i][j] = MF[i + 1][j];
} else {
MF[i][j] = bt | MF[i + 1][j - 1];
}
}
} /* Construct partial sums */
for(int i = 0; i < N; i++) {
memcpy(PS[i + 1], PS[i], sizeof(PS[i]));
++PS[i + 1][A[i].second];
} int result = -1;
for(int j = K - 1; j < GROUPS; j++) {
vector<int> V(1 + GROUPS);
map<vector<int>, int> cost_map; /* Compute the earliest starts for given masks
* and normalized partial sums. */
for(int i = N - 1; i >= 0; i--) {
int base = -1;
int m = V[GROUPS] = MF[i][j];
if(__builtin_popcount(m) <= j) continue;
for(int k = 0; k < GROUPS; k++) {
if(m & 1 << k) {
if(base == -1) {
base = PS[i][k];
}
V[k] = PS[i][k] - base;
} else {
V[k] = PS[i][k];
}
}
cost_map[V] = A[i].first;
} /* Find best start points for each ending position. */
for(int i = 0; i < N; i++) {
int base = -1;
int m = V[GROUPS] = MB[i][j];
if(__builtin_popcount(m) <= j) continue;
for(int k = 0; k < GROUPS; k++) {
if(m & 1 << k) {
if(base == -1) {
base = PS[i + 1][k];
}
V[k] = PS[i + 1][k] - base;
} else {
V[k] = PS[i + 1][k];
}
} map<vector<int>, int>::iterator it = cost_map.find(V);
if(it != cost_map.end() && it->second < A[i].first) {
result = max(result, A[i].first - it->second);
}
}
} cout << result << endl;
return 0;
}

[Usaco2014 Open]Gold Fair Photography(hash)的更多相关文章

  1. [BZOJ3535][Usaco2014 Open]Fair Photography

    [BZOJ3535][Usaco2014 Open]Fair Photography 试题描述 FJ's N cows (1 <= N <= 100,000) are standing a ...

  2. BZOJ3540: [Usaco2014 Open]Fair Photography

    3540: [Usaco2014 Open]Fair Photography Time Limit: 1 Sec  Memory Limit: 128 MBSubmit: 72  Solved: 29 ...

  3. bzoj 3540: [Usaco2014 Open]Fair Photography

    3540: [Usaco2014 Open]Fair Photography Description FJ's N cows (2 <= N <= 100,000) are standin ...

  4. poj3274 Gold Balanced Lineup(HASH)

    Description Farmer John's N cows (1 ≤ N ≤ 100,000) share many similarities. In fact, FJ has been abl ...

  5. Gold Balanced Lineup(hash)

    http://poj.org/problem?id=3274 ***** #include <stdio.h> #include <iostream> #include < ...

  6. P3105 [USACO14OPEN]公平的摄影Fair Photography

    题意翻译 在数轴上有 NNN 头牛,第 iii 头牛位于 xi(0≤xi≤109)x_i\:(0\le x_i\le 10^9)xi​(0≤xi​≤109) .没有两头牛位于同一位置. 有两种牛:白牛 ...

  7. Fair Photography

    题目大意: 给出直线上N个点的位置和颜色(0或1),求最大的区间,使得区间内0的个数大于等于1的个数且0的个数减去1的个数为偶数. 解题过程: 1.先贴个lsdsjy大牛的线段树的做法:http:// ...

  8. [Usaco2014 Open Gold ]Cow Optics (树状数组+扫描线/函数式线段树)

    这道题一上手就知道怎么做了= = 直接求出原光路和从目标点出发的光路,求这些光路的交点就行了 然后用树状数组+扫描线或函数式线段树就能过了= = 大量的离散+模拟+二分什么的特别恶心,考试的时候是想到 ...

  9. 解题:USACO14OPEN Fair Photography

    题面 有点像JRY的那道序列题,大概是统计题的经典套路? 先说无修改的:将白奶牛记为$-1$,花奶牛记为$1$,然后做前缀和统计某个前缀和$sum$第一次出现的位置,之后再出现就统计答案.对于修改(将 ...

随机推荐

  1. Vector类

    /* * Vector的特有功能 * * Vector出现较早,比集合更早出现 * * 1:添加功能 * public void addElement(Object obj);//用add()替代 * ...

  2. 安卓 ArrayList,LinkedList,HashSet,Vector,TreeSet的区别和使用

    java的集合就那么几种 总体为:List,Set,Map (都是接口由其子类去实现具体的方法) ArrayList,LinkedList,Vector都属于List List:元素是有顺序的,元素可 ...

  3. System.Web.UI.WebControls的Web服务器控件

    calendar[英][ˈkælɪndə(r)][美][ˈkæləndɚ]n.日历; 历法; 日程表; (一年之中的)重大事件(或重要日期)一览表; vt.把…记入日程表中; 把…列入表中; 为(文件 ...

  4. 不错的Django技术网址

    Ajax与json需要看得 http://stackoverflow.com/questions/30243101/return-queryset-as-json

  5. python中使用urllib2伪造HTTP报头的2个方法

    在采集网页信息的时候,经常需要伪造报头来实现采集脚本的有效执行 下面,我们将使用urllib2的header部分伪造报头来实现采集信息 方法1. ? 1 2 3 4 5 6 7 8 9 10 11 1 ...

  6. 移动硬盘/U盘装Windows 7旗舰版(VHD版)

    真正的移动版WIN7,在移动硬盘/U盘上运行的WIN7 工具准备 - 联想Y450本本,已安装Windows 7旗舰版(或者WINPE3.0版),用来给移动WIN7做引导 -Win7.vhd,15G, ...

  7. Spark编程进阶

    1.累加器             通常在向Spark传递函数时,比如使用map()函数或者用filter()传条件是,可以使用驱动器程序中定义的变量,但是集群中运行的每个人物都会得到这些变量的一份新 ...

  8. iOS 之 通知

    步骤一,注册消息: [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(getUserProfileSu ...

  9. YII 数据库,模型,登录验证

    //protected/config/main.php //数据库连接设置 'db'=>array( 'connectionString' => 'mysql:host=localhost ...

  10. 在DataTable数据类型最后增加一列,列名为“Column”,内容都为“AAA”

    DataTable dt = new DataTable(); dt.Columns.Add("Column", typeof(string)); foreach (DataRow ...