Submission #344146

#TimeUsernameProblemLanguageResultExecution timeMemory
344146pure_memtrapezoid (balkan11_trapezoid)C++14
100 / 100
172 ms11048 KiB
#include <bits/stdc++.h>

#define X first
#define Y second
#define MP make_pair
#define ll long long

using namespace std;

const int N = 1e5 + 1;
const int mod = 30013;

pair<int, int> t[N * 8], dp[N];
void upd(int v, int tl, int tr, int pos, pair<int, int> val){
	if(tl > pos || pos > tr)
		return;
	if(tl == tr)
		return void(t[v] = val);
	int tm = (tl + tr) / 2;
	upd(v * 2, tl, tm, pos, val);
	upd(v * 2 + 1, tm + 1, tr, pos, val);
	if(t[v * 2].X > t[v * 2 + 1].X)
		t[v] = t[v * 2];
	else if(t[v * 2].X < t[v * 2 + 1].X)
		t[v] = t[v * 2 + 1];
	else
		t[v] = MP(t[v * 2].X, (t[v * 2].Y + t[v * 2 + 1].Y) % mod);
}
pair<int, int> get(int v, int tl, int tr, int l, int r){
	if(tl > r || l > tr)
		return MP(0, 0);
	if(tl >= l && tr <= r)
		return t[v];
    int tm = (tl + tr) / 2;
    pair<int, int> left = get(v * 2, tl, tm, l, r), right = get(v * 2 + 1, tm + 1, tr, l, r);
    if(left.X > right.X)
    	return left;
    else if(left.X < right.X)
    	return right;
    else
    	return MP(left.X, (left.Y + right.Y) % mod);
}    
int a[4][N], n, m;                                     
void shrink(){
	vector< pair< int, pair<int, int> > > tmp;
	scanf("%d", &n);
	for(int i = 1;i <= n;i++)
		for(int j = 0;j < 4;j++){
			scanf("%d", &a[j][i]); 
			if(j > 1)
				tmp.push_back(MP(a[j][i], MP(j, i)));
	    }
	sort(tmp.begin(), tmp.end());
	for(int i = 0;i < 2 * n;i++){
		if(i == 0 || tmp[i - 1].X != tmp[i].X)
			m++;
		a[tmp[i].Y.X][tmp[i].Y.Y] = m;	
	}
}                              

int main () {
	shrink();
	vector<int> tmp;
	int len = 0, ans = 0;
	for(int i = 1;i <= n;i++)
		tmp.push_back(i), tmp.push_back(-i);
	sort(tmp.begin(), tmp.end(), [](int x, int y){
		x = x > 0?a[1][x]:a[0][-x];
		y = y > 0?a[1][y]:a[0][-y];
		return x < y;
	});
	for(int v: tmp){
		if(v < 0){
			v = -v;
			dp[v] = get(1, 1, m, 1, a[2][v]);
			dp[v].X += 1;
			if(dp[v].X == 1)
				dp[v].Y += 1;
			if(dp[v].X > len)
				len = dp[v].X, ans = dp[v].Y;
			else if(dp[v].X == len)
				ans = (ans + dp[v].Y) % mod;
		}
		else{
		    upd(1, 1, m, a[3][v], dp[v]);
		}		
	}
	printf("%d %d", len, ans);
}

Compilation message (stderr)

trapezoid.cpp: In function 'void shrink()':
trapezoid.cpp:46:7: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
   46 |  scanf("%d", &n);
      |  ~~~~~^~~~~~~~~~
trapezoid.cpp:49:9: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
   49 |    scanf("%d", &a[j][i]);
      |    ~~~~~^~~~~~~~~~~~~~~~
#Verdict Execution timeMemoryGrader output
Fetching results...