[Usaco2014 Open]Gold Fair Photography(hash)
最近做了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)的更多相关文章
- [BZOJ3535][Usaco2014 Open]Fair Photography
[BZOJ3535][Usaco2014 Open]Fair Photography 试题描述 FJ's N cows (1 <= N <= 100,000) are standing a ...
- BZOJ3540: [Usaco2014 Open]Fair Photography
3540: [Usaco2014 Open]Fair Photography Time Limit: 1 Sec Memory Limit: 128 MBSubmit: 72 Solved: 29 ...
- bzoj 3540: [Usaco2014 Open]Fair Photography
3540: [Usaco2014 Open]Fair Photography Description FJ's N cows (2 <= N <= 100,000) are standin ...
- poj3274 Gold Balanced Lineup(HASH)
Description Farmer John's N cows (1 ≤ N ≤ 100,000) share many similarities. In fact, FJ has been abl ...
- Gold Balanced Lineup(hash)
http://poj.org/problem?id=3274 ***** #include <stdio.h> #include <iostream> #include < ...
- P3105 [USACO14OPEN]公平的摄影Fair Photography
题意翻译 在数轴上有 NNN 头牛,第 iii 头牛位于 xi(0≤xi≤109)x_i\:(0\le x_i\le 10^9)xi(0≤xi≤109) .没有两头牛位于同一位置. 有两种牛:白牛 ...
- Fair Photography
题目大意: 给出直线上N个点的位置和颜色(0或1),求最大的区间,使得区间内0的个数大于等于1的个数且0的个数减去1的个数为偶数. 解题过程: 1.先贴个lsdsjy大牛的线段树的做法:http:// ...
- [Usaco2014 Open Gold ]Cow Optics (树状数组+扫描线/函数式线段树)
这道题一上手就知道怎么做了= = 直接求出原光路和从目标点出发的光路,求这些光路的交点就行了 然后用树状数组+扫描线或函数式线段树就能过了= = 大量的离散+模拟+二分什么的特别恶心,考试的时候是想到 ...
- 解题:USACO14OPEN Fair Photography
题面 有点像JRY的那道序列题,大概是统计题的经典套路? 先说无修改的:将白奶牛记为$-1$,花奶牛记为$1$,然后做前缀和统计某个前缀和$sum$第一次出现的位置,之后再出现就统计答案.对于修改(将 ...
随机推荐
- leetcode day8
[83] Remove Duplicates from Sorted List Given a sorted linked list, delete all duplicates such that ...
- limesurvey设置短调查问卷url
If you want to use fancy URLs and so not have /index.php in every URL please edit /application/confi ...
- MySQL-基本sql命令
关于环境的搭建和数据库的连接,我直接跳过,假设电脑上已经安装好了MySQL的环境,接下来直接进行数据库的操作:(虽然数据库不区分大小写,但是本文约定:命令用大写,用户变量和字段用小写) 1.创建数据库 ...
- UVa 573 - The Snail
题目大意:有一只蜗牛位于深一个深度为h米的井底,它白天向上爬u米,晚上向下滑d米,由于疲劳原因,蜗牛白天爬的高度会比上一天少f%(总是相对于第一天),如果白天爬的高度小于0,那么这天它就不再向上爬,问 ...
- Struts2配置dtd约束
Struts2和Struts1的区别: 一.elclipse-ee开发 搭建环境eclipse-ee 1.加入jar包 apps/struts2-blank.war解压 2.在web.xml文件中配 ...
- java系列--JDBC连接oracle
<oracle开发实战经典><oracle DBA从入门到精通> JDBC连接数据库 JNDI连接池 oracle.jdbc.driver.OracleDriver 其实就是一 ...
- PHP加水印代码 支持文字和图片水印
PHP加图片水印.文字水印类代码,PHP加水印类,支持文字图片水印的透明度设置.水印图片背景透明.自己写的一个类,因为自己开发的一套CMS中要用到,网上的总感觉用着不顺手,希望大家也喜欢这个类,后附有 ...
- mysql常用博客论坛
大神博客: starive的博客:http://blog.itpub.net/26435490/viewspace-1133659/ 北在南方的博客:http://blog.itpub.net/226 ...
- phpcms v9文章页调用点击量方法
1.在页面加载" 2.调用统计点击的标签:: 3.最后,在写上这一句:" phpcms v9增加文章随机点击数的方法 找到文件count.php(网站根目录/api) 查找第50行 ...
- Spring @Aspect进行类的接口扩展
Spring @Aspect进行类的接口扩展: XML: <?xml version="1.0" encoding="UTF-8"?> <be ...