Submission #145861

#TimeUsernameProblemLanguageResultExecution timeMemory
145861TadijaSebez사다리꼴 (balkan11_trapezoid)C++11
100 / 100
256 ms26464 KiB
#include <bits/stdc++.h>
using namespace std;
#define pb push_back
const int N=100050;
const int M=2*N;
const int H=2*M;
const int mod=30013;
int ls[H],rs[H],tsz,root;
pair<int,int> mx[H];
pair<int,int> operator + (pair<int,int> a, pair<int,int> b)
{
	if(a.first!=b.first) return a.first<b.first?b:a;
	return {a.first,(a.second+b.second)%mod};
}
void Set(int &c, int ss, int se, int qi, pair<int,int> x)
{
	if(!c) c=++tsz;
	if(ss==se){ mx[c]=x;return;}
	int mid=ss+se>>1;
	if(qi<=mid) Set(ls[c],ss,mid,qi,x);
	else Set(rs[c],mid+1,se,qi,x);
	mx[c]=mx[ls[c]]+mx[rs[c]];
}
pair<int,int> Get(int c, int ss, int se, int qs, int qe)
{
	if(qs<=ss && qe>=se) return mx[c];
	int mid=ss+se>>1;
	if(qe<=mid) return Get(ls[c],ss,mid,qs,qe);
	if(qs>mid) return Get(rs[c],mid+1,se,qs,qe);
	return Get(ls[c],ss,mid,qs,qe)+Get(rs[c],mid+1,se,qs,qe);
}
vector<int> id1,id2;
int l1[N],r1[N],l2[N],r2[N];
pair<int,int> dp[N];
vector<int> Qs[M],Us[M];
int main()
{
	int n;
	scanf("%i",&n);
	for(int i=1;i<=n;i++)
	{
		scanf("%i %i %i %i",&l1[i],&r1[i],&l2[i],&r2[i]);
		id1.pb(l1[i]);id1.pb(r1[i]);
		id2.pb(l2[i]);id2.pb(r2[i]);
	}
	sort(id1.begin(),id1.end());
	id1.resize(unique(id1.begin(),id1.end())-id1.begin());
	sort(id2.begin(),id2.end());
	id2.resize(unique(id2.begin(),id2.end())-id2.begin());
	for(int i=1;i<=n;i++)
	{
		l1[i]=lower_bound(id1.begin(),id1.end(),l1[i])-id1.begin()+1;
		r1[i]=lower_bound(id1.begin(),id1.end(),r1[i])-id1.begin()+1;
		l2[i]=lower_bound(id2.begin(),id2.end(),l2[i])-id2.begin()+1;
		r2[i]=lower_bound(id2.begin(),id2.end(),r2[i])-id2.begin()+1;
		Qs[l1[i]].pb(i);
		Us[r1[i]].pb(i);
	}
	int sz=id2.size();
	Set(root,0,sz,0,{0,1});
	for(int j=1;j<=id1.size();j++)
	{
		for(int i:Qs[j])
		{
			dp[i]=Get(root,0,sz,0,l2[i]-1);
			dp[i].first++;
		}
		for(int i:Us[j])
		{
			Set(root,0,sz,r2[i],dp[i]);
		}
	}
	pair<int,int> ans={0,0};
	for(int i=1;i<=n;i++) ans=ans+dp[i];
	printf("%i %i\n",ans.first,ans.second);
	return 0;
}

Compilation message (stderr)

trapezoid.cpp: In function 'void Set(int&, int, int, int, std::pair<int, int>)':
trapezoid.cpp:19:12: warning: suggest parentheses around '+' inside '>>' [-Wparentheses]
  int mid=ss+se>>1;
          ~~^~~
trapezoid.cpp: In function 'std::pair<int, int> Get(int, int, int, int, int)':
trapezoid.cpp:27:12: warning: suggest parentheses around '+' inside '>>' [-Wparentheses]
  int mid=ss+se>>1;
          ~~^~~
trapezoid.cpp: In function 'int main()':
trapezoid.cpp:61:15: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
  for(int j=1;j<=id1.size();j++)
              ~^~~~~~~~~~~~
trapezoid.cpp:39:7: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
  scanf("%i",&n);
  ~~~~~^~~~~~~~~
trapezoid.cpp:42:8: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
   scanf("%i %i %i %i",&l1[i],&r1[i],&l2[i],&r2[i]);
   ~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
#Verdict Execution timeMemoryGrader output
Fetching results...