[BZOJ4207]Can
[BZOJ4207]Can
试题描述
输入
输出
对于每个case,输出一行,"Case #x: y z",x表示case标号(从1开始),y和z是答案区间的第一个和最后一个元素的下标。
输入示例
输出示例
Case #:
Case #:
Case #:
Case #:
数据规模及约定
题解
这是一道分治 + 暴搜的好题。
做法是这样的,我们在分治时考虑每次分治跨中点的部分,可以从中点开始向两边扩展,一旦遇到当前选的 k’ 个数不能搞掉的 roll set,就枚举一下选择这个 roll set 中的哪一个 die roll,然后接着向左右扩展。
最优性剪枝能剪掉不少情况。
#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cmath>
#include <stack>
#include <vector>
#include <queue>
#include <cstring>
#include <string>
#include <map>
#include <set>
using namespace std; const int BufferSize = 1 << 16;
char buffer[BufferSize], *Head, *Tail;
inline char Getchar() {
if(Head == Tail) {
int l = fread(buffer, 1, BufferSize, stdin);
Tail = (Head = buffer) + l;
}
return *Head++;
}
int read() {
int x = 0, f = 1; char c = Getchar();
while(!isdigit(c)){ if(c == '-') f = -1; c = Getchar(); }
while(isdigit(c)){ x = x * 10 + c - '0'; c = Getchar(); }
return x * f;
} #define maxn 100010
int n, D, K, A[maxn][4], num[maxn<<2]; bool has[maxn<<2];
int al, ar;
bool can(int p) {
for(int i = 0; i < D; i++) if(has[A[p][i]]) return 1;
return 0;
}
void dfs(int l, int r, int ql, int qr, int k) {
while(l >= ql && can(l)) l--;
while(r <= qr && can(r)) r++;
// printf("dfs: %d %d\n", l, r);
int len = r - l - 1;
if(len > ar - al + 1) al = l + 1, ar = r - 1;
if(len == ar - al + 1 && l + 1 < al) al = l + 1, ar = r - 1;
if(k == K) return ;
if(l < ql && r > qr) return ;
for(int i = 0; i < D; i++) {
if(l >= ql) has[A[l][i]] = 1, dfs(l - 1, r, ql, qr, k + 1), has[A[l][i]] = 0;
if(r <= qr) has[A[r][i]] = 1, dfs(l, r + 1, ql, qr, k + 1), has[A[r][i]] = 0;
}
return ;
}
void solve(int l, int r) {
if(ar - al + 1 > r - l + 1 || l > r) return ;
int mid = l + r >> 1;
// printf("[%d, %d] %d\n", l, r, mid);
dfs(mid, mid, l, r, 0);
solve(l, mid - 1); solve(mid + 1, r);
return ;
} int main() {
int T = read();
for(int kase = 1; kase <= T; kase++) {
n = read(); D = read(); K = read();
int cnt = 0;
for(int i = 0; i < n; i++)
for(int j = 0; j < D; j++) num[++cnt] = A[i][j] = read();
sort(num + 1, num + cnt + 1);
for(int i = 0; i < n; i++)
for(int j = 0; j < D; j++) A[i][j] = lower_bound(num + 1, num + cnt + 1, A[i][j]) - num;
al = ar = 0;
solve(0, n - 1);
printf("Case #%d: %d %d\n", kase, al, ar);
} return 0;
}
[BZOJ4207]Can的更多相关文章
随机推荐
- Relative path in absolute URI: ${system:java.io.tmpdir%7D/$%7Bhive.session.id%7D_resources
原因:环境变量设置问题 <property> <name>Hive.exec.local.scratchdir</name> <value> ...
- Android 仿百度医生的智能分诊界面
http://blog.csdn.net/jiang89125/article/details/49622853
- Jmeter官网文档翻译
Jmeter目录 入门 1.0概述 测试计划建设 负载测试运行 负载测试分析 开始吧 1.1要求 1.1.1 Java版本 1.1.2操作系统 1.2可选 1.2.1 Java编译器 1.2.2 SA ...
- 洛谷 P1765 手机_NOI导刊2010普及(10)
题目描述 一般的手机的键盘是这样的: 1 2 abc 3 def 4 ghi 5 jkl 6 mno 7 pqrs 8 tuv 9 wxyz * 0 # 要按出英文字母就必须要按数字键多下.例如要按出 ...
- 最简单的教程:在Ubuntu操作系统里安装Docker
Docker 是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的 Linux 机器上,也可以实现虚拟化.容器是完全使用沙箱机制,相互之间不会有任何 ...
- 【OpenCV】motion blur 的简单实现
先推荐界面比较丑,但是还不错的在线图片处理网站: http://www168.lunapic.com/editor/ 由于最近在做毕设了,结合前面关于图像处理和机器学习的操作,想做一些好玩的东西,其中 ...
- socket是什么?协议栈操作的抽象
http://www.cnblogs.com/airtcp/p/5230161.html TCP/IP只是一个协议栈,就像操作系统的运行机制一样,必须要具体实现,同时还要提供对外的操作接口.就像操作系 ...
- 解决for循环下变量显示一致的问题
for(var i=0;i<10;i++){ setTimeOut(function(){ console.log("i:",i); },100) } 上面显示的打印出来结果 ...
- 加快create-react-app的方法
npm config get registry 查看npm源,默认源是 https://registry.npmjs.org/ npm config set registry https://regi ...
- 日常[系统]:Linux新人报到(吐槽%&%……&¥……%
昨天换了系统,从win7换到了NOIP必须面对的Linux系统. 不得不说,真的很不适应.原本右上角的三个按钮变到了左上角. 可爱的DEVCPP被无情的抛弃了. 又用不惯guide,只好用文本编辑器写 ...