Gopu and the Grid Problem

Gopu is interested in the integer co-ordinates of the X-Y plane (0<=x,y<=100000). Each integer coordinate contain a lamp, initially all the lamps are in off mode. Flipping a lamp means switching it on if it is in off mode and vice versa. Maggu will ask gopu 3 type of queries.

 

Type 1:  x l r,  meaning: flip all the lamps whose x-coordinate are between l and r (both inclusive) irrespective of the y coordinate.

 

Type 2:  y l r, meaning: flip all the lamps whose y-coordinate are between l and r (both inclusive) irrespective of the x coordinate.

 

Type 3: q x y X Y, meaning: count the number of lamps which are in ‘on mode’(say this number be A) and ‘off mode’ (say this number  be B) in the region where x-coordinate is between x and X(both inclusive) and y-coordinate is between y and Y(both inclusive).

Input

First line contains Q-number of queries that maggu will ask to gopu. (Q <= 10^5)

 

Then there will be Q lines each containing a query of one of the three type described above.

Output

For each query of 3rd type you need to output a line containing one integer A.

Example

Input:

3

x 0 1

y 1 2

q 0 0 2 2

 Output: 
 4
一开始想的是直接二维线段树或者二维树状数组搞一下,然后一看数据范围,GG。实在没办法看了网上的题解,用两个线段树分别处理行和列,然后查询的时候,再综合一下。
减去重叠的部分。
#include <iostream>
#include <cstring>
#include <cstdio>
#include <algorithm>
#include <cmath>
#include <string>
#include <map>
#include <stack>
#include <queue>
#include <vector>
#define inf 0x3f3f3f3f
#define met(a,b) memset(a,b,sizeof a)
#define pb push_back
typedef long long ll;
using namespace std;
const int N = 1e5+;
const int M = ;
typedef long long LL; int q;
struct Seg {
int Tree[N << ]; // 标记的行数/列数
bool lazy[N << ];
void init() {
memset(Tree, , sizeof(Tree));
memset(lazy, , sizeof(lazy));
}
inline void pushup(int rt) { Tree[rt] = Tree[rt << ] + Tree[rt << | ]; }
inline void pushdown(int pos,int len)
{
if(lazy[pos])
{
Tree[pos<<]=len-len/-Tree[pos<<];
Tree[pos<<|]=len/-Tree[pos<<|];
lazy[pos<<]^=;
lazy[pos<<|]^=;
lazy[pos]=;
}
return;
}
void update(int L,int R,int l,int r,int pos)
{
if(l>=L&&r<=R)
{
Tree[pos]=(r-l+)-Tree[pos];
lazy[pos]^=;
return;
}
int mid=(l+r)>>;
pushdown(pos,r-l+);
if(L<=mid) update(L,R,l,mid,pos<<);
if(mid<R)update(L,R,mid+,r,pos<<|);
pushup(pos);
}
int query(int L,int R,int l,int r,int pos)
{
if(L<=l&&r<=R)return Tree[pos];
int mid=(l+r)>>;
pushdown(pos,r-l+);
int ans=;
if(L<=mid) ans+=query(L,R,l,mid,pos<<);
if(R>mid) ans+=query(L,R,mid+,r,pos<<|);
return ans;
}
}row,col; int main() {
char op[];
int n = N;
row.init();
col.init();
int l,r,val;
int lx,ly,rx,ry;
char sign[];
int m;
scanf("%d",&m);
while(m--)
{
scanf("%s",sign);
if(sign[]=='x')
{
scanf("%d%d",&l,&r);
++l,++r;
row.update(l,r,,n,);
}
else if(sign[]=='y'){
scanf("%d%d",&l,&r);
++l,++r;
col.update(l,r,,n,);
}
else
{
scanf("%d%d%d%d",&lx,&ly,&rx,&ry);
++lx,++ly,++rx,++ry;
int nx=row.query(lx,rx,,n,);
int ny=col.query(ly,ry,,n,);
ll ans=(ll)(rx-lx+)*ny+(ll)(ry-ly+)*nx-(ll)*nx*ny;
printf("%lld\n",ans);
}
}
}

 

