[Balkan 2007] Mokia

[题目链接]

https://www.lydsy.com/JudgeOnline/problem.php?id=1176

[算法]

CDQ分治 + 树状数组即可

时间复杂度 : O(Nlog^2N)

[代码]

#include<bits/stdc++.h>
using namespace std;
const int N = 160010;
const int M = 2000010;
typedef long long ll;
typedef long double ld;
typedef unsigned long long ull;

struct Query
{
        int pos , x , y , value , type , id;
} q[N * 5] , t1[N * 5] , t2[N * 5];

int s , w , m , k;
int c[M] , ans[N];

template <typename T> inline void chkmax(T &x,T y) { x = max(x,y); }
template <typename T> inline void chkmin(T &x,T y) { x = min(x,y); }
template <typename T> inline void read(T &x)
{
    T f = 1; x = 0;
    char c = getchar();
    for (; !isdigit(c); c = getchar()) if (c == ‘-‘) f = -f;
    for (; isdigit(c); c = getchar()) x = (x << 3) + (x << 1) + c - ‘0‘;
    x *= f;
}
inline bool cmp(Query a , Query b)
{
        if (a.x != b.x) return a.x < b.x;
        else if (a.y != b.y) return a.y < b.y;
        else return a.type < b.type;
}
inline int lowbit(int x)
{
        return x & (-x);
}
inline void modify(int x , int val)
{
        for (int i = x; i <= w; i += lowbit(i))
                c[i] += val;
}
inline int query(int x)
{
        int ret = 0;
        for (int i = x; i; i -= lowbit(i))
                ret += c[i];
        return ret;
}
inline void cdq(int l , int r)
{
        int mid = (l + r) >> 1;
        if (l == r) return;
        for (int i = l; i <= r; i++)
        {
                if (q[i].type == 1 && q[i].pos <= mid) modify(q[i].y , q[i].value);
                else if (q[i].type == 2 && q[i].pos > mid) ans[q[i].id] += q[i].value * query(q[i].y);
        }
        for (int i = l; i <= r; i++)
        {
                if (q[i].type == 1 && q[i].pos <= mid)
                        modify(q[i].y , -q[i].value);
        }
        int l1 = 0 , l2 = 0;
        for (int i = l; i <= r; i++)
                if (q[i].pos <= mid) t1[++l1] = q[i];
                else t2[++l2] = q[i];
        for (int i = 1; i <= l1; i++) q[l + i - 1] = t1[i];
        for (int i = 1; i <= l2; i++) q[l + l1 + i - 1] = t2[i];
        cdq(l , mid);
        cdq(mid + 1 , r);
}

int main()
{

        read(s); read(w);
        while (true)
        {
                int type;
                read(type);
                if (type == 3) break;
                if (type == 1)
                {
                        int x , y , a;
                        read(x); read(y); read(a);
                        q[++m] = (Query){m , x , y , a , 1 , k};
                } else
                {
                        int X1 , Y1 , X2 , Y2;
                        read(X1); read(Y1); read(X2); read(Y2);
                        ans[++k] = s * (X2 - X1 + 1) * (Y2 - Y1 + 1);
                        q[++m] = (Query){m , X2 , Y2 , 1 , 2 , k};
                        q[++m] = (Query){m , X1 - 1 , Y2 , -1 , 2 , k};
                        q[++m] = (Query){m , X2 , Y1 - 1 , -1 , 2 , k};
                        q[++m] = (Query){m , X1 - 1 , Y1 - 1 , 1 , 2 , k};
                }
        }
        sort(q + 1 , q + m + 1 , cmp);
        cdq(1 , m);
        for (int i = 1; i <= k; i++) printf("%d\n" , ans[i]);

        return 0;

}

原文地址:https://www.cnblogs.com/evenbao/p/10360004.html

时间: 2024-11-08 23:34:39

[Balkan 2007] Mokia的相关文章

BZOJ 1176 Balkan 2007 Mokia CDQ分治

题目大意:有一些操作,给一个坐标代表的点加上一个数,和求出一个矩形中的所有数的和. 思路:一眼题,二位树状数组水过. ... .. . 哪里不对?W<=2000000.逗我?这n^2能开下? 这个时候CDQ神牛又来帮助我们了. 这个题应该算是CDQ分治的模板题了吧,简单分析一下,其实不难. 写这个题之前建议写一下BZOJ 1935 SHOI 2007 Tree 园丁的烦恼 树状数组这个题,是本题的简化版. 按照正常的解法,我们应该建立一个二位的数据结构,然后分别维护两维的信息.如果用动态开点的线

