답안 #135532

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
135532 2019-07-24T07:47:37 Z dndhk Examination (JOI19_examination) C++14
43 / 100
2228 ms 984060 KB
#include <bits/stdc++.h>
 
#define pb push_back
#define all(v) ((v).begin(), (v).end())
#define sortv(v) sort(all(v))
#define sz(v) ((int)(v).size())
#define uniqv(v) (v).erase(unique(all(v)), (v).end())
#define umax(a, b) (a)=max((a), (b))
#define umin(a, b) (a)=min((a), (b))
#define FOR(i,a,b) for(int i = (a); i <= (b); i++)
#define rep(i,n) FOR(i,1,n)
#define rep0(i,n) FOR(i,0,(int)(n)-1)
#define FI first
#define SE second
#define INF 1000000000
#define INFLL 1000000000000000000LL
 
const int MAX_N = 100000;
 
using namespace std;
typedef long long ll;
typedef pair<int, int> pii;
typedef pair<ll, ll> pll;
 
int NX, NY;
 
 
struct S{
	S(int a, int b, int c) : a(a), b(b), c(c) {}
	int a, b, c;
	bool operator <(const S &t)const{
		return a<t.a;
	}
};

vector<int> vct;
vector<S> vt, vt2;
struct Node1{
	int l=-1, r=-1;
	int sum=0;
};

vector<Node1> seg1(MAX_N*400);
int cnt1 = 0;

struct SEG{
	int r;
	void Init(){
		r = cnt1++;
	}
	void Update(int x){
		//printf("%d\n", x);
		update(r, 0, NY, x);
	}
	void update(int idx, int s, int e, int k){
		while(1){
			seg1[idx].sum++;
			if(s==e)	return;
			if(k<=(s+e)/2){
				if(seg1[idx].l==-1){
					seg1[idx].l = cnt1++;
				}
				idx = seg1[idx].l; e = (s+e)/2;
			}else{
				if(seg1[idx].r == -1){
					seg1[idx].r = cnt1++;
				}
				idx = seg1[idx].r; s = (s+e)/2+1;
			}
		}
	}
	int Sum(int x, int y){
		//cout<<x<<" "<<y<<endl;
		int ret = 0;
		int idx, s, e;
		vt.pb({r, 0, NY});
		while(!vt.empty()){
			idx = vt.back().a; s = vt.back().b; e = vt.back().c; vt.pop_back();
			if(idx==-1)	continue;
			if(x<=s && e<=y){
				ret += seg1[idx].sum;
				continue;
			}
			if(x>e || y<s)	continue;
			vt.pb({seg1[idx].l, s, (s+e)/2}); vt.pb({seg1[idx].r, (s+e)/2+1, e});
		}
		return ret;
	}/*
	int sum(int idx, int s, int e, int x, int y){
		if(x==-1)	return 0;
		if(x<=s && e<=y)	{
			//if(seg[idx].sum!=0)	cout<<s<<" "<<e<<" "<<seg[idx].sum<<endl;
			return seg[idx].sum;
		}
		if(x>e || y<s)	return 0;
		return sum(seg[idx].l, s, (s+e)/2, x, y) + sum(seg[idx].r, (s+e)/2+1, e, x, y);
	}*/
};
 
vector<SEG> tree(MAX_N*2);
int cnt = 0;
SEG tSEG;

struct Node2{
	int l=-1, r=-1, num=-1;
};

vector<Node2> seg2(MAX_N*2);
int cnt2 = 0;

struct SEG2{
	int r;
	int N;
	void Init(){
		N = INF;
		r = cnt2++;
	}
	void Update(int x, int y){
		update(r, 0, NX, x);
		for(int i=0; i<vct.size(); i++){
			tree[vct[i]].Update(y);
		}
		while(!vct.empty())	vct.pop_back();
	}
	void update(int idx, int s, int e, int k){
		while(1){
			if(seg2[idx].num==-1){
				seg2[idx].num = cnt++; tree[seg2[idx].num].Init();
			}
			vct.pb(seg2[idx].num);
			if(s==e)	return;
			if(k<=(s+e)/2){
				if(seg2[idx].l==-1){
					seg2[idx].l = cnt2++;
				}
				idx = seg2[idx].l; e = (s+e)/2;
			}else{
				if(seg2[idx].r == -1){
					seg2[idx].r = cnt2++;
				}
				idx = seg2[idx].r; s = (s+e)/2+1;
			}
		}
	}
	int Sum(int x, int y, int z, int w){
		vt2.pb({r, 0, NX});
		int ret=0;
		int idx, s, e;
		while(!vt2.empty()){
			idx = vt2.back().a; s = vt2.back().b; e = vt2.back().c;	vt2.pop_back();
			if(idx==-1)	continue;
			if(seg2[idx].num==-1)	continue;
			if(x<=s && e<=y)	{
				vct.pb(seg2[idx].num);
				//ret += tree[seg[idx].num].Sum(z, w);
				continue;
			}
			if(x>e || y<s)	continue;
			vt2.pb({seg2[idx].l, s, (s+e)/2}); vt2.pb({seg2[idx].r, (s+e)/2+1, e});
		}
		while(!vct.empty()){
			ret += tree[vct.back()].Sum(z, w);
			vct.pop_back();
		}
		return ret;
	}
	/*
	int sum(int idx, int s, int e, int x, int y, int z, int w){
		if(idx==-1)	return 0;
		if(seg[idx].num==-1)	return 0;
		if(x<=s && e<=y){
			//cout<<s<<" "<<e<<" "<<z<<" "<<w<<" "<<tree[seg[idx].num].Sum(z, w)<<endl;
			return tree[seg[idx].num].Sum(z, w);
		}
		if(x>e || y<s)	return 0;
		return sum(seg[idx].l, s, (s+e)/2, x, y, z, w) + sum(seg[idx].r, (s+e)/2+1, e, x, y, z, w);
	}*/
};
 
