SPOJ IITWPC4F - Gopu and the Grid Problem (双线段树区间修改 区间查询)
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 (双线段树区间修改 区间查询)的更多相关文章
- 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 ...
- 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 ...
- 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 ...
- A Simple Problem with Integers POJ - 3468 线段树区间修改+区间查询
//add,懒标记,给以当前节点为根的子树中的每一个点加上add(不包含根节点) // #include <cstdio> #include <cstring> #includ ...
- A Simple Problem with Integers-POJ3468 区间修改+区间查询
题意: 给你n个数和2个操作,C操作是将一个区间内的每个数都加上k,Q操作是询问一个区间的和 链接:http://poj.org/problem?id=3468 思路: 线段树区间修改+区间查询 代码 ...
- POJ.3468 A Simple Problem with Integers(线段树 区间更新 区间查询)
POJ.3468 A Simple Problem with Integers(线段树 区间更新 区间查询) 题意分析 注意一下懒惰标记,数据部分和更新时的数字都要是long long ,别的没什么大 ...
- HDU 5475(2015 ICPC上海站网络赛)--- An easy problem(线段树点修改)
题目链接 http://acm.hdu.edu.cn/showproblem.php?pid=5475 Problem Description One day, a useless calculato ...
- 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 ...
- SPOJ GSS3-Can you answer these queries III-分治+线段树区间合并
Can you answer these queries III SPOJ - GSS3 这道题和洛谷的小白逛公园一样的题目. 传送门: 洛谷 P4513 小白逛公园-区间最大子段和-分治+线段树区间 ...
随机推荐
- HDU 5655 四边形判断
CA Loves Stick Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 262144/262144 K (Java/Others) ...
- org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type [com.oskyhang.gbd.service.UserService] found for dependency: expected at least 1 bean which qualifies as aut
spring中一个符号的错误居然让我浪费了四五个小时才找出来,不得不给自己了两个耳光.. 由于新建项目与原来项目的目录结构有所不同,copy过来的配置文件,有些地方修改的不彻底,导致spring扫描注 ...
- Drac6-Web界面无法访问
1. ssh idracip, and reset RAC -- will need around 10mins /admin1-> racadm racreset RAC reset oper ...
- shell编程---变量赋值
echo $filen | awk -F. '{print $3}' 怎么把上边这行脚本产生的字串赋给一个变量啊,实际上会产生一个数, 这个变量用来存这个数.格式应该是怎么写的? a=`echo $ ...
- MFC 监控界面上所有文本框值的变化
//控件消息,菜单,按钮等 BOOL CXXDlg::OnCommand(WPARAM wParam, LPARAM lParam) { // TODO: 在此添加专用代码和/或调用基类 int wm ...
- [05] call by sharing || 共享参数
转: https://segmentfault.com/a/1190000005177386 众所周知,JavaScript中参数是按值传递的.与访问变量不同,基本类型和引用类型的参数在传递时都如同变 ...
- MUI -- plus初始化原理及plus is not defined,mui is not defined 错误汇总
不要在没有plus和mui的环境下调用相关API 普通浏览器里没有plus环境,只有HBuilder真机运行和打包后才能运行plus api. 在普通浏览器里运行时plus api时控制台必然会输出p ...
- java bigdemical比较大小
版权声明:本文为博主原创文章,未经博主允许不得转载. https://blog.csdn.net/qq_33451004/article/details/71247041 java中对bigdimic ...
- HDU 1395
2^x mod n = 1 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Tot ...
- Intelij idea新窗口打开项目设置
1.idea 打开后 file->setting 2.appearance&behave->system setting->open project in new win ...