SPOJ IITWPC4F - Gopu and the Grid Problem (双线段树区间修改 区间查询)的更多相关文章

  1. spoj IITWPC4F - Gopu and the Grid Problem 线段树

    IITWPC4F - Gopu and the Grid Problem no tags  Gopu is interested in the integer co-ordinates of the ...

  2. SPOJ GSS2 - Can you answer these queries II(线段树 区间修改+区间查询)(后缀和)

    GSS2 - Can you answer these queries II #tree Being a completist and a simplist, kid Yang Zhe cannot ...

  3. SPOJ BGSHOOT - Shoot and kill (线段树 区间修改 区间查询)

    BGSHOOT - Shoot and kill no tags  The problem is about Mr.BG who is a great hunter. Today he has gon ...

  4. A Simple Problem with Integers POJ - 3468 线段树区间修改+区间查询

    //add,懒标记,给以当前节点为根的子树中的每一个点加上add(不包含根节点) // #include <cstdio> #include <cstring> #includ ...

  5. A Simple Problem with Integers-POJ3468 区间修改+区间查询

    题意: 给你n个数和2个操作,C操作是将一个区间内的每个数都加上k,Q操作是询问一个区间的和 链接:http://poj.org/problem?id=3468 思路: 线段树区间修改+区间查询 代码 ...

  6. POJ.3468 A Simple Problem with Integers(线段树 区间更新 区间查询)

    POJ.3468 A Simple Problem with Integers(线段树 区间更新 区间查询) 题意分析 注意一下懒惰标记,数据部分和更新时的数字都要是long long ,别的没什么大 ...

  7. HDU 5475(2015 ICPC上海站网络赛)--- An easy problem(线段树点修改)

    题目链接 http://acm.hdu.edu.cn/showproblem.php?pid=5475 Problem Description One day, a useless calculato ...

  8. BZOJ-3212 Pku3468 A Simple Problem with Integers 裸线段树区间维护查询

    3212: Pku3468 A Simple Problem with Integers Time Limit: 1 Sec Memory Limit: 128 MB Submit: 1278 Sol ...

  9. SPOJ GSS3-Can you answer these queries III-分治+线段树区间合并

    Can you answer these queries III SPOJ - GSS3 这道题和洛谷的小白逛公园一样的题目. 传送门: 洛谷 P4513 小白逛公园-区间最大子段和-分治+线段树区间 ...

随机推荐

  1. [洛谷P2044][NOI2012]随机数生成器

    题目大意:给你$m,a,c,X_0,n,g$,求$X_{n+1}=(a\cdot X_n+c) \bmod{m}$,最后输出对$g$取模 题解:矩阵快速幂+龟速乘,这里用了$long\;double$ ...

  2. BZOJ2120 数颜色 【带修改莫队】

    2120: 数颜色 Time Limit: 6 Sec  Memory Limit: 259 MB Submit: 6579  Solved: 2625 [Submit][Status][Discus ...

  3. 【BZOJ 1492】 [NOI2007]货币兑换Cash 斜率优化DP

    先说一下斜率优化:这是一种经典的dp优化,是OI中利用数形结合的思想解决问题的典范,通常用于优化dp,有时候其他的一些决策优化也会用到,看待他的角度一般有两种,但均将决策看为二维坐标系上的点,并转化为 ...

  4. LowercaseRoutesMVC ASP.NET MVC routes to lowercase URLs

    About this Project Tired of your MVC application generating mixed-case URLs like http://mysite.com/H ...

  5. HDU3488:Tour(KM算法)

    Tour Time Limit: 3000/1000 MS (Java/Others)    Memory Limit: 65535/65535 K (Java/Others)Total Submis ...

  6. java的多构造函数的处理方式

    /** * */ package P; import java.awt.List; import java.lang.reflect.Array; import java.util.ArrayList ...

  7. SpringMVC学习 -- ModelAndView , Model , ModelMap , Map 及 @SessionAttributes 的使用

    输出模型数据: ModelAndView:处理方法返回值类型为 ModelAndView 时 , 其中包含视图和模型信息.方法体即可通过该对象添加模型数据 , 即 SpringMVC 会把 Model ...

  8. HTTP协议中的ContenType类型大全(转)

    ".*"="application/octet-stream"".001"="application/x-001"&qu ...

  9. lesson 4 再谈继承多态,抽象类和接口

    再谈多态,抽象类和接口 上一次博客已经概念性的概述了继承多态,抽象类和接口,这次来具体的谈一谈他们之间的联系和需要注意的地方. 一.继承和多态:Inheritance (继承) & Polym ...

  10. 给 ecplise 配置struts2配置环境

    下面介绍在Eclipse中配置Struts2的过程: 一.下载Struts2,因为Struts2是开源的,百度或者google一下就可以找到下载地址.我下载的是struts-2.3.1.2版本 的,解 ...