[hdu5200]离线+标记

思路:按顺序处理,新建一堆然后向左右合并,不过巧妙地用了标记数组来记录和统计答案。

  1 #pragma comment(linker, "/STACK:10240000,10240000")
  2
  3 #include <iostream>
  4 #include <cstdio>
  5 #include <algorithm>
  6 #include <cstdlib>
  7 #include <cstring>
  8 #include <map>
  9 #include <queue>
 10 #include <deque>
 11 #include <cmath>
 12 #include <vector>
 13 #include <ctime>
 14 #include <cctype>
 15 #include <set>
 16
 17 using namespace std;
 18
 19 #define mem0(a) memset(a, 0, sizeof(a))
 20 #define lson l, m, rt << 1
 21 #define rson m + 1, r, rt << 1 | 1
 22 #define define_m int m = (l + r) >> 1
 23 #define rep(a, b) for(int a = 0; a < b; a++)
 24 #define all(a) (a).begin(), (a).end()
 25 #define lowbit(x) ((x) & (-(x)))
 26 #define constructInt4(name, a, b, c, d) name(int a = 0, int b = 0, int c = 0, int d = 0): a(a), b(b), c(c), d(d) {}
 27 #define constructInt3(name, a, b, c) name(int a = 0, int b = 0, int c = 0): a(a), b(b), c(c) {}
 28 #define constructInt2(name, a, b) name(int a = 0, int b = 0): a(a), b(b) {}
 29 #define pc(a) putchar(a)
 30 #define ps(a) puts(a)
 31
 32 typedef double db;
 33 typedef long long LL;
 34 typedef pair<int, int> pii;
 35 typedef multiset<int> msi;
 36 typedef multiset<int>::iterator msii;
 37 typedef set<int> si;
 38 typedef set<int>::iterator sii;
 39 typedef vector<int> vi;
 40
 41 const int dx[8] = {1, 0, -1, 0, 1, 1, -1, -1};
 42 const int dy[8] = {0, -1, 0, 1, -1, 1, 1, -1};
 43 const int maxn = 1e6 + 7;
 44 const int maxm = 1e5 + 7;
 45 const int maxv = 1e7 + 7;
 46 const int max_val = 1e6 + 7;
 47 const int MD = 1e9 +7;
 48 const int INF = 1e9 + 7;
 49 const double PI = acos(-1.0);
 50 const double eps = 1e-10;
 51
 52 inline int ReadInt() {
 53     char c = getchar();
 54     while(!isdigit(c)) c = getchar();
 55
 56     int x = 0;
 57     while(isdigit(c)) {
 58         x = x * 10 + c - ‘0‘;
 59         c = getchar();
 60     }
 61     return x;
 62 }
 63
 64 inline void WriteInt(int i) {
 65     int p = 0;
 66     static int buf[10];
 67     if(i == 0) buf[p++] = 0;
 68     else while(i) {
 69         buf[p++] = i % 10;
 70         i /= 10;
 71     }
 72     for(int j = p - 1; j >= 0; j--) putchar(‘0‘ + buf[j]);
 73 }
 74
 75
 76 bool cmp(const pii &a, const pii &b) {
 77     return a.first > b.first;
 78 }
 79
 80 int main() {
 81     //freopen("in.txt", "r", stdin);
 82     int n, q;
 83     while (cin >> n >> q) {
 84         vector<pii> a(n), b(q);
 85         vector<int> out(q);
 86         rep(i, n) {
 87             a[i].first = ReadInt();
 88             a[i].second = i;
 89         }
 90         rep(i, q) {
 91             b[i].first = ReadInt();
 92             b[i].second = i;
 93         }
 94         sort(all(a), cmp);
 95         sort(all(b), cmp);
 96         vector<bool> vis(n);
 97         int now = 0, ans = 0;
 98         rep(i, q) {
 99             while (now < n && a[now].first > b[i].first) {
100                 int pos = a[now].second;
101                 vis[pos] = true;
102                 ans++;
103                 if (pos && vis[pos - 1]) ans--;
104                 if (pos < n - 1 && vis[pos + 1]) ans--;
105                 now++;
106             }
107             out[b[i].second] = ans;
108         }
109         rep(i, q) {
110             WriteInt(out[i]);
111             pc(‘\n‘);
112         }
113     }
114     return 0;
115 }

时间: 2024-12-30 04:21:48

[hdu5200]离线+标记的相关文章

Android 开发命令行完全攻略

