제출 #292491

#제출 시각아이디문제언어결과실행 시간메모리
292491BertedExamination (JOI19_examination)C++14
100 / 100
719 ms27120 KiB
#include <iostream>
#include <algorithm>
#include <vector>
#define pii pair<int, int>
#define fst first
#define snd second
#define pip pair<int, pii>
#define ppp pair<pii, pii>
using namespace std;

const int INF = 1e9;

struct DS
{
	vector<int> C, A;
	DS() {C.push_back(-1);}
	void addPoint(int x) {C.push_back(x);}
	void prepDS()
	{
		sort(C.begin(), C.end());
		C.resize(unique(C.begin(), C.end()) - C.begin());
		A.resize(C.size());
	}
	void update(int x, int v)
	{
		auto it = prev(upper_bound(C.begin(), C.end(), x)) - C.begin();
		for (; it < A.size(); it += it & (-it)) {A[it] += v;}
	}
	int query(int x)
	{
		auto it = prev(upper_bound(C.begin(), C.end(), x)) - C.begin(); int ret = 0;
		for (; it; it -= it & (-it)) {ret += A[it];}
		return ret;
	}
};

namespace DS2
{
	vector<int> C;
	DS A[100001];
	void addPoint(int x) {C.push_back(x);}
	void prepDS()
	{
		C.push_back(-1);
		sort(C.begin(), C.end());
		C.resize(unique(C.begin(), C.end()) - C.begin());
	}
	void addPoint2(int x, int y)
	{
		auto it = prev(upper_bound(C.begin(), C.end(), x)) - C.begin();
		for (; it < C.size(); it += it & (-it)) {A[it].addPoint(y);}
	}
	void prepDS2()
	{
		for (int i = 0; i < C.size(); i++) {A[i].prepDS();}
	}
	void update(int x, int y, int v)
	{
		auto it = prev(upper_bound(C.begin(), C.end(), x)) - C.begin();
		for (; it < C.size(); it += it & (-it)) {A[it].update(y, v);}
	}
	int query(int x, int y)
	{
		auto it = prev(upper_bound(C.begin(), C.end(), x)) - C.begin(); int ret = 0;
		for (; it; it -= it & (-it)) {ret += A[it].query(y);}
		return ret;
	}
}

int N, Q;
pip A[100001];
ppp B[100001];
int ans[100001];

int main()
{
	ios :: sync_with_stdio(0); cin.tie(0); cout.tie(0);
	cin >> N >> Q;
	
	DS2 :: addPoint(-1);
	for (int i = 0; i < N; i++)
	{
		cin >> A[i].snd.fst >> A[i].snd.snd;
		A[i].fst = -(A[i].snd.fst + A[i].snd.snd);
		DS2 :: addPoint(A[i].snd.fst);
	}
	DS2 :: prepDS();
	
	for (int i = 0; i < N; i++)
	{
		DS2 :: addPoint2(A[i].snd.fst, A[i].snd.snd);
	}
	DS2 :: prepDS2();

	sort(A, A + N);

	for (int i = 0; i < Q; i++) 
	{
		cin >> B[i].snd.fst >> B[i].snd.snd >> B[i].fst.fst; 
		B[i].fst.snd = i;
		B[i].fst.fst = -B[i].fst.fst;
	}
	sort(B, B + Q);

	int j = 0;
	for (int i = 0; i < Q; i++)
	{
		for (; j < N && A[j].fst <= B[i].fst.fst; j++) 
		{
			DS2 :: update(A[j].snd.fst, A[j].snd.snd, 1);
		}
		ans[B[i].fst.snd] += DS2 :: query(INF, INF);
		ans[B[i].fst.snd] -= DS2 :: query(B[i].snd.fst - 1, INF);
		ans[B[i].fst.snd] -= DS2 :: query(INF, B[i].snd.snd - 1);
		ans[B[i].fst.snd] += DS2 :: query(B[i].snd.fst - 1, B[i].snd.snd - 1);
	}

	for (int i = 0; i < Q; i++)
	{
		cout << ans[i] << "\n";
	}

	return 0;
}

컴파일 시 표준 에러 (stderr) 메시지

examination.cpp: In member function 'void DS::update(int, int)':
examination.cpp:27:13: warning: comparison of integer expressions of different signedness: 'long int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   27 |   for (; it < A.size(); it += it & (-it)) {A[it] += v;}
      |          ~~~^~~~~~~~~~
examination.cpp: In function 'void DS2::addPoint2(int, int)':
examination.cpp:51:13: warning: comparison of integer expressions of different signedness: 'long int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   51 |   for (; it < C.size(); it += it & (-it)) {A[it].addPoint(y);}
      |          ~~~^~~~~~~~~~
examination.cpp: In function 'void DS2::prepDS2()':
examination.cpp:55:21: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   55 |   for (int i = 0; i < C.size(); i++) {A[i].prepDS();}
      |                   ~~^~~~~~~~~~
examination.cpp: In function 'void DS2::update(int, int, int)':
examination.cpp:60:13: warning: comparison of integer expressions of different signedness: 'long int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   60 |   for (; it < C.size(); it += it & (-it)) {A[it].update(y, v);}
      |          ~~~^~~~~~~~~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...