답안 #126144

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
126144 2019-07-07T06:02:42 Z dndhk Examination (JOI19_examination) C++14
2 / 100
3000 ms 324076 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;



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<S> vt, vt2;

struct SEG{
	struct Node{
		Node(int l, int r, int sum) : l(l), r(r), sum(sum) {}
		int l, r;
		int sum;
	};
	vector<Node> seg;
	void Init(){
		seg.pb({-1, -1, 0});
	}
	void Update(int x){
		//printf("%d\n", x);
		update(0, 0, INF, x);
	}
	void update(int idx, int s, int e, int k){
		while(1){
			seg[idx].sum++;
			if(s==e)	return;
			if(k<=(s+e)/2){
				if(seg[idx].l==-1){
					seg[idx].l = seg.size(); seg.pb({-1, -1, 0});
				}
				idx = seg[idx].l; e = (s+e)/2;
			}else{
				if(seg[idx].r == -1){
					seg[idx].r = seg.size(); seg.pb({-1, -1, 0});
				}
				idx = seg[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({0, 0, INF});
		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 += seg[idx].sum;
				continue;
			}
			if(x>e || y<s)	continue;
			vt.pb({seg[idx].l, s, (s+e)/2}); vt.pb({seg[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;
SEG tSEG;

struct SEG2{
	struct Node{
		Node(int l, int r, int num) : l(l), r(r), num(num) {}
		int l, r, num;
	};
	vector<Node> seg;
	int N;
	void Init(){
		N = INF;
		seg.pb({-1, -1, -1});
	}
	vector<int> vt;
	void Update(int x, int y){
		update(0, 0, N, x);
		for(int i=0; i<vt.size(); i++){
			tree[vt[i]].Update(y);
		}
		vt.clear();
	}
	void update(int idx, int s, int e, int k){
		while(1){
			if(seg[idx].num==-1){
				seg[idx].num = tree.size(); tree.pb(tSEG); tree[seg[idx].num].Init();
			}
			vt.pb(seg[idx].num);
			if(s==e)	return;
			if(k<=(s+e)/2){
				if(seg[idx].l==-1){
					seg[idx].l = seg.size(); seg.pb({-1, -1, -1});
				}
				idx = seg[idx].l; e = (s+e)/2;
			}else{
				if(seg[idx].r == -1){
					seg[idx].r = seg.size(); seg.pb({-1, -1, -1});
				}
				idx = seg[idx].r; s = (s+e)/2+1;
			}
		}
	}
	int Sum(int x, int y, int z, int w){
		vt2.pb({0, 0, N});
		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(seg[idx].num==-1)	continue;
			if(x<=s && e<=y)	{
				ret += tree[seg[idx].num].Sum(z, w);
				continue;
			}
			if(x>e || y<s)	continue;
			vt2.pb({seg[idx].l, s, (s+e)/2}); vt2.pb({seg[idx].r, (s+e)/2+1, e});
		}
		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;
	}
};

vector<S> v;
vector<Query> query;
int ans[MAX_N+1];

int main(){
	scanf("%d%d", &M, &Q);
	for(int i=0; i<M; i++){
		int a, b; scanf("%d%d", &a, &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);
		query.pb({c, a, b, i});
	}
	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(now.b, INF, now.c, INF);
			//cout<<endl;
		}else{
			S now = v.back(); v.pop_back();
			//cout<<now.a<<" "<<now.b<<" "<<now.c<<endl<<"======================="<<endl;
			Seg.Update(now.b, 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:113:17: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
   for(int i=0; i<vt.size(); i++){
                ~^~~~~~~~~~
examination.cpp: In function 'int main()':
examination.cpp:185: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:187: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:192: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 2 ms 376 KB Output is correct
2 Correct 2 ms 376 KB Output is correct
3 Correct 2 ms 376 KB Output is correct
4 Correct 2 ms 504 KB Output is correct
5 Correct 2 ms 504 KB Output is correct
6 Correct 2 ms 504 KB Output is correct
7 Correct 109 ms 38280 KB Output is correct
8 Correct 108 ms 38364 KB Output is correct
9 Correct 107 ms 38224 KB Output is correct
10 Correct 85 ms 27016 KB Output is correct
11 Correct 70 ms 23868 KB Output is correct
12 Correct 25 ms 504 KB Output is correct
13 Correct 111 ms 38404 KB Output is correct
14 Correct 112 ms 38232 KB Output is correct
15 Correct 111 ms 38340 KB Output is correct
16 Correct 66 ms 22556 KB Output is correct
17 Correct 78 ms 25540 KB Output is correct
18 Correct 20 ms 504 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Execution timed out 3051 ms 324076 KB Time limit exceeded
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Execution timed out 3051 ms 324076 KB Time limit exceeded
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 2 ms 376 KB Output is correct
2 Correct 2 ms 376 KB Output is correct
3 Correct 2 ms 376 KB Output is correct
4 Correct 2 ms 504 KB Output is correct
5 Correct 2 ms 504 KB Output is correct
6 Correct 2 ms 504 KB Output is correct
7 Correct 109 ms 38280 KB Output is correct
8 Correct 108 ms 38364 KB Output is correct
9 Correct 107 ms 38224 KB Output is correct
10 Correct 85 ms 27016 KB Output is correct
11 Correct 70 ms 23868 KB Output is correct
12 Correct 25 ms 504 KB Output is correct
13 Correct 111 ms 38404 KB Output is correct
14 Correct 112 ms 38232 KB Output is correct
15 Correct 111 ms 38340 KB Output is correct
16 Correct 66 ms 22556 KB Output is correct
17 Correct 78 ms 25540 KB Output is correct
18 Correct 20 ms 504 KB Output is correct
19 Execution timed out 3051 ms 324076 KB Time limit exceeded
20 Halted 0 ms 0 KB -