NOIP模拟 Work - 二分 + 树状数组 / ???

题目分析
如果没有最后的注意事项,此题就是二分裸题。有了注意事项,会有两种思路:
- 在线:二分天数t,并在主席树上求1~t天中大于d(浪费的时间)的时间之和以及数量,答案即为:sum - d * cnt 无奈写的丑,卡卡只能过6、7个点。
- 离线:简单考虑,既然要求大于等于d的和以及数量,不妨按照d来排序,再把t也排序。每次将大于等于d的t加入树状数组(记录和以及数量),这样就能直接查出和和数量。 AC。
code
树状数组 AC
#include<bits/stdc++.h>
using namespace std;
const int N = 200005, M = 1000005;
typedef long long ll;
int n, m, anss[N];
int pointer;
typedef pair<int, int> P;
typedef pair<ll, int> ansP;
P t[N];
struct BIT{
ll sum[N], cnt[N];
inline void add(int x, ll v, int c){
for(int i = x; i <= m; i += (i&-i))
sum[i] += v, cnt[i] += c;
}
inline ansP query(int x){
ansP ret = P(0, 0);
for(int i = x; i; i -= (i&-i))
ret.first += sum[i], ret.second += cnt[i];
return ret;
}
}bit;
struct node{
int d, r, id;
inline bool operator < (const node &b) const{
return d < b.d;
}
}s[N];
inline int read(){
int i = 0, f = 1; char ch = getchar();
for(; (ch < '0' || ch > '9') && ch != '-'; ch = getchar());
if(ch == '-') f = -1, ch = getchar();
for(; ch >= '0' && ch <= '9'; ch = getchar()) i = (i << 3) + (i << 1) + (ch -'0');
return i * f;
}
inline void wr(int x){
if(x < 0) putchar('-'), x = -x;
if(x > 9) wr(x / 10);
putchar(x % 10 + '0');
}
inline bool calc(int mid, int d, int r){
ansP tmp = bit.query(mid);
ll ret = tmp.first - 1LL * d * tmp.second;
return ret >= r;
}
int main(){
n = read(), m = read();
for(int i = 1; i <= m; i++) t[i].first = read(), t[i].second = i;
for(int i = 1; i <= n; i++) s[i].d = read(), s[i].r = read(), s[i].id = i;
sort(t + 1, t + m + 1), sort(s + 1, s + n + 1);
pointer = m;
for(int i = n; i >= 1; i--){
while(t[pointer].first >= s[i].d && pointer >= 1) bit.add(t[pointer].second, t[pointer].first, 1), pointer--;
int l = 1, r = m, ans = 0;
while(l <= r){
int mid = l + r >> 1;
if(calc(mid, s[i].d, s[i].r)) ans = mid, r = mid - 1;
else l = mid + 1;
}
anss[s[i].id] = ans;
}
for(int i = 1; i <= n; i++) wr(anss[i]), putchar(' ');
return 0;
}
主席树 50 ~ 60
#include<bits/stdc++.h>
using namespace std;
const int N = 200005, M = 1000005;
typedef long long ll;
struct node{
node *lc, *rc;
ll sum, cnt;
inline void upt(){
sum = lc->sum + rc->sum;
cnt = lc->cnt + rc->cnt;
}
}pool[N * 20], *tail = pool, *null = pool, *rt[N];
int maxx = -1;
typedef pair<ll, ll> ansP;
int n, m, d[N], rr[N];
int t[N], b[N * 2], len;
ll tsum[N];
inline int read(){
int i = 0, f = 1; char ch = getchar();
for(; (ch < '0' || ch > '9') && ch != '-'; ch = getchar());
if(ch == '-') f = -1, ch = getchar();
for(; ch >= '0' && ch <= '9'; ch = getchar()) i = (i << 3) + (i << 1) + (ch -'0');
return i * f;
}
inline void wr(int x){
if(x < 0) putchar('-'), x = -x;
if(x > 9) wr(x / 10);
putchar(x % 10 + '0');
}
inline void insert(node *x, node *&y, int l, int r, int v){
y = ++tail;
y->lc = x->lc, y->rc = x->rc;
y->sum = x->sum, y->cnt = x->cnt;
y->sum += b[v];
y->cnt++;
if(l == r) return;
int mid = l + r >> 1;
if(v <= mid) insert(x->lc, y->lc, l, mid, v);
else insert(x->rc, y->rc, mid + 1, r, v);
y->upt();
}
inline ansP query(node *nl, node *nr, int l, int r, int x, int y){
if(x <= l && r <= y) return ansP(nr->sum - nl->sum, nr->cnt - nl->cnt);
int mid = l + r >> 1;
ansP ret = ansP(0, 0);
if(x <= mid){
ansP tmp = query(nl->lc, nr->lc, l, mid, x, y);
ret.first += tmp.first;
ret.second += tmp.second;
}
if(y > mid){
ansP tmp = query(nl->rc, nr->rc, mid + 1, r, x, y);
ret.first += tmp.first;
ret.second += tmp.second;
}
return ret;
}
bool flag;
inline bool calc(int mid, int d, int r){
ansP tmp = query(rt[0], rt[mid], 1, maxx, d, maxx);
ll ret = tmp.first - 1LL * b[d] * tmp.second;
return ret >= r;
}
inline void disc_init(){
sort(b + 1, b + len + 1);
len = unique(b + 1, b + len + 1) - (b + 1);
for(int i = 1; i <= m; i++) t[i] = lower_bound(b + 1, b + len + 1, t[i]) - b;
for(int i = 1; i <= n; i++) d[i] = lower_bound(b + 1, b + len + 1, d[i]) - b;
}
int main(){
freopen("h.in", "r", stdin);
ios::sync_with_stdio(false);
cin.tie(NULL), cout.tie(NULL);
n = read(), m = read();
null->lc = null->rc = null, null->sum = null->cnt = 0;
for(int i = 1; i <= m; i++) t[i] = b[++len] = read(), maxx = max(maxx, t[i]);
for(int i = 1; i <= n; i++) d[i] = b[++len] = read(), rr[i] = read();
disc_init();
rt[0] = null;
for(int i = 1; i <= m; i++)
insert(rt[i - 1], rt[i], 1, maxx, t[i]);
for(int i = 1; i <= n; i++){
int l = 1, r = m, ans = 0;
if(d[i] > maxx){
putchar('0'),putchar(' ');
continue;
}
while(l <= r){
int mid = l + r >> 1;
if(calc(mid, d[i], rr[i])) ans = mid, r = mid - 1;
else l = mid + 1;
}
cout << ans << " ";
}
}
NOIP模拟 Work - 二分 + 树状数组 / ???的更多相关文章
- 2018.10.08 NOIP模拟 栅栏(树状数组+rand)
传送门 今天的送分题. 首先考虑每次给要围上栅栏的矩阵里的整体加上1,如果栅栏被撤销就整体减1,最后比较两个点的值是否相同来进行判断. 然而这样的效果并不理想,很容易卡掉. 进一步思考,我们第iii次 ...
- 【BZOJ-2527】Meteors 整体二分 + 树状数组
2527: [Poi2011]Meteors Time Limit: 60 Sec Memory Limit: 128 MBSubmit: 831 Solved: 306[Submit][Stat ...
- 【BZOJ3110】【整体二分+树状数组区间修改/线段树】K大数查询
Description 有N个位置,M个操作.操作有两种,每次操作如果是1 a b c的形式表示在第a个位置到第b个位置,每个位置加入一个数c 如果是2 a b c形式,表示询问从第a个位置到第b个位 ...
- BZOJ_3110_[Zjoi2013]K大数查询_整体二分+树状数组
BZOJ_3110_[Zjoi2013]K大数查询_整体二分+树状数组 Description 有N个位置,M个操作.操作有两种,每次操作如果是1 a b c的形式表示在第a个位置到第b个位置,每个位 ...
- bzoj千题计划316:bzoj3173: [Tjoi2013]最长上升子序列(二分+树状数组)
https://www.lydsy.com/JudgeOnline/problem.php?id=3173 插入的数是以递增的顺序插入的 这说明如果倒过来考虑,那么从最后一个插入的开始删除,不会对以某 ...
- 【bzoj3110】[Zjoi2013]K大数查询 整体二分+树状数组区间修改
题目描述 有N个位置,M个操作.操作有两种,每次操作如果是1 a b c的形式表示在第a个位置到第b个位置,每个位置加入一个数c.如果是2 a b c形式,表示询问从第a个位置到第b个位置,第C大的数 ...
- zoj-3963 Heap Partition(贪心+二分+树状数组)
题目链接: Heap Partition Time Limit: 2 Seconds Memory Limit: 65536 KB Special Judge A sequence ...
- 【bzoj4009】[HNOI2015]接水果 DFS序+树上倍增+整体二分+树状数组
题目描述 给出一棵n个点的树,给定m条路径,每条路径有一个权值.q次询问求一个路径包含的所有给定路径中权值第k小的. 输入 第一行三个数 n和P 和Q,表示树的大小和盘子的个数和水果的个数. 接下来n ...
- 【bzoj2527】[Poi2011]Meteors 整体二分+树状数组
题目描述 有N个成员国.现在它发现了一颗新的星球,这颗星球的轨道被分为M份(第M份和第1份相邻),第i份上有第Ai个国家的太空站. 这个星球经常会下陨石雨.BIU已经预测了接下来K场陨石雨的情况.BI ...
随机推荐
- BingMap频繁Add Pushpin和Delete Pushpin会导致内存泄露
近期在做性能測试的时候发现BingMap内存泄露(memory leak)的问题,查找了一些国外的帖子,发现也有类似的问题,可是没有好的解决的方法. https://social.msdn.micro ...
- Swift iOS tableView static cell动态计算高度
TableView是iOS开发中经常使用的组件.有些表格由于UILabel包括的文本字数不一样,须要显示的高度也会不同,因此须要动态计算static cell的高度.我用的是static cell,注 ...
- 2016最热门的PHP框架(一共五款)
摘要: 兄弟连IT教育作为全国最大的PHP培训机构,迄今已有10年的教育历史.6大特色课程:PHP编程.安卓培训.JAVAEE+大数据.UI设计.HTML5培训.云计算架构师,在目前IT市场特别火,每 ...
- Codeforces Round 363 Div. 1 (A,B,C,D,E,F)
Codeforces Round 363 Div. 1 题目链接:## 点击打开链接 A. Vacations (1s, 256MB) 题目大意:给定连续 \(n\) 天,每天为如下四种状态之一: 不 ...
- Docker---(2)docker pull 下来的镜像存储在哪里
原文:Docker---(2)docker pull 下来的镜像存储在哪里 版权声明:欢迎转载,请标明出处,如有问题,欢迎指正!谢谢!微信:w1186355422 https://blog.csdn. ...
- Codeforces 145A-Lucky Conversion(规律)
A. Lucky Conversion time limit per test 2 seconds memory limit per test 256 megabytes input standard ...
- error app/styles/components/iconfont.scss (Line 12: Invalid GBK character "\xE5")
因为要用到iconfont,引入iconfont到sass文件后,出现编译sass文件错误,如下截图: 解决方法:在顶部设置编码格式 @charset "utf-8"; 编译成功!
- libSVM介绍(二)
鉴于libSVM中的readme文件有点长,并且,都是採用英文书写,这里,我把当中重要的内容提炼出来,并给出对应的样例来说明其使用方法,大家能够直接參考我的代码来调用libSVM库. 第一部分,利用l ...
- swift开发网络篇 - 用户登录POST JSON and header
版权声明:本文为博主原创文章,未经博主允许不得转载. import UIKit import Alamofire class ViewController: UIViewController { va ...
- matlab 正则表达式
regexprep Replace text using regular expression collapse all in page Syntax newStr = regexprep(str,e ...