[LOJ3021][樹狀數組][掃描線]CQOI2017:老C的任務

LOJ3021

這掃描線敢不敢再水一點
好像沒法更水了

Code:

#include<bits/stdc++.h>
#define ll long long
using namespace std;
inline ll read(){
	ll res=0,f=1;char ch=getchar();
	while(!isdigit(ch)) {if(ch=='-') f=-f;ch=getchar();}
	while(isdigit(ch)) {res=(res<<1)+(res<<3)+(ch^48);ch=getchar();}
	return res*f;
}
const int N=8e5+5;
int cnt;
namespace Bit{
	ll tr[N];
	inline int lb(int x){return x&(-x);}
	inline void add(int x,ll v){for(int i=x;i<=cnt;i+=lb(i)) tr[i]+=v;}
	inline ll ask(int x){ll res=0;for(int i=x;i;i-=lb(i)) res+=tr[i];return res;}
}
using namespace Bit;
struct point{
	int x,y;ll val;
	point(){}
	point(int _x,int _y,ll _val):x(_x),y(_y),val(_val){}
	inline bool operator < (const point &a)const{return x<a.x;}
}p[N];
struct Q{
	int x,l,r,id;
	Q(){}
	Q(int _x,int _l,int _r,int _id):x(_x),l(_l),r(_r),id(_id){}
	inline bool operator < (const Q &a)const{return x<a.x;}
}q[N];
int n,m;
int x[N],y[N];ll val[N];
int qx[N],qy[N],qx1[N],qy1[N];
int a[N],qcnt=0;
ll ans[N];
inline int get(int x){return lower_bound(a+1,a+cnt+1,x)-a;}
int main(){
	n=read();m=read();
	for(int i=1;i<=n;i++){
		x[i]=read(),y[i]=read();val[i]=read();
		a[++cnt]=x[i];a[++cnt]=y[i];
	}
	for(int i=1;i<=m;i++){
		qx[i]=read()-1,qy[i]=read()-1;qx1[i]=read(),qy1[i]=read();
		a[++cnt]=qx[i];a[++cnt]=qy[i];a[++cnt]=qx1[i];a[++cnt]=qy1[i];
	}
	sort(a+1,a+cnt+1);cnt=unique(a+1,a+cnt+1)-a-1;
	for(int i=1;i<=n;i++) p[i]=point(get(x[i]),get(y[i]),val[i]);
	for(int i=1;i<=m;i++) q[++qcnt]=Q(get(qx[i]),get(qy[i]),get(qy1[i]),i),q[++qcnt]=Q(get(qx1[i]),get(qy[i]),get(qy1[i]),i);
	sort(p+1,p+n+1);sort(q+1,q+qcnt+1);
	int now=1;
	for(int i=1;i<=qcnt;i++){
		while(p[now].x<=q[i].x && now<=n) add(p[now].y,p[now].val),++now;
		if(!ans[q[i].id]) ans[q[i].id]=ask(q[i].r)-ask(q[i].l);
		else ans[q[i].id]=ask(q[i].r)-ask(q[i].l)-ans[q[i].id];
	}
	for(int i=1;i<=m;i++) cout<<ans[i]<<"\n";
	return 0;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章