AC日记——红色的幻想乡 洛谷 P3801

红色的幻想乡

思路:

  线段树+容斥原理;

代码:

#include <bits/stdc++.h>
using namespace std;
#define maxn 100005
#define maxm maxn<<2
#define ll long long
class TreeType {
    private:
        int L[maxm],R[maxm],mid[maxm],dis[maxm];
    public:
        void build(int now,int l,int r)
        {
            L[now]=l,R[now]=r,dis[now]=0;
            if(l==r) return;mid[now]=l+r>>1;
            build(now<<1,l,mid[now]),build(now<<1|1,mid[now]+1,r);
        }
        void updata(int now,int to)
        {
            if(L[now]==R[now])
            {
                dis[now]^=1;
                return;
            }
            if(to<=mid[now]) updata(now<<1,to);
            else updata(now<<1|1,to);
            dis[now]=dis[now<<1]+dis[now<<1|1];
        }
        int query(int now,int l,int r)
        {
            if(L[now]>=l&&R[now]<=r) return dis[now];
            int res=0;
            if(l<=mid[now]) res+=query(now<<1,l,r);
            if(r>mid[now]) res+=query(now<<1|1,l,r);
            return res;
        }
};
struct TreeType tree1,tree2;
int n,m,q;
inline void in(int &now)
{
    char Cget=getchar();now=0;
    while(Cget>‘9‘||Cget<‘0‘) Cget=getchar();
    while(Cget>=‘0‘&&Cget<=‘9‘)
    {
        now=now*10+Cget-‘0‘;
        Cget=getchar();
    }
}
int main()
{
    in(n),in(m),in(q);
    tree1.build(1,1,n);
    tree2.build(1,1,m);
    int op,x1,y1,x2,y2;
    while(q--)
    {
        in(op),in(x1),in(y1);
        if(op==1) tree1.updata(1,x1),tree2.updata(1,y1);
        else
        {
            in(x2),in(y2);
            ll ans1=tree1.query(1,x1,x2),ans2=tree2.query(1,y1,y2);
            printf("%lld\n",ans1*(y2-y1+1)+ans2*(x2-x1+1)-ans1*ans2*2);
        }
    }
    return 0;
}
时间: 2024-12-19 22:45:43

AC日记——红色的幻想乡 洛谷 P3801的相关文章

AC日记——小A的糖果 洛谷七月月赛

小A的糖果 思路: for循环贪心: 代码: #include <bits/stdc++.h> using namespace std; #define maxn 100005 #define ll long long ll ai[maxn],n,m,ans; inline void in(ll &now) { char Cget=getchar();now=0; while(Cget>'9'||Cget<'0')Cget=getchar(); while(Cget>

AC日记——无线网络发射器选址 洛谷 P2038

题目描述 随着智能手机的日益普及,人们对无线网的需求日益增大.某城市决定对城市内的公共场所覆盖无线网. 假设该城市的布局为由严格平行的129 条东西向街道和129 条南北向街道所形成的网格状,并且相邻的平行街道之间的距离都是恒定值 1 .东西向街道从北到南依次编号为0,1,2…128 , 南北向街道从西到东依次编号为0,1,2…128 . 东西向街道和南北向街道相交形成路口,规定编号为x 的南北向街道和编号为y 的东西向街道形成的路口的坐标是(x , y ). 在 某 些 路口存在一定数量的公共

AC日记——妖梦斩木棒 洛谷 P3797

妖梦斩木棒 思路: 略坑爹: 代码: #include <bits/stdc++.h> using namespace std; #define maxn 200005 #define maxm maxn<<2 int n,m,L[maxm],R[maxm],mid[maxm],dis[maxm]; bool xx[maxm],ll[maxm],rr[maxm]; struct AnsType { int dis; bool l,r,x; }; inline void in(int

AC日记——矩阵取数游戏 洛谷 P1005

