BZOJ 4822: [Cqoi2017]老C的任务

分析:

就是一个树状数组...把询问拆成四个...

考点大概就是把区间询问转化为前缀和相减...

代码:

#include<algorithm>
#include<iostream>
#include<cstring>
#include<cstdio>
//by NeighThorn
using namespace std;

const int maxn=100000+5;

int n,m,tot,lenx,leny,mpx[maxn<<2],mpy[maxn<<2];
long long ans,tr[maxn<<2];

struct M{
	int x,y,id,val;
	long long ans;
}q[maxn<<2],node[maxn];

inline bool cmp1(M a,M b){
	return a.x<b.x;
}

inline void insert(int x,int y){
	for(;x<=leny;x+=x&-x)
		tr[x]+=y;
}

inline long long query(int x){
	long long res=0;
	for(;x;x-=x&-x)
		res+=tr[x];
	return res;
}

inline bool cmp2(M a,M b){
	if(a.id!=b.id) return a.id<b.id;
}

signed main(void){
	scanf("%d%d",&n,&m);lenx=leny=n;
	for(int i=1;i<=n;i++)
		scanf("%d%d%d",&node[i].x,&node[i].y,&node[i].val),
		mpx[i]=node[i].x,mpy[i]=node[i].y;
	for(int i=1,x1,x2,y1,y2;i<=m;i++){
		scanf("%d%d%d%d",&x1,&y1,&x2,&y2);
		mpx[++lenx]=x1  ,mpx[++lenx]=x2  ,mpy[++leny]=y1,mpy[++leny]=y2;
		mpx[++lenx]=x1-1,mpy[++leny]=y1-1;
		q[++tot].x=x1-1,q[tot].y=y1-1,q[tot].id=i,q[tot].val= 1;
		q[++tot].x=x1-1,q[tot].y=y2  ,q[tot].id=i,q[tot].val=-1;
		q[++tot].x=x2  ,q[tot].y=y1-1,q[tot].id=i,q[tot].val=-1;
		q[++tot].x=x2  ,q[tot].y=y2  ,q[tot].id=i,q[tot].val= 1;
	}
	sort(mpx+1,mpx+lenx+1);
	sort(mpy+1,mpy+leny+1);
	lenx=unique(mpx+1,mpx+lenx+1)-mpx-1;
	leny=unique(mpy+1,mpy+leny+1)-mpy-1;
	for(int i=1;i<=n;i++)
		node[i].x=lower_bound(mpx+1,mpx+lenx+1,node[i].x)-mpx,
		node[i].y=lower_bound(mpy+1,mpy+leny+1,node[i].y)-mpy;
	for(int i=1;i<=tot;i++)
		q[i].x=lower_bound(mpx+1,mpx+lenx+1,q[i].x)-mpx,
		q[i].y=lower_bound(mpy+1,mpy+leny+1,q[i].y)-mpy;
	sort(q+1,q+tot+1,cmp1);
	sort(node+1,node+n+1,cmp1);
	for(int i=1,j=1;i<=tot;i++){
		for(;j<=n&&node[j].x<=q[i].x;j++)
			insert(node[j].y,node[j].val);
		q[i].ans=query(q[i].y);
	}
	sort(q+1,q+tot+1,cmp2);tot=0;
	for(int i=1;i<=m;i++){
		ans=0;
		tot++;ans+=q[tot].val*q[tot].ans;
		tot++;ans+=q[tot].val*q[tot].ans;
		tot++;ans+=q[tot].val*q[tot].ans;
		tot++;ans+=q[tot].val*q[tot].ans;
		printf("%lld\n",ans);
	}
	return 0;
}

  



By NeighThorn

时间: 2024-10-12 12:26:27

BZOJ 4822: [Cqoi2017]老C的任务的相关文章

BZOJ 4823: [Cqoi2017]老C的方块

分析: 我觉得我的网络流白学了...QAQ... 其实数据范围本是无法用网络流跑过去的,然而出题者想让他跑过去,也就跑过去了... 看到题目其实感觉很麻烦,不知道从哪里入手,那么仔细观察所给出的有用信息... 我们考虑网格图是一个含有挡板的图,这个挡板的分布很有规律,大概是每一行的相邻两个挡板都隔了四个格子,并且奇数行的排列相同,偶数行的排列相同... 然后考虑不合法的方块形状有什么共同点:仔细观察就会发现,所有的不合法图形中,挡板的左边至少有一个格子,右边至少有一个格子,并且左边的格子连着一个

BZOJ 4824: [Cqoi2017]老C的键盘

