Cod sursa(job #212339)

Utilizator hadesgamesTache Alexandru hadesgames Data 5 octombrie 2008 10:19:49
Problema Secventa 5 Scor 90
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.84 kb
#include <cstdio>
#include <vector>
#include <queue>
#include <stack>
#include <list>
#include <set>
#include <algorithm>
#include <utility>
#include <string>
#include <functional>
#include <sstream>
#include <fstream>
#include <iostream>
using namespace std;
#define FOR(i,a,b) for (i=a;i<=b;i++)
#define fori(it,v) for (it=(v).begin();it!=(v).end();it++)
#define pb push_back
#define mp make_pair
#define fs first
#define ss second
#define all(c) c.begin(),c.end()
#define pf push_front
#define popb pop_back
#define popf pop_front
string s;
ifstream fin("secv5.in"); 
istringstream in;
vector<pair<unsigned int,int> > a(1048580),b(1048580);
int x[1048580],c,nr,x2[1048580];
long long sum1,sum2;
int main()
{
	FILE *out;
	int n,L,u,i;
	out=fopen("secv5.out","w");
	getline(fin,s,'\0');
	in.str(s);
	in>>n>>L>>u;
	for(i=1;i<=n;i++)
	{
		in>>a[i].fs;
		b[i-1].fs=a[i].fs;
		b[i-1].ss=i;
	}
	sort(all(b));
	vector<pair<unsigned int,int> >::iterator it,jt;
	it=jt=b.begin();
	it++;
	a[jt->ss].ss=1;
	for(;it!=b.end();++it,++jt)
	{
		a[it->ss].ss=a[jt->ss].ss;
		if (it->fs!=jt->fs)
			a[it->ss].ss++;
	}
	if (L!=1)
	{
	sum1=1;
	c=1;
	nr=1;
	x[a[1].ss]++;
	for (i=2;i<=n;++i)
	{
		if (!x[a[i].ss])
		{
			x[a[i].ss]++;
			if (nr==L-1)
			{
				while (c<i)
				{
					if (!(--x[a[c].ss]))
					{
						c++;
						break;
					}
					c++;
				}
			}
			else
				nr++;
		}
		else
			x[a[i].ss]++;
		sum1+=i-c+1;
	}
	}
	sum2=1;
	c=1;
	nr=1;
	x2[a[1].ss]++;
	for (i=2;i<=n;++i)
	{
		if (!x2[a[i].ss])
		{
			x2[a[i].ss]++;
			if (nr==u)
			{
				while (c<i)
				{
					if (!(--x2[a[c].ss]))
					{
						c++;
						break;
					}
					c++;
				}
			}
			else
				nr++;
		}
		else
			x2[a[i].ss]++;
		sum2+=i-c+1;

	}
	fprintf(out,"%lld\n",sum2-sum1);
	fclose(out);
	return 0;
}