cogs 1752. [BOI2007]摩基亚Mokia

来源:互联网 发布:apm源码编译 编辑:程序博客网 时间:2024/06/06 00:16


题目链接:http://www.cogs.pro/cogs/problem/problem.php?pid=1752


cdq分治模版题。就是处理前缀和的时候这里变成了矩阵前缀和。我们采用扫描线的方法,用树状数组来维护一个矩阵的前缀和。

然后对于一个询问,我们采用矩阵前缀和的形式来处理这个询问,转化为4个操作。也就是对4个矩阵的处理。

然后看代码就可以了。

#include <cstdio>#include <algorithm>#include <cstring>using namespace std;const int MAXN = 2e5+7;typedef long long LL;int n;struct node{    int x,y;    int qid;    int val;    int type;    node(){};    node(int X,int Y,int Val,int Type,int Qid = 0)    {        x = X;        y = Y;        val = Val;        type = Type;        qid = Qid;    }    bool operator <= (const node &a)const    {        return x == a.x?type < a.type : x < a.x;    }} p[MAXN],temp[MAXN];LL ans[10005];LL val[MAXN*10];void add(int x,int y){    for(; x <= n; x += x&-x)val[x] += y;}LL sum(int x){    LL ans = 0;    for(; x; x -= x&-x)ans += val[x];    return ans;}void cdq(int l,int r){    if(l == r)return;    int mid = (l+r)>>1;    cdq(l,mid);    cdq(mid+1,r);    int i = l, j = mid + 1;    int cnt = 0;    while(i <= mid && j <= r)    {        if(p[i] <= p[j])        {            if(p[i].type == 1)add(p[i].y,p[i].val);            temp[cnt++] = p[i++];        }        else        {            if(p[j].type == 2)ans[p[j].qid] += p[j].val*sum(p[j].y);            temp[cnt++] = p[j++];        }    }    while(j <= r)    {        if(p[j].type == 2)ans[p[j].qid] += p[j].val*sum(p[j].y);        temp[cnt++] = p[j++];    }    for(int ii = l ; ii < i ; ++ii)if(p[ii].type == 1)add(p[ii].y,-p[ii].val);//把树状数组清0,供下一次使用。    while(i <= mid)temp[cnt++] = p[i++];    for(int i = 0 ; i < cnt ; ++i)p[l++] = temp[i];}int main(){    freopen("mokia.in","r",stdin);    freopen("mokia.out","w",stdout);    scanf("%*d%d",&n);    int x,y,t,c,x1,y1;    int id = 0 , qid = 0;    while(~scanf("%d",&t) && t!=3)    {        if(t == 1)        {            scanf("%d%d%d",&x,&y,&c);            p[++id] = node(x,y,c,1);        }        else        {            scanf("%d%d%d%d",&x,&y,&x1,&y1);            p[++id] = node(x-1,y-1,1,2,qid);            p[++id] = node(x1,y-1,-1,2,qid);            p[++id] = node(x-1,y1,-1,2,qid);            p[++id] = node(x1,y1,1,2,qid++);        }    }    cdq(1,id);    for(int i = 0 ; i < qid ; ++i)printf("%lld\n",ans[i]);    return 0;}




原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 苹果下载东西要发验证码怎么办 接口断在了丝扣里面怎么办 政府下了一张关停取缔单怎么办 微信运动数据不刷新了怎么办 邻居霸占我的土地不还我该怎么办 双层水浴式杀菌锅阀门坏了怎么办 通下水管的钢丝断水管里了怎么办 塑料水管与水阀连接处漏水怎么办 介质流向标识管道温度太高怎么办 雪碧里气体太多瓶子涨得要炸怎么办 餐厅不清洗油烟管道物业该怎么办 用完权健洁净宝后奇痒的厉害怎么办 老房子铸铁暖气管从外锈蚀了怎么办 德意壁挂炉补水多了水压过高怎么办 新空调的散热片铜管漏了怎么办 猪舍被别人推掉漏电电到人怎么办? 网上买的燃气灶连接用软管怎么办 哈弗h3后减振器上支架坏了怎么办 汽车用收录机电机皮带断了怎么办 大便太粗把马桶堵了怎么办 大便过粗把马桶堵了怎么办 大便硬的像石头拉不出来怎么办 家里埋在地下的水管漏水怎么办 埋在墙里的水管漏水怎么办 开发商暗埋水管热熔接头漏水怎么办 钻墙把水管钻破了怎么办 钻墙时不小心把水管钻破了怎么办 孩子把同桌的铅笔盒弄坏了怎么办 水管伐坏了物业不给修怎么办 卫生间埋在地下的水管漏水怎么办 埋在地下的水管冻住了怎么办 洗脸盆下水管有眉笔掉堵了怎么办 楼上打空调眼导致墙面潮湿怎么办 阳台做防水了又贴砖还漏水怎么办 洗菜盆里的盖子吸住拔不起来怎么办 掉小区阴井盖里物业不管怎么办 卫生间下水道被头发堵了怎么办妙招 久量时尚夜光台灯不亮了怎么办 我想做水电暖工程没有资质怎么办 修手机被弄丢了没有开维修单怎么办 手机去维修被老板弄丢了怎么办