SEG2 Seg;
 
int M, Q;
struct Query{
	Query(int a, int b, int c, int idx) : a(a), b(b), c(c), idx(idx) {}
	int a, b, c;
	int idx;
	bool operator <(const Query &t)const{
		return a<t.a;
	}
};
 
map<int, int> X, Y;
vector<int> vx, vy;
vector<S> v;
vector<Query> query;
int ans[MAX_N+1];
 
void cord(){
	sort(vx.begin(), vx.end()); sort(vy.begin(), vy.end());
	vx.erase(unique(vx.begin(), vx.end()), vx.end()); vy.erase(unique(vy.begin(), vy.end()), vy.end());
	for(int i=0; i<vx.size(); i++){
		X[vx[i]] = i;
	}
	for(int i=0; i<vy.size(); i++){
		Y[vy[i]] = i;
	}
	NX = vx.size()-1; NY = vy.size()-1;
}
 
int main(){
	scanf("%d%d", &M, &Q);
	for(int i=0; i<M; i++){
		int a, b; scanf("%d%d", &a, &b);
		vx.pb(a); vy.pb(b);
		v.pb({a+b, a, b});
	}
	for(int i=0; i<Q; i++){
		int a, b, c;
		scanf("%d%d%d", &a, &b, &c);
		vx.pb(a); vy.pb(b);
		query.pb({c, a, b, i});
	}
	cord();
	sort(v.begin(), v.end());
	sort(query.begin(), query.end());
	Seg.Init();
	while(!query.empty()){
		if(v.empty() || query.back().a > v.back().a){
			Query now = query.back(); query.pop_back();
			ans[now.idx] = Seg.Sum(X[now.b], NX, Y[now.c], NY);
			//cout<<endl;
		}else{
			S now = v.back(); v.pop_back();
			//cout<<now.a<<" "<<now.b<<" "<<now.c<<endl<<"======================="<<endl;
			Seg.Update(X[now.b], Y[now.c]);
		}	
	}
	for(int i=0; i<Q; i++){
		printf("%d\n", ans[i]);
	}
 
	return 0;
}

Compilation message