【BZOJ 1176】【Balkan 2007】Mokia

http://www.lydsy.com/JudgeOnline/problem.php?id=1176 整体二分的例题 把每个询问拆成四个询问,整体二分里x坐标递增,按x坐标扫的时候用树状数组维护y坐标前缀和. 一开始想复杂了,按cdq分治先solve左边再处理中间再solve右边,这样每次都要对x坐标排序,常数巨大,T了好几次TwT 后来参考了别人的代码,发现自己一开始就想复杂了.这道题不需要在solve完后还是保持原来的按x坐标递增的顺序,也不需要先处理出左边的信息才能更新右边的信息. 这

摩基亚Mokia

P1948 - [BOI2007]摩基亚Mokia Description 摩尔瓦多的移动电话公司摩基亚(Mokia)设计出了一种新的用户定位系统.和其他的定位系统一样,它能够迅速回答任何形如"用户C的位置在哪?"的问题,精确到毫米.但其真正高科技之处在于,它能够回答形如"给定区域内有多少名用户?"的问题. 在定位系统中,世界被认为是一个W * W的正方形区域,由1 * 1的方格组成.每个方格都有一个坐标(x,y),1<=x,y<=W.坐标的编号从1开始

COJS 1752. [BOI2007]摩基亚Mokia

1752. [BOI2007]摩基亚Mokia ★★★   输入文件:mokia.in   输出文件:mokia.out   简单对比时间限制:5 s   内存限制:128 MB [题目描述] 摩尔瓦多的移动电话公司摩基亚(Mokia)设计出了一种新的用户定位系统.和其他的定位系统一样,它能够迅速回答任何形如“用户C的位置在哪?”的问题,精确到毫米.但其真正高科技之处在于,它能够回答形如“给定区域内有多少名用户?”的问题. 在定位系统中,世界被认为是一个W*W的正方形区域,由1*1的方格组成.每

ACdream1157 Segments(CDQ分治 + 线段树)

题目这么说的: 进行如下3种类型操作:1)D L R(1 <= L <= R <= 1000000000) 增加一条线段[L,R]2)C i (1-base) 删除第i条增加的线段,保证每条插入线段最多插入一次,且这次删除操作一定合法3) Q L R(1 <= L <= R <= 1000000000) 查询目前存在的线段中有多少条线段完全包含[L,R]这个线段,线段X被线段Y完全包含即LY <= LX <= RX <= RY) 初学CDQ分治是看了B

Up to 8% free bonus for runescape 2007 gp on Rsorder as july best gift&Enjoy Telos During 7.1-7.22

Now, a small band of freedom fighters struggle to end the osrs gold  long, dark night of Daein's oppression. The big blog news of the day is that Vox Media has acquired Curbed Network. As an amulet you should be wearing an amulet of glory and if you

FDA Approves First Hepatitis B Viral Load Test on 2007

FDA Approves First Hepatitis B Viral Load Test Another Roche first in TaqMan real-time PCR testing for the diagnostic lab The U.S. Food & Drug Administration (FDA) has approved the Roche COBAS TaqManHBV Test, the first assay for quantitating hepatiti

1143 纪念品分组 2007年NOIP全国联赛普及组

1143 纪念品分组 2007年NOIP全国联赛普及组 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 白银 Silver 题解 查看运行结果 题目描述 Description 元旦快到了,校学生会让乐乐负责新年晚会的纪念品发放工作.为使得参加晚会的同学所获得的纪念品价值相对均衡,他要把购来的纪念品根据价格进行分组,但每组最多只能包括两件纪念品,并且每组纪念品的价格之和不能超过一个给定的整数.为了保证在尽量短的时间内发完所有纪念品,乐乐希望分组的数目最少. 你的任务是写一个程序

exchange系列(七)exchange 2007迁移到2010

博主QQ:819594300 博客地址:http://zpf666.blog.51cto.com/ 有什么疑问的朋友可以联系博主,博主会帮你们解答,谢谢支持! 前言:Exchange从诞生到今天已经过去20年了,exchange2007应当算是最为经典.好用的版本,但是2010与2007的主要区别就是2010对I/O的需求大大降低了百分之50到70左右,2010还可以使用较为廉价的磁盘如STAT SCSI等.2010在优化方面做得比2007要好,但是在主要功能上面没有太大区别. 一.概述 1.2