답안 #777104

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
777104 2023-07-08T16:37:25 Z salmon Fish (IOI08_fish) C++14
95 / 100
535 ms 65268 KB
#include <bits/stdc++.h>
using namespace std;
int N,M;
int mod;
int l,h;
vector<pair<int,int>> v;
vector<pair<int,int>> oh;
bool usable[500100];
int mapping[500100];
bool o[500100];
int iv[500100];

struct node{
	int s,e,m;
	long long int v;
	node *l,*r;

	node(int S, int E){
		s = S;
		e = E;
		m = (s + e)/2;

		v = 1;

		if(s != e){
			l = new node(s,m);
			r = new node(m + 1, e);
		}
	}

	void update(int i, int k){
		if(s == e){
			v += k;
			v %= mod;
			return;
		}

		if(i <= m){
			l -> update(i,k);
		}
		else{
			r -> update(i,k);
		}

		v = (l -> v * r -> v) % mod;
	}

	long long int query(int S, int E){
		if(E < S) return 1;

		if(S <= s && e <= E){
			return v;
		}

		long long int V = 1;

		if(S <= m){
			V *= l -> query(S,E);
		}
		if(m < E){
			V *= r -> query(S,E);
		}

		return V % mod;
	}

}*lroot;



int main(){
	scanf(" %d",&N);
	scanf(" %d",&M);

	scanf(" %d",&mod);

	int next[500100];

	for(int i = 1; i <= M; i++){
		next[i] = -1;
	}

	for(int i = 0; i <= M; i++) usable[i] = false;

	for(int i = 0; i < N; i++){
		scanf(" %d",&l);
		scanf(" %d",&h);

		v.push_back(make_pair(l,h));
	}

	sort(v.begin(),v.end(),greater<pair<int,int>>());

	for(int i = 0; i <= M; i++){
		o[i] = true;
	}

	for(int i = 0; i < v.size(); i++){
		if(o[v[i].second]){
			oh.push_back(v[i]);
			o[v[i].second] = false;
			iv[v[i].second] = v[i].first;
		}
		else if(v[i].first * 2 > iv[v[i].second]){
			next[v[i].second] = v[i].first;
		}
	}

	lroot = new node(0,M);

	int it = 0;
	int it1 = 0;

	reverse(oh.begin(),oh.end());

	for(int i = 0; i < oh.size(); i++){
		mapping[oh[i].second] = i;
	}

	reverse(oh.begin(),oh.end());

	reverse(v.begin(),v.end());

	long long int bigans = 0;

	M = oh.size();

	for(int i = 0; i < N; i++){
		while(it != N && v[i].first >= v[it].first * 2){
			lroot -> update(mapping[v[it].second], 1);
            it++;
        }

		if(v[i] == oh.back()){
			usable[oh.back().second] = true;


 			bigans += lroot -> query(0,M - oh.size());
 			//printf("v: %d %d\n",lroot -> query(0,M - oh.size()),bigans);
 			bigans %= mod;

 			//printf("%d %d\n",next[v[i].second],v[i].second);

			if(next[v[i].second] == -1){
				pair<int,int> f = *lower_bound(oh.begin(),oh.end(),make_pair(v[i].first * 2 - 1, 1100100100),greater<pair<int,int>>());

				//printf("%d %d\n",mapping[v[i].second],mapping[f.second]);
				//printf("g: %d\n",(lroot -> query(mapping[v[i].second] + 1, mapping[f.second] ) - 1));

				bigans += (lroot -> query(0,mapping[v[i].second] - 1)) * (lroot -> query(mapping[v[i].second] + 1, mapping[f.second] ) - 1);
			}
			else{
				int e = lower_bound(oh.begin(),oh.end(),make_pair(next[v[i].second] * 2 - 1, 1100100100),greater<pair<int,int>>()) -> second;

                //printf("%d\n",(lroot -> query(0,mapping[v[i].second] - 1)) * (lroot -> query(mapping[v[i].second] + 1, mapping[e] ) - 1));
				bigans += (lroot -> query(0,mapping[v[i].second] - 1)) * (lroot -> query(mapping[v[i].second] + 1, mapping[e] ) - 1);
			}
			//bigans += lroot -> query(1,v[i].second - 1) * (long long int) lroot -> query(v[i].second + 1, M);
			bigans %= mod;

			//printf("s  %d %d\n",v[i].first,bigans);

			oh.pop_back();
		}
	}

	printf("%d",bigans);
}
/*
 *
5
3
700
8 3
7 2
4 1
2 3
2 2

5
3
7
2 2
5 1
8 3
4 1
2 3

3 500 200
1 2
2 1
2 2
*
 */