矩阵取数游戏 思路: dp+高精: 代码: #include <bits/stdc++.h> using namespace std; #define ll long long struct Int { int len; char ai[300]; Int() { len=1,ai[0]=0; } void Count(int pos) { len++; if(pos/10) Count(pos/10); } void operator=(int pos_) { int pos=pos_; l

红色的幻想乡

题目背景 蕾米莉亚的红雾异变失败后,很不甘心. 题目描述 经过上次失败后,蕾米莉亚决定再次发动红雾异变,但为了防止被灵梦退治,她决定将红雾以奇怪的阵势释放. 我们将幻想乡看做是一个n*m的方格地区,一开始没有任何一个地区被红雾遮盖.蕾米莉亚每次站在某一个地区上,向东南西北四个方向各发出一条无限长的红雾,可以影响到整行/整列,但不会影响到她所站的那个地区.如果两阵红雾碰撞,则会因为密度过大而沉降消失.灵梦察觉到了这次异变,决定去解决它.但在解决之前,灵梦想要了解一片范围红雾的密度.可以简述为两种操

[luogu P3801] 红色的幻想乡 [线段树][树状数组]

题目背景 蕾米莉亚的红雾异变失败后,很不甘心. 题目描述 经过上次失败后,蕾米莉亚决定再次发动红雾异变,但为了防止被灵梦退治,她决定将红雾以奇怪的阵势释放. 我们将幻想乡看做是一个n*m的方格地区,一开始没有任何一个地区被红雾遮盖.蕾米莉亚每次站在某一个地区上,向东南西北四个方向各发出一条无限长的红雾,可以影响到整行/整列,但不会影响到她所站的那个地区.如果两阵红雾碰撞,则会因为密度过大而沉降消失.灵梦察觉到了这次异变,决定去解决它.但在解决之前,灵梦想要了解一片范围红雾的密度.可以简述为两种操

LG3801 红色的幻想乡 线段树+容斥原理

问题描述 经过上次失败后,蕾米莉亚决定再次发动红雾异变,但为了防止被灵梦退治,她决定将红雾以奇怪的阵势释放. 我们将幻想乡看做是一个 \(n \times m\) 的方格地区,一开始没有任何一个地区被红雾遮盖.蕾米莉亚每次站在某一个地区上,向东南西北四个方向各发出一条无限长的红雾,可以影响到整行/整列,但不会影响到她所站的那个地区.如果两阵红雾碰撞,则会因为密度过大而沉降消失.灵梦察觉到了这次异变,决定去解决它.但在解决之前,灵梦想要了解一片范围红雾的密度.可以简述为两种操作: 1 x y 蕾米

洛谷p3801:红色的幻想乡

初见完全没有思路.....感觉像是线段树 但二维感觉完全不可做嘛 于是只能去看了看题解 然而还是疯狂爆零+WA.. 和yycc神犇调了两三个小时才调出来... ——————以下个人理解 考虑到每次的修改都是对整行和整列进行操作 可以把每行缩成一个点 这样修改就相当于对这个点进行单点修改 同理也把每列缩成一个点 那么对于每一次修改操作 我们只需要将这个点的横坐标与纵坐标进行修改即可 也就是维护两棵线段树,分别表示行和列 显然可以看出对于图里的每一个点,只有有红雾和没红雾两种状态,并且又说两次红雾会

luogu3801 红色的幻想乡

题目大意 给一个初始值都是0的0-1矩阵,两个操作:1.选择一个点,将其所在排和列(不包括该点)的数字取反.2.求一个子矩形内的数字和.n,m,q<=100000. 错误思路 为何不能用二维线段树 n,m<=100000,每个x线段树都维护一个有400000个节点的Y线段树,而X节点也要400000个,空间受不了. 如果我们要更新一排,X线段树没有达到"排除一半"的功能,必须遍历到所有X.Y节点,时间受不了. 假命题:将所在排列其它数字取反,等价于把选择的点的数字取反 与后