作为命令行的爱好者,我想写这个主题已经有好一段时间了.除了显得很酷之外,命令行的使用能够提高我们的开发效率,因为相比通过鼠标点击一系列的菜单选项,使用键盘输入几个字符并点击 TAB 健显然会快很多. 本文的目的是跟大家分享在我的 Android 开发实践中对命令行的运用. iTerm2 由于我们将会在命令行中进行后续的工作,因此如果能够安装一个比系统默认命令行更好的工具那显然是不错的,那么请下载 iTerm21 吧! iTerm2 将命令行带入了现代化时代,提供了很多你一直想要的特性.其中包含了

HDU5156(离线tarjan+打标记)

Harry and Christmas tree Time Limit: 5000/2500 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others) Total Submission(s): 213    Accepted Submission(s): 53 Problem Description In Christmas Day, Harry got a Christmas tree. The tree has n nodes

hdu5200 Trees(逆向思维+离线处理)

题意描述: 在一条直线上有n棵树,每棵树有一个高度.现在进行查询:给一个高度h,把小于等于h的树砍掉,剩余的树能组成几个块? 块的定义:一个块要包含尽可能多的位置连续的树,而且被包含的树没有被砍掉 解题思路:离线处理 1.逆向思维:砍树的对立面就是长树 (1)如果我们把树的高度和查询高度都按从大到小的顺序排序,初始化直线上没有一棵树存在: (2)然后从前往后扫描查询,对于当前查询,我们只需要把高于当前查询的树生长出来(vis数组标记即可) (3)在每颗树生长的同时检测其两边的树是否已经生长,对于

BestCoder Round #36 (hdu5200)Strange Class(离线)

转载请注明出处: http://www.cnblogs.com/fraud/          ——by fraud Trees Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others) Problem Description Today CodeFamer is going to cut trees.There are N trees standing in a line. They

数值标记问题 离线+树状数组 HDU 3938

题目大意:给你一个长度为n的数组a,定义区间[l,r]的val为区间内所有不同的数值之和.现在有m个询问,每次询问一个区间,问区间的val是多少. 思路:将所有的询问按照右端点排序.然后暴力枚举右区间,然后对之前出现过的val做一个标记即可,每次都更新这个标记就好了. 具体的和HDU 5869一样,只不过5869还要预处理,比较难 //看看会不会爆int!数组会不会少了一维! //取物问题一定要小心先手胜利的条件 #include <bits/stdc++.h> using namespace

HDU5200 数据离线处理

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5200 ,数据离线处理. 这是BestCoder Round #36的C题,比赛时自己用线段树做,姿势不够优美,TLE了,后来才想到用离线处理的话很简单. 解法: 先把所有的树的高度和下标都存下来,然后按照高度进行排序:接下来把所有询问都先存下来,按照询问的高度进行排序.对于当前的查询h,在树中删除比h小的树木,假设删除的树的下标为p,则查看当前p+1和p-1位置的树木是否删去,如果两个位置都在,则+

HDU5200 Trees (离线处理)

题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=5200 题意: 每次去掉高度小于q的树,每次输出剩下的块数. 分析: 我们对高度从高到低进行排序,对要去掉的高度从低到高进行排序. 因此前面去掉的在后面一定会去掉,因可以离线处理,节省时间, 然后需要开一个辅助空间,记录这棵树去没有去掉. 代码如下: #include <iostream> #include <cstdio> #include <cstring> #incl

完全离线安装VSCode插件--Eslint

最近折腾了一番,总算把Eslint插件在离线的情况下安装好了.之前查了挺多,但是很多方法还是在没有完全离线的情况下进行的.之所以想完全离线安装,主要是因为我们工作的地方是禁止访问外网的,所以像直接执行npm命令来进行一些包的安装,其实对我来说是用不了的. 好了,现在进入正题,说下我的解决方式吧. 1.在无法联网的电脑上先把VSCode安装好. 2.在家里有网的电脑上,在vsCode里面的扩展直接安装eslint插件,然后在该路径(C:\Users\Administrator\.vscode\ex

Web版百度地图加载离线瓦片

注:本文参考网络教程,瓦片也是通过网络下载.向原作者致敬!原作地址:http://download.csdn.net/download/dkm8873/9233731 原作版本已久,由于代码混淆压缩,无法添加标记等特性.本文通过修改最新的 代码达到离线版的目的,而且功能可以任意扩充.本文每一个步骤都经过试验,万无一失. 点此直接下载完整版Demo代码 先准备好一个放置源码的文件夹,然后将获取的文件放进去.建立三个文件夹:js.css.images. 第一步,自然是访问一个入口:http://ap