1926: [Sdoi2010]粟粟的书架

大概就是分情况乱搞。。
经典维护二维前缀和暴力+莫队算法
垫底QAQ
#include <bits/stdc++.h>
using namespace std;
namespace my_useful_tools {
#define rep(_i, _k, _j) for(int _i = _k; _i <= _j; ++_i)
#define foreach(_i, _s) for(typeof(_s.begin()) _i = _s.begin(); _i != _s.end(); ++_i)
#define pb push_back
#define mp make_pair
#define ipir pair<int, int>
#define ivec vector<int>
#define clr(t) memset(t, 0, sizeof t)
#define pse(t, v) memset(t, v, sizeof t)
#define brl puts("")
#define file(x) freopen(#x".in", "r", stdin), freopen(#x".out", "w", stdout)
const int INF = 0x3f3f3f3f;
typedef long long LL;
typedef double DB;
inline void pc(char c) { putchar(c); }
template<class T> inline T gcd(T a, T b) { return b == 0 ? a : gcd(b, a % b); }
template<class T> inline void W(T p) { if(p < 0) pc('-'), p = -p; if(p / 10 != 0) W(p / 10); pc('0' + p % 10); } // warning!! slower than printf
template<class T> inline void Wn(T p) { W(p), brl; } template<class T> inline void W(T a, T b) { W(a), pc(' '), W(b); }
template<class T> inline void Wn(T a, T b) { W(a), pc(' '), Wn(b); }
template<class T> inline void W(T a, T b, T c) { W(a), pc(' '), W(b), pc(' '), W(c); }
inline char gchar() { char ret = getchar(); for(; ret == '\n' || ret == '\r' || ret == ' '; ret = getchar()); return ret; }
template<class T> inline void fr(T&ret) { char c = ' '; int flag = 1; for(c = getchar(); c != '-' && !('0' <= c && c <= '9'); c = getchar());
if(c == '-') flag = -1, ret = 0; else ret = c - '0'; for(c = getchar(); '0' <= c && c <= '9'; c = getchar()) ret = ret * 10 + c - '0';
ret = ret * flag;
}
inline int fr() { int x; fr(x); return x; }
template<class T> inline void fr(T&a, T&b) { fr(a), fr(b); } template<class T> inline void fr(T&a, T&b, T&c) { fr(a), fr(b), fr(c); }
template<class T> inline T fast_pow(T base, T index, T mod = 2147483647, T ret = 1) {
for(; index; index >>= 1, base = base * base % mod) if(index & 1) ret = ret * base % mod;
return ret;
}
const int maxv = 100, maxe = 100;
struct Edge {
int edge, head[maxv], to[maxe], next[maxe];
Edge() { edge = 0; memset(head, -1, sizeof head); }
void addedge(int u, int v) {
to[edge] = v, next[edge] = head[u];
head[u] = edge++;
}
};
};
using namespace my_useful_tools;
int r, c, m;
class matrixCase {
static const int maxSize = 200 + 10;
static const int maxColor = 1000 + 10;
int sum[maxSize][maxSize][maxColor];
public:
void solve() {
for(int i = 1; i <= r; ++i)
for(int j = 1; j <= c; ++j)
++sum[i][j][fr()];
for(int i = 1; i <= r; ++i)
for(int j = 1; j <= c; ++j)
for(int k = 1000; 0 < k; --k)
sum[i][j][k] += sum[i - 1][j][k] + sum[i][j - 1][k] - sum[i - 1][j - 1][k];
while(m--) {
int x, y, a, b, need, use = 0;
fr(x, y), fr(a, b, need);
for(int i = 1000; 0 < i; --i) {
int val = sum[a][b][i] + sum[x - 1][y - 1][i] - sum[a][y - 1][i] - sum[x - 1][b][i];
if(val * i < need) {
need -= val * i, use += val;
} else {
use += (need - 1) / i + 1;
printf("%d\n", use);
need = 0;
break;
}
}
if(need) puts("Poor QLW");
}
}
};
int pos[500000 + 100];
class lineCase {
static const int maxSize = 500000 + 100;
static const int maxQuery = 20000 + 100;
public:
int sum[maxSize], ans[maxQuery], a[maxSize];
struct QueryInfo {
int l, r, need, id;
void read(int _id) {
fr(id, l), fr(id, r, need), id = _id;
}
bool operator < (const QueryInfo&rhs) const {
return pos[l] < pos[rhs.l] || (pos[l] == pos[rhs.l] && r < rhs.r);
}
} q[maxQuery];
void solve() {
int blockSize = (int)sqrt((DB)c + 0.5);
rep(i, 1, m) pos[i] = (i - 1) / blockSize + 1;
rep(i, 1, c) fr(a[i]);
for(int i = 1; i <= m; ++i) q[i].read(i);
sort(q + 1, q + m + 1);
int l = 1, r = 0;
clr(sum);
for(int i = 1; i <= m; ++i) {
while(l < q[i].l) --sum[a[l++]];
while(r < q[i].r) ++sum[a[++r]];
while(q[i].l < l) ++sum[a[--l]];
while(q[i].r < r) --sum[a[r--]];
int use = 0;
for(int k = 1000; 0 < k && q[i].need; --k) {
if(sum[k] * k < q[i].need) q[i].need -= sum[k] * k, use += sum[k];
else {
use += (q[i].need - 1) / k + 1;
q[i].need = 0;
}
}
// printf("%d\n", use);
ans[q[i].id] = (q[i].need == 0) ? use : -1;
}
rep(i, 1, m) {
if(ans[i] == -1) {
puts("Poor QLW");
} else {
printf("%d\n", ans[i]);
}
}
}
};
int main() {
fr(r, c, m);
if(r != 1) {
(new matrixCase)->solve();
} else {
(new lineCase)->solve();
}
return 0;
}
1926: [Sdoi2010]粟粟的书架的更多相关文章
- bzoj 1926: [Sdoi2010]粟粟的书架 (主席树+二分)
链接:https://www.lydsy.com/JudgeOnline/problem.php?id=1926 题面; 1926: [Sdoi2010]粟粟的书架 Time Limit: 30 Se ...
- Bzoj 1926: [Sdoi2010]粟粟的书架(二分答案+乱搞+主席树)
1926: [Sdoi2010]粟粟的书架 Time Limit: 30 Sec Memory Limit: 552 MB Description 幸福幼儿园 B29 班的粟粟是一个聪明机灵.乖巧可爱 ...
- 【刷题】BZOJ 1926 [Sdoi2010]粟粟的书架
Description 幸福幼儿园 B29 班的粟粟是一个聪明机灵.乖巧可爱的小朋友,她的爱好是画画和读书,尤其喜欢 Thomas H. Cormen 的文章.粟粟家中有一个 R行C 列的巨型书架,书 ...
- bzoj1926[Sdoi2010]粟粟的书架 二分 主席树
1926: [Sdoi2010]粟粟的书架 Time Limit: 30 Sec Memory Limit: 552 MBSubmit: 1064 Solved: 421[Submit][Stat ...
- BZOJ1926:[SDOI2010]粟粟的书架——题解
http://www.lydsy.com/JudgeOnline/problem.php?id=1926 https://www.luogu.org/problemnew/show/P2468 幸福幼 ...
- [bzoj1926][Sdoi2010]粟粟的书架_二分_主席树
粟粟的书架 bzoj-1926 Sdoi-2010 题目大意:题目链接 注释:略 想法:分成两个题 前面的我们可以二分,直接二分出来检验即可. 对于R=1的,相当一个数列,我们在上面建立主席树. 然后 ...
- [SDOI2010]粟粟的书架 [主席树]
[SDOI2010]粟粟的书架 考虑暴力怎么做 显然是提取出来 (x2-x1+1)*(y2-y1+1) 个数字拿出来 然后从大到小排序 然后就可以按次取数了- 然而接下来看数据范围 \(50\%\ r ...
- [BZOJ1926][SDOI2010]粟粟的书架
BZOJ Luogu Description 幸福幼儿园 B29 班的粟粟是一个聪明机灵.乖巧可爱的小朋友,她的爱好是画画和读书,尤其喜欢 Thomas H. Cormen 的文章.粟粟家中有一个 R ...
- BZOJ1926[Sdoi2010]粟粟的书架——二分答案+主席树
题目描述 幸福幼儿园 B29 班的粟粟是一个聪明机灵.乖巧可爱的小朋友,她的爱好是画画和读书,尤其喜欢 Thomas H. Co rmen 的文章.粟粟家中有一个 R行C 列的巨型书架,书架的每一个位 ...
- 【BZOJ1926】【SDOI2010】粟粟的书架 [主席树]
粟粟的书架 Time Limit: 30 Sec Memory Limit: 552 MB[Submit][Status][Discuss] Description 幸福幼儿园 B29 班的粟粟是一 ...
随机推荐
- Broker流量均衡 prefer reassign
0.均衡流量的步骤 现在的kafka集群,只要遇到过weibo_common_act2 topic的节点在ZK中丢失,就要prefer一次流量,否则不均匀. 总结均衡流量的一般步骤: 通过hpm查询b ...
- struct和typedef struct区别
分三块来讲述: 1 首先://注意在C和C++里不同 在C中定义一个结构体类型要用typedef: typedef struct Student { int a; }Stu; 于是在声明变量的时候就可 ...
- js判断当前浏览器是pc端还是移动端
根据用户的访问设备的不同来显示不同的页面样式,主要是判断移动设备还是电脑浏览器访问的. 下面给出js判断处理代码,以作参考. <script type="text/javascript ...
- 【leetcode 简单】 第六十九题 删除链表中的节点
请编写一个函数,使其可以删除某个链表中给定的(非末尾)节点,你将只被给定要求被删除的节点. 现有一个链表 -- head = [4,5,1,9],它可以表示为: 4 -> 5 -> 1 - ...
- 42、Java装饰者设计模式
设计模式简介 什么是设计模式?设计模式是可以重复利用的解决方案.软件开发的先驱或者前辈们将之前在开发中遇到的问题进行总结并给出了解决方案,后辈在遇到这些问题之后直接使用这些方案即可解决问题.比如盖高楼 ...
- 下拉框 select
1.select 用来做什么? select 用于实现下来下拉列表,其 html 结构是这样的: <select name="city" id="city" ...
- Ping程序的实现
Ping程序的实现 在windows系统下进行cmd可以进行ping操作. ping命令是用来确定本地主机与网络中其他主机的网络通信情况,或者查看是否是为效IP. ping的工作原理:网络另一主机发送 ...
- linux 配置免密码登陆
在使用scp命令传输的时候需要密码 配置免密码登陆 ssh-keygen -t rsa (四个回车) 执行命令完成后,会生成两个文件id_rsa(私钥).id-rsa.pub(公钥) 将公钥拷贝到要免 ...
- Python图片验证码降噪 — 8邻域降噪
简介 图片验证码识别的可以分为几个步骤,一般用 Pillow 库或 OpenCV 来实现,这几个过程是: 1.灰度处理&二值化 2.降噪 3.字符分割 4.标准化 5.识别 所谓降噪就是把不需 ...
- 【驱动】USB驱动·入门【转】
转自:http://www.cnblogs.com/lcw/p/3159371.html Preface USB是目前最流行的系统总线之一.随着计算机周围硬件的不断扩展,各种设备使用不同的总线接口,导 ...