您的位置:首页 > 其它

[BOI Mokia]

2016-02-18 14:42 225 查看
绳命中第一道CDQ

#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
 
#define maxn 200010
using namespace std;
 
const int flag = -1;
 
struct query{
	int x, y, num, pos, ans;
	query(int x = 0, int y = 0, int num = 0):
		x(x), y(y), num(num){}
	bool operator<(const query& k)const{
		return x < k.x;
	}
	void print(){
		printf("%d %d %d %d %d\n", x, y, num, pos, ans);
	}
}q[maxn], nq[maxn];
 
bool cmp(const query& a, const query& b){
	return a.pos < b.pos;
}
 
int n, ans;
 
namespace BIT{
	#define maxm 2000010
	int t[maxm], vis[maxm], tim;
	int n;
	inline int lowbit(int x){
		return x & -x;
	}
	
	void update(int pos, int val){
		if(!pos)return;
		for(int i = pos; i <= n; i += lowbit(i)){
			if(vis[i] == tim)t[i] += val;
			else t[i] = val;
			vis[i] = tim;
		}
	}
	
	int ask(int pos){
		if(!pos)return 0;
		int ret = 0;
		for(int i = pos; i; i -= lowbit(i))
		    if(vis[i] == tim)
		        ret += t[i];
		return ret;
	}
}

void solve(int l, int r){
	if(l == r)return;
	int mid = l + r >> 1;
	int l1 = l, l2 = mid + 1;
	for(int i = l; i <= r; i ++){
		if(q[i].pos <= mid)
		    nq[l1 ++] = q[i];
		else nq[l2 ++] = q[i];
	}
	memcpy(q + l, nq + l, sizeof (q[0]) * (r - l + 1));
	solve(l, mid);
	BIT::tim ++;
	int j = l;
	for(int i = mid + 1; i <= r; i ++){
		for(;q[j].x <= q[i].x && j <= mid; j ++)
		    if(q[j].num != flag)
				BIT::update(q[j].y, q[j].num);
		if(q[i].num == flag)
			q[i].ans += BIT::ask(q[i].y);
	}
	solve(mid + 1, r);
	l1 = l, l2 = mid + 1;
	for(int i = l; i <= r; i ++){
		if((q[l1] < q[l2] && l1 <= mid) || l2 > r)
		    nq[i] = q[l1 ++];
		else nq[i] = q[l2 ++];
	}
	memcpy(q + l, nq + l, sizeof (q[0]) * (r - l + 1));
}
 
int main(){
    freopen("mokia.in", "r", stdin);
	freopen("mokia.out", "w", stdout);
	int mytest, p;
	scanf("%d%d", &mytest, &BIT::n);
	int x, y, z;
	int x1, y1, x2, y2;
	while(scanf("%d", &p), p != 3){
		if(p == 1){
			scanf("%d%d%d", &x, &y, &z);
			q[++ n] = query(x, y, z);
		}
		else{
			scanf("%d%d%d%d", &x1, &y1, &x2, &y2);
			q[++ n] = query(x1 - 1, y1 - 1, flag);	
			q[++ n] = query(x2, y1 - 1, flag);      
			q[++ n] = query(x1 - 1, y2, flag);   	
			q[++ n] = query(x2, y2, flag);  		
		}
	}
	for(int i = 1; i <= n; i ++)
	    q[i].ans = 0, q[i].pos = i;
    
	sort(q + 1, q + 1 + n);
	solve(1, n);
	sort(q + 1, q + 1 + n, cmp);
	
	int ans;
	for(int i = 1; i <= n; i ++){
		if(q[i].num == flag){
			ans = 0;
			ans += q[i ++].ans;
			ans -= q[i ++].ans;
			ans -= q[i ++].ans;
			ans += q[i].ans;
			printf("%d\n", ans);
		}
	}
	return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: