bzoj1935

树状数组+离线

按x排序,y离散化,树状数组查询,跟逆序对一样

#include<bits/stdc++.h>
using namespace std;
const int N = 500010;
int n, m, tot, lim;
vector<int> v;
int ans[N], aa[N], b[N], c[N], d[N], xx[N], yy[N];
map<int, int> mp;
struct BIT {
    int tree[N];
    int lowbit(int i)
    {
        return i & (-i);
    }
    void update(int pos, int delta)
    {
        for(int i = pos; i <= lim; i += lowbit(i)) tree[i] += delta;
    }
    int query(int pos)
    {
        int ret = 0;
        for(int i = pos; i; i -= lowbit(i)) ret += tree[i];
        return ret;
    }
} t;
struct data {
    int x, y, f, id, type;
    data(int x = 0, int y = 0, int f = 0, int type = 0, int id = 0) : x(x), y(y), f(f), type(type), id(id) {}
    bool friend operator < (data A, data B)
    {
        if(A.x == B.x) return A.type < B.type;
        return A.x < B.x;
    }
} a[N * 5];
int main()
{
    scanf("%d%d", &n, &m);
    for(int i = 1; i <= n; ++i)
    {
        int x, y;
        scanf("%d%d", &xx[i], &yy[i]);
        v.push_back(yy[i]);
    }
    for(int i = 1; i <= m; ++i)
    {
        scanf("%d%d%d%d", &aa[i], &b[i], &c[i], &d[i]);
        v.push_back(b[i]);
        v.push_back(d[i]);
    }
    sort(v.begin(), v.end());
    v.erase(unique(v.begin(), v.end()), v.end());
    for(int i = 0; i < v.size(); ++i) mp[v[i]] = i + 2;
    lim = v.size() + 1;
    for(int i = 1; i <= n; ++i)
    {
        a[++tot].x = xx[i];
        a[tot].y = mp[yy[i]];
        a[tot].type = 0;
    }
    for(int i = 1; i <= m; ++i)
    {
        a[++tot] = data(c[i], mp[d[i]], 1, 1, i);
        a[++tot] = data(aa[i] - 1, mp[b[i]] - 1, 1, 1, i);
        a[++tot] = data(aa[i] - 1, mp[d[i]], -1, 1, i);
        a[++tot] = data(c[i], mp[b[i]] - 1, -1, 1, i);
    }
    sort(a + 1, a + tot + 1);
    for(int i = 1; i <= tot; ++i)
    {
        if(a[i].type == 0) t.update(a[i].y, 1);
        if(a[i].type == 1) ans[a[i].id] += t.query(a[i].y) * a[i].f;
    }
    for(int i = 1; i <= m; ++i) printf("%d\n", ans[i]);
    return 0;
}

时间: 2024-10-18 15:47:35

bzoj1935的相关文章

【BZOJ1935/4822】[Shoi2007]Tree 园丁的烦恼/[Cqoi2017]老C的任务 树状数组

题意:两道题差不多,都是给你一堆平面上的点,每个点有权值,然后m次询问求某一矩形区域内的点权和 题解:先离散化,然后将询问拆成左右两条线段,然后将点和这些线段一起按x坐标排序,在y轴上维护树状数组.然后询问的答案就是两条线段上点权和之差 BZOJ1935: #include <cstdio> #include <cstring> #include <iostream> #include <algorithm> using namespace std; int

bzoj1935 [Shoi2007]园丁的烦恼

bzoj1935 [Shoi2007]园丁的烦恼 有N个点坐标为(xi,yi),M次询问,询问(a,b)-(c,d)的矩形内有多少点. 0≤n≤500000,1≤m≤500000,0≤xi,yi≤10000000 看完数据范围傻眼系列. 做法: 离线处理 因为这个范围肯定不能把x y都离散, 所以只把点和询问的y坐标放在一起都离散化,然后一起按x坐标排序, 再开一个树状数组,求出每个需要的点的二维前缀和. 不理解的话拿画图板画一下就好了. 细节见代码 #include<bits/stdc++.h

BZOJ1935: [Shoi2007]Tree 园丁的烦恼

1935: [Shoi2007]Tree 园丁的烦恼 Description 很久很久以前,在遥远的大陆上有一个美丽的国家.统治着这个美丽国家的国王是一个园艺爱好者,在他的皇家花园里种植着各种奇花异草.有一天国王漫步在花园里,若有所思,他问一个园丁道: "最近我在思索一个问题,如果我们把花坛摆成六个六角形,那么--" "那么本质上它是一个深度优先搜索,陛下",园丁深深地向国王鞠了一躬. "嗯--我听说有一种怪物叫九头蛇,它非常贪吃苹果树--" &

大神刷题表

9月27日 后缀数组:[wikioi3160]最长公共子串 dp:NOIP2001统计单词个数 后缀自动机:[spoj1812]Longest Common Substring II [wikioi3160]最长公共子串 [spoj7258]Lexicographical Substring Search 扫描线+set:[poj2932]Coneology 扫描线+set+树上删边游戏:[FJOI2013]圆形游戏 结论:[bzoj3706][FJ2014集训]反色刷 最小环:[poj1734

[转载]hzwer的bzoj题单

counter: 664BZOJ1601 BZOJ1003 BZOJ1002 BZOJ1192 BZOJ1303 BZOJ1270 BZOJ3039 BZOJ1191 BZOJ1059 BZOJ1202 BZOJ1051 BZOJ1001 BZOJ1588 BZOJ1208 BZOJ1491 BZOJ1084 BZOJ1295 BZOJ3109 BZOJ1085 BZOJ1041 BZOJ1087 BZOJ3038 BZOJ1821 BZOJ1076 BZOJ2321 BZOJ1934 BZOJ

cdq分治浅谈

$cdq$分治浅谈 1.分治思想 分治实际上是一种思想,这种思想就是将一个大问题划分成为一些小问题,并且这些小问题与这个大问题在某中意义上是等价的. 2.普通分治与$cdq$分治的区别 普通分治与$cdq$分治都是基于分治思想之上的算法,但是他们是有区别的.普通分治的适用条件是,产生的小问题之间互不影响,然而$cdq$分治就相对比较宽泛,小问题之间可以有影响,但是$cdq$分治不支持强制在线. 3.$cdq$分治浅谈 分治一共分为四步: 1) 将当前处理区间分为左右两个等大的子区间: 2) 递归