暑期实践日志(五)

这道题是典型的二维线段树的题目,题目要求查询一个区间的最小值和最大值,并修改一个点。

代码:

#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#include<vector>
#include<queue>
#include<set>
#include<map>
#include<cstdlib>
using namespace std;
const int INF=0x3f3f3f3f;
const int maxn=1010;
struct nodey
{
    int l,r;
    int max,min;
};
int locy[maxn],locx[maxn];
struct nodex
{
    int l,r;
    nodey sty[maxn*4];
    void build(int i,int _l,int _r)
    {
        sty[i].l=_l;
        sty[i].r=_r;
        sty[i].max=-INF;
        sty[i].min=INF;
        if(_l==_r)
        {
            locy[_l]=i;
            return;
        }
        int mid=(_l+_r)/2;
        build(i<<1,_l,mid);
        build((i<<1)|1,mid+1,_r);
    }
    int querymin(int i,int _l,int _r)
    {
        if(sty[i].l==_l&&sty[i].r==_r)
            return sty[i].min;
        int mid=(sty[i].l+sty[i].r)/2;
        if(_r<=mid)
            return querymin(i<<1,_l,_r);
        else if(_l>mid)
            return querymin((i<<1)|1,_l,_r);
        else
            return min(querymin(i<<1,_l,mid),querymin((i<<1)|1,mid+1,_r));
    }
    int querymax(int i,int _l,int _r)
    {
        if(sty[i].l==_l&&sty[i].r==_r)
            return sty[i].max;
        int mid=(sty[i].l+sty[i].r)/2;
        if(_r<=mid)
            return querymax(i<<1,_l,_r);
        else if(_l>mid)
            return querymax((i<<1)|1,_l,_r);
        else
            return max(querymax(i<<1,_l,mid),querymax((i<<1)|1,mid+1,_r));

    }
}stx[maxn*4];
int n;
void build(int i,int l,int r)
{
    stx[i].l=l;
    stx[i].r=r;
    stx[i].build(1,1,n);
    if(l==r)
    {
        locx[l]=i;
        return ;
    }
    int mid=(l+r)/2;
    build(i<<1,l,mid);
    build((i<<1)|1,mid+1,r);
}
void modify(int x,int y,int val)
{
    int tx=locx[x];
    int ty=locy[y];
    stx[tx].sty[ty].min=stx[tx].sty[ty].max=val;
    for(int i=tx;i;i>>=1)
      for(int j=ty;j;j>>=1)
        {
            if(i==tx&&j==ty)
                continue;
            if(j==ty)
            {
                stx[i].sty[j].min=min(stx[i<<1].sty[j].min,stx[(i<<1)|1].sty[j].min);
                stx[i].sty[j].max=max(stx[i<<1].sty[j].max,stx[(i<<1)|1].sty[j].max);
            }
            else
            {
                stx[i].sty[j].min=min(stx[i].sty[j<<1].min,stx[i].sty[(j<<1)|1].min);
                stx[i].sty[j].max=max(stx[i].sty[j<<1].max,stx[i].sty[(j<<1)|1].max);
            }
        }
}
int queryMin(int i,int x1,int x2,int y1,int y2)
{
    if(stx[i].l==x1&&stx[i].r==x2)
        return stx[i].querymin(1,y1,y2);
    int mid=(stx[i].l+stx[i].r)/2;
    if(x2<=mid)
        return queryMin(i<<1,x1,x2,y1,y2);
    else if(x1>mid)
        return queryMin((i<<1)|1,x1,x2,y1,y2);
    else
        return min(queryMin(i<<1,x1,mid,y1,y2),queryMin((i<<1)|1,mid+1,x2,y1,y2));
}
int queryMax(int i,int x1,int x2,int y1,int y2)
{
    if(stx[i].l==x1&&stx[i].r==x2)
        return stx[i].querymax(1,y1,y2);
    int mid=(stx[i].l+stx[i].r)/2;
    if(x2<=mid)
        return queryMax(i<<1,x1,x2,y1,y2);
    else if(x1>mid)
        return queryMax((i<<1)|1,x1,x2,y1,y2);
    else
        return max(queryMax(i<<1,x1,mid,y1,y2),queryMax((i<<1)|1,mid+1,x2,y1,y2));
}
int main()
{
    int T;
    scanf("%d",&T);
    int icase=0;
    while(T--)
    {
        icase++;
        printf("Case #%d:\n",icase);
        scanf("%d",&n);
        build(1,1,n);
        for(int i=1;i<=n;i++)
            for(int j=1;j<=n;j++)
            {
                int a;
                scanf("%d",&a);
                modify(i,j,a);
            }
        int q;
        int x,y,L;
        scanf("%d",&q);
        while(q--)
        {
            scanf("%d%d%d",&x,&y,&L);
            int x1=max(x-L/2,1);
            int x2=min(x+L/2,n);
            int y1=max(y-L/2,1);
            int y2=min(y+L/2,n);
            int Max=queryMax(1,x1,x2,y1,y2);
            int Min=queryMin(1,x1,x2,y1,y2);
            int t=(Max+Min)/2;
            printf("%d\n",t);
            modify(x,y,t);
        }
    }
    return 0;
}
时间: 2024-08-26 00:47:46