Compilation message

fish.cpp: In function 'int main()':
fish.cpp:98:19: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<std::pair<int, int> >::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   98 |  for(int i = 0; i < v.size(); i++){
      |                 ~~^~~~~~~~~~
fish.cpp:116:19: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<std::pair<int, int> >::size_type' {aka 'long unsigned int'} [-Wsign-compare]
  116 |  for(int i = 0; i < oh.size(); i++){
      |                 ~~^~~~~~~~~~~
fish.cpp:167:11: warning: format '%d' expects argument of type 'int', but argument 2 has type 'long long int' [-Wformat=]
  167 |  printf("%d",bigans);
      |          ~^  ~~~~~~
      |           |  |
      |           |  long long int
      |           int
      |          %lld
fish.cpp:112:6: warning: unused variable 'it1' [-Wunused-variable]
  112 |  int it1 = 0;
      |      ^~~
fish.cpp:72:7: warning: ignoring return value of 'int scanf(const char*, ...)' declared with attribute 'warn_unused_result' [-Wunused-result]
   72 |  scanf(" %d",&N);
      |  ~~~~~^~~~~~~~~~
fish.cpp:73:7: warning: ignoring return value of 'int scanf(const char*, ...)' declared with attribute 'warn_unused_result' [-Wunused-result]
   73 |  scanf(" %d",&M);
      |  ~~~~~^~~~~~~~~~
fish.cpp:75:7: warning: ignoring return value of 'int scanf(const char*, ...)' declared with attribute 'warn_unused_result' [-Wunused-result]
   75 |  scanf(" %d",&mod);
      |  ~~~~~^~~~~~~~~~~~
fish.cpp:86:8: warning: ignoring return value of 'int scanf(const char*, ...)' declared with attribute 'warn_unused_result' [-Wunused-result]
   86 |   scanf(" %d",&l);
      |   ~~~~~^~~~~~~~~~
fish.cpp:87:8: warning: ignoring return value of 'int scanf(const char*, ...)' declared with attribute 'warn_unused_result' [-Wunused-result]
   87 |   scanf(" %d",&h);
      |   ~~~~~^~~~~~~~~~
# 결과 실행 시간 메모리 Grader output
1 Correct 1 ms 2260 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 1 ms 2260 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 1 ms 2260 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 1 ms 2260 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 1 ms 2260 KB Output is correct
2 Correct 1 ms 2260 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 2 ms 2260 KB Output is correct
2 Correct 139 ms 6968 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 1 ms 2260 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 2 ms 2260 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 59 ms 4424 KB Output is correct
2 Correct 79 ms 4772 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 2 ms 2516 KB Output is correct
2 Correct 3 ms 2524 KB Output is correct
3 Correct 3 ms 2528 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 94 ms 6420 KB Output is correct
2 Correct 173 ms 6844 KB Output is correct
3 Correct 162 ms 6892 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 151 ms 6492 KB Output is correct
2 Correct 160 ms 6884 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 95 ms 6436 KB Output is correct
2 Correct 169 ms 7364 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Incorrect 159 ms 7092 KB Output isn't correct
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 181 ms 8100 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 193 ms 10920 KB Output is correct
2 Correct 187 ms 17644 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 324 ms 22552 KB Output is correct
2 Correct 233 ms 21644 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 268 ms 22532 KB Output is correct
2 Correct 276 ms 17836 KB Output is correct
3 Correct 314 ms 28884 KB Output is correct
4 Correct 293 ms 17780 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 420 ms 28432 KB Output is correct
2 Correct 529 ms 64232 KB Output is correct
3 Correct 443 ms 65268 KB Output is correct
4 Correct 535 ms 51128 KB Output is correct