examination.cpp: In member function 'void SEG2::Update(int, int)':
examination.cpp:120:17: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
   for(int i=0; i<vct.size(); i++){
                ~^~~~~~~~~~~
examination.cpp: In function 'void cord()':
examination.cpp:201:16: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
  for(int i=0; i<vx.size(); i++){
               ~^~~~~~~~~~
examination.cpp:204:16: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
  for(int i=0; i<vy.size(); i++){
               ~^~~~~~~~~~
examination.cpp: In function 'int main()':
examination.cpp:211:7: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
  scanf("%d%d", &M, &Q);
  ~~~~~^~~~~~~~~~~~~~~~
examination.cpp:213:18: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
   int a, b; scanf("%d%d", &a, &b);
             ~~~~~^~~~~~~~~~~~~~~~
examination.cpp:219:8: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
   scanf("%d%d%d", &a, &b, &c);
   ~~~~~^~~~~~~~~~~~~~~~~~~~~~
# 결과 실행 시간 메모리 Grader output
1 Correct 446 ms 473120 KB Output is correct
2 Correct 411 ms 473152 KB Output is correct
3 Correct 433 ms 473208 KB Output is correct
4 Correct 417 ms 473208 KB Output is correct
5 Correct 411 ms 473188 KB Output is correct
6 Correct 410 ms 473168 KB Output is correct
7 Correct 432 ms 474060 KB Output is correct
8 Correct 435 ms 474108 KB Output is correct
9 Correct 433 ms 474104 KB Output is correct
10 Correct 416 ms 473736 KB Output is correct
11 Correct 417 ms 473632 KB Output is correct
12 Correct 437 ms 473596 KB Output is correct
13 Correct 427 ms 473952 KB Output is correct
14 Correct 426 ms 474104 KB Output is correct
15 Correct 428 ms 474232 KB Output is correct
16 Correct 411 ms 473604 KB Output is correct
17 Correct 416 ms 473684 KB Output is correct
18 Correct 419 ms 473444 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 2221 ms 488972 KB Output is correct
2 Correct 2201 ms 489024 KB Output is correct
3 Correct 2228 ms 489000 KB Output is correct
4 Correct 897 ms 484180 KB Output is correct
5 Correct 805 ms 484264 KB Output is correct
6 Correct 526 ms 480452 KB Output is correct
7 Correct 2090 ms 488044 KB Output is correct
8 Correct 2020 ms 488208 KB Output is correct
9 Correct 1868 ms 487192 KB Output is correct
10 Correct 650 ms 484024 KB Output is correct
11 Correct 744 ms 484148 KB Output is correct
12 Correct 489 ms 480116 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 2221 ms 488972 KB Output is correct
2 Correct 2201 ms 489024 KB Output is correct
3 Correct 2228 ms 489000 KB Output is correct
4 Correct 897 ms 484180 KB Output is correct
5 Correct 805 ms 484264 KB Output is correct
6 Correct 526 ms 480452 KB Output is correct
7 Correct 2090 ms 488044 KB Output is correct
8 Correct 2020 ms 488208 KB Output is correct
9 Correct 1868 ms 487192 KB Output is correct
10 Correct 650 ms 484024 KB Output is correct
11 Correct 744 ms 484148 KB Output is correct
12 Correct 489 ms 480116 KB Output is correct
13 Correct 1908 ms 489400 KB Output is correct
14 Correct 2152 ms 489540 KB Output is correct
15 Correct 2207 ms 489040 KB Output is correct
16 Correct 805 ms 484632 KB Output is correct
17 Correct 765 ms 484604 KB Output is correct
18 Correct 535 ms 480448 KB Output is correct
19 Correct 1956 ms 489596 KB Output is correct
20 Correct 2081 ms 489692 KB Output is correct
21 Correct 1692 ms 488884 KB Output is correct
22 Correct 664 ms 484152 KB Output is correct
23 Correct 749 ms 484184 KB Output is correct
24 Correct 490 ms 480176 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 446 ms 473120 KB Output is correct
2 Correct 411 ms 473152 KB Output is correct
3 Correct 433 ms 473208 KB Output is correct
4 Correct 417 ms 473208 KB Output is correct
5 Correct 411 ms 473188 KB Output is correct
6 Correct 410 ms 473168 KB Output is correct
7 Correct 432 ms 474060 KB Output is correct
8 Correct 435 ms 474108 KB Output is correct
9 Correct 433 ms 474104 KB Output is correct
10 Correct 416 ms 473736 KB Output is correct
11 Correct 417 ms 473632 KB Output is correct
12 Correct 437 ms 473596 KB Output is correct
13 Correct 427 ms 473952 KB Output is correct
14 Correct 426 ms 474104 KB Output is correct
15 Correct 428 ms 474232 KB Output is correct
16 Correct 411 ms 473604 KB Output is correct
17 Correct 416 ms 473684 KB Output is correct
18 Correct 419 ms 473444 KB Output is correct
19 Correct 2221 ms 488972 KB Output is correct
20 Correct 2201 ms 489024 KB Output is correct
21 Correct 2228 ms 489000 KB Output is correct
22 Correct 897 ms 484180 KB Output is correct
23 Correct 805 ms 484264 KB Output is correct
24 Correct 526 ms 480452 KB Output is correct
25 Correct 2090 ms 488044 KB Output is correct
26 Correct 2020 ms 488208 KB Output is correct
27 Correct 1868 ms 487192 KB Output is correct
28 Correct 650 ms 484024 KB Output is correct
29 Correct 744 ms 484148 KB Output is correct
30 Correct 489 ms 480116 KB Output is correct
31 Correct 1908 ms 489400 KB Output is correct
32 Correct 2152 ms 489540 KB Output is correct
33 Correct 2207 ms 489040 KB Output is correct
34 Correct 805 ms 484632 KB Output is correct
35 Correct 765 ms 484604 KB Output is correct
36 Correct 535 ms 480448 KB Output is correct
37 Correct 1956 ms 489596 KB Output is correct
38 Correct 2081 ms 489692 KB Output is correct
39 Correct 1692 ms 488884 KB Output is correct
40 Correct 664 ms 484152 KB Output is correct
41 Correct 749 ms 484184 KB Output is correct
42 Correct 490 ms 480176 KB Output is correct
43 Runtime error 2152 ms 984060 KB Execution killed with signal 11 (could be triggered by violating memory limits)
44 Halted 0 ms 0 KB -