@ysner
2018-11-07T11:10:55.000000Z
字数 974
阅读 1737
暴力
一开始想了一个读入完再处理的暴力方法,比较麻烦。
其实可以考虑增量地看待这个问题。
如果当前客栈,则前面所有同色客栈都可为作出的贡献。
否则,就是上一个的客栈出现前,前面所有同色客栈的数量。
所以我们对每种颜色统计两个量:
每当碰到一个时,可以把所有更新为。
然后每次答案加上同色的即可。
然而有个细节,在时,当前点对答案没贡献,对有贡献。
复杂度。
也可以优化到。
#include<cstdio>
#include<cstdlib>
#include<cmath>
#include<cstring>
#include<algorithm>
#include<queue>
#define ll long long
#define re register
#define il inline
#define fp(i,a,b) for(re int i=a;i<=b;++i)
#define fq(i,a,b) for(re int i=a;i>=b;--i)
using namespace std;
const int N=55;
int n,k,p,num[N],las[N],now;
ll ans;
il ll gi()
{
re ll x=0,t=1;
re char ch=getchar();
while(ch!='-'&&(ch<'0'||ch>'9')) ch=getchar();
if(ch=='-') t=-1,ch=getchar();
while(ch>='0'&&ch<='9') x=x*10+ch-48,ch=getchar();
return x*t;
}
il int min(re int x,re int y){return x<y?x:y;}
int main()
{
n=gi();k=gi();p=gi();
fp(i,1,n)
{
re int col=gi(),val=gi();
if(val<=p)
fp(j,0,k-1) las[j]=num[j];
ans+=las[col];
if(val<=p) ++las[col];
++num[col];
}
printf("%lld\n",ans);
return 0;
}