暑期实践日志(五)的相关文章

暑期实践日志(三)

开关问题 Time Limit: 1000MS   Memory Limit: 30000K Total Submissions: 6455   Accepted: 2463 Description 有N个相同的开关,每个开关都与某些开关有着联系,每当你打开或者关闭某个开关的时候,其他的与此开关相关联的开关也会相应地发生变化,即这些相联系的开关的状态如果原来为开就变为关,如果为关就变为开.你的目标是经过若干次开关操作后使得最后N个开关达到一个特定的状态.对于任意一个开关,最多只能进行一次开关操作

暑期实践日志(二)

这道题的思路是,将题目中所描述的齿轮看成是圆,其中两个齿轮相互咬合则是两个圆相切,那么根据判断两个圆相切的方法来判断两个齿轮间是否咬合.其中还会用到齿轮传动的规律,即传动轮的速度由主动轮来决定,根据该题的描述可知所有齿轮中只有一个是主动轮,那么其他齿轮的速度都都它决定,随度的比值就是R1/Ri. 代码: #include <iostream> #include <cstdio> #include <cmath> #include <cstring> #inc

暑期实践日志(四)

Painter's Problem Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 4912   Accepted: 2385 Description There is a square wall which is made of n*n small square bricks. Some bricks are white while some bricks are yellow. Bob is a painter and

暑期实践日志(一)

2015年7月6日 题解这道题目是一个数学题,其中有两个需要注意的地方. 第一:题目要求我们求将一个数分解成连续数字的和,而且要求数字个数最少.由题目意思可以推导出一个公式,所给的数N=(a+(a+k-1))/2.其中的a表示连续数字和中最小的那个数,k表示的是连续数字的个数,整个公式的由来是等差数列求和公式推导的. 第二:在求解时,虽然已经推导出了公式,但是在求解时,根据公式,我们采取遍历所有的k的值来求解a,如果从2到n遍历的话会超时.所以这里要注意,要从2到2*n开根号,这样可以避免超时.

Agile实践日志一 -- Grooming Session

Agile实践日志一  -- Grooming Session GroomingSession 这个Session主要Go through我们下一个Sprint须要做的Story,大家都清楚之后,在每一个Story最后我们会以 Good Agile 扑克牌来确认它的难度点.在sprint之前,做一个story的评估和规划,为接下来分story提供难度系数的參照. Story Story是敏捷的核心.一切task来自story,我们仅仅有制定了story.才干确定task.一切測试工作也是基于st

JavaScript网站设计实践(五)编写photos.html页面,实现点击缩略图显示大图的效果

原文:JavaScript网站设计实践(五)编写photos.html页面,实现点击缩略图显示大图的效果 一.photos.html页面,点击每一张缩略图,就在占位符的位置那里,显示对应的大图. 看到的页面效果是这样的: 1.实现思路 这个功能在之前的JavaScript美术馆那里已经实现了. 首先在页面中使用ul列表显示出所有的缩略图,然后使用JavaScript,for循环检查出当前点击的是哪一张图片,最后把这张图片给显示出来. 用到三个函数:显示图片函数.创建占位符预装图片.点击显示图片

Agile实践日志(2)-- Daily Stand up 和 Retrospective Session

Agile实践日志 (2) -- Daily Stand up 和 Retrospective Session 在Scrum开发过程中,会有三种会议: Grooming (详见Agile实践日志(1)) , Daily Stand up 和Retrospective Meeting Daily Stand up Sprint期间,每天早上小组成员需要在固定的时间地点进行,时间大约15分钟.主要介绍一下昨天做了什么,今天需要做什么,信心完成指数(1-10) Done 昨天完成的 ToDo 今天要做

微服务实践(五):微服务的事件驱动数据管理

[编者的话]本文是使用微服务创建应用系列的第五篇文章.第一篇文章介绍了微服务架构模式,并且讨论了使用微服务的优缺点:第二和第三篇描述了微服务架构模块间通讯的不同方面:第四篇研究了服务发现中的问题.本篇中,我们从另外一个角度研究一下微服务架构带来的分布式数据管理问题. 1.1 微服务和分布式数据管理问题 单体式应用一般都会有一个关系型数据库,由此带来的好处是应用可以使用 ACID transactions,可以带来一些重要的操作特性: 原子性 – 任何改变都是原子性的 一致性 – 数据库状态一直是

dotnet core 实践——日志组件Serilog

 前几天把基于quartz.net的部分项目代码移植到了dotnet core ,但是没增加日志功能,原因是没找到合适的组件. 今天终于找到了Serilog: https://github.com/serilog/serilog 源码 就大概讲一下: 1, vs 2015  新建Console Application (.NET Core) 项目. 2, 程序包管理器控制台: 安装如下组件:Serilog,Serilog.Sinks.Literate,Serilog.Sinks.RollingF