Description 上一题弱化版,\(n\leqslant 100\) Solution 树形DP. Code /************************************************************** Problem: 4824 User: BeiYu Language: C++ Result: Accepted Time:188 ms Memory:18580 kb *******************************************

bzoj4822: [Cqoi2017]老C的任务

4822: [Cqoi2017]老C的任务 Time Limit: 20 Sec  Memory Limit: 512 MBSubmit: 284  Solved: 152[Submit][Status][Discuss] Description 老 C 是个程序员. 最近老 C 从老板那里接到了一个任务--给城市中的手机基站写个管理系统.作为经验丰富的程序员,老 C 轻松 地完成了系统的大部分功能,并把其中一个功能交给你来实现.由于一个基站的面积相对于整个城市面积来说非常 的小,因此每个的基站

bzoj4823: [Cqoi2017]老C的方块(最小割)

4823: [Cqoi2017]老C的方块 题目:传送门 题解: 毒瘤题ORZ.... 太菜了看出来是最小割啥边都不会建...狂%大佬强强强   黑白染色?不!是四个色一起染,四层图跑最小割... 很惊奇的发现染完色之后只要是不喜欢的图形都一定可以由黄-->黑-->红-->绿 组成 那就很nice啦...兴高采烈的去敲代码...结果10^5*10^5???搞毛线...太弱了ORZ,又看了一波大佬的操作,用map存! woc...不谈了不谈了...撸撸撸(分情况分到想屎...虽然不多) 注

[BZOJ4824][CQOI2017]老C的键盘(树形DP)

4824: [Cqoi2017]老C的键盘 Time Limit: 10 Sec  Memory Limit: 512 MBSubmit: 193  Solved: 149[Submit][Status][Discuss] Description 老 C 是个程序员. 作为一个优秀的程序员,老 C 拥有一个别具一格的键盘,据说这样可以大幅提升写程序的速度,还能让写出来的程序 在某种神奇力量的驱使之下跑得非常快.小 Q 也是一个程序员.有一天他悄悄潜入了老 C 的家中,想要看看这个 键盘究竟有何妙

[CQOI2017]老C的键盘

[CQOI2017]老C的键盘 题目描述 额,网上题解好像都是用的一大堆组合数,然而我懒得推公式. 设\(f[i][j]\)表示以\(i\)为根,且\(i\)的权值为\(j\)的方案数. 转移: \[ f[i][j]=\sum f[sn_1][k]*f[sn_2][q] \] 需要判断一下\(k,q\)与\(j\)的关系满不满足题意就行了. 但是这样的答案显然不对,因为有些权值可能多次出现. 换句话说,有些权值可能没有出现.所以我们就用那个经典的容斥,枚举颜色数上界. 设\(g[s]\)表示颜色

【BZOJ1935/4822】[Shoi2007]Tree 园丁的烦恼/[Cqoi2017]老C的任务 树状数组

题意:两道题差不多,都是给你一堆平面上的点,每个点有权值,然后m次询问求某一矩形区域内的点权和 题解:先离散化,然后将询问拆成左右两条线段,然后将点和这些线段一起按x坐标排序,在y轴上维护树状数组.然后询问的答案就是两条线段上点权和之差 BZOJ1935: #include <cstdio> #include <cstring> #include <iostream> #include <algorithm> using namespace std; int

[bzoj4823][洛谷P3756][Cqoi2017]老C的方块

Description 老 C 是个程序员. 作为一个懒惰的程序员,老 C 经常在电脑上玩方块游戏消磨时间.游戏被限定在一个由小方格排成的R行C列网格上 ,如果两个小方格有公共的边,就称它们是相邻的,而且有些相邻的小方格之间的公共边比较特殊.特殊的公共边排 列得有很强的规律.首先规定,第1行的前两个小方格之间的边是特殊边.然后,特殊边在水平方向上每4个小方格为 一个周期,在竖直方向上每2个小方格为一个周期.所有的奇数列与下一列之间都有特殊边,且所在行的编号从左到 右奇偶交替.下图所示是一个R =

[bzoj4824][洛谷P3757][Cqoi2017]老C的键盘

Description 老 C 是个程序员. 作为一个优秀的程序员,老 C 拥有一个别具一格的键盘,据说这样可以大幅提升写程序的速度,还能让写出来的程序 在某种神奇力量的驱使之下跑得非常快.小 Q 也是一个程序员.有一天他悄悄潜入了老 C 的家中,想要看看这个 键盘究竟有何妙处.他发现,这个键盘共有n个按键,这n个按键虽然整齐的排成一列,但是每个键的高度却互不相同 .聪明的小 Q 马上将每个键的高度用 1 ~ n 的整数表示了出来,得到一个 1 ~ n 的排列 h1, h2,..., hn .为