Cod sursa(job #426351)

Utilizator lucaz0rLuca Liviu lucaz0r Data 26 martie 2010 19:54:23
Problema Medie Scor 30
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.29 kb
#include <stdio.h>
#include <stdlib.h>
#include <vector>
#include <algorithm>

using namespace std;

int main() {
	
    vector<long> sol(1);
	long n,i,j,nr,curentval=0,curent=0,k,l,cont=0;
	freopen ("medie.in", "r", stdin);
	freopen ("medie.out", "w", stdout);
	
	scanf ("%ld", &n);
	vector<int> a(n);
	vector<int>::iterator p,q;
	for (i=0; i<n; i++) scanf ("%d",&a[i]);
    sort (a.begin(), a.end());
	nr = 0;
	sol[nr]=0;
	//for (i=0; i<n; i++) printf ("%d ", a[i]);
	for (i=0; i<n; i++) 
		for (j=i+1; j<n; j++) 
			if ((a[i]+a[j])%2==0) { p=lower_bound(a.begin(), a.end(),(a[i]+a[j])/2); 
					if (a[p-a.begin()] != (a[i]+a[j])/2) { curentval =0; curent=a[j]; }
					else { q=upper_bound(a.begin(), a.end(), (a[i]+a[j])/2);
						curent=a[j];
						curentval=(q-a.begin())-(p-a.begin());
						//printf ("pentru %d si %d avem %d posibilitati\n", a[i],a[j],curentval);
						if (i>=(p-a.begin()) && i<=(q-a.begin()-1)) curentval--;
						if (j>=(p-a.begin()) && j<=(q-a.begin()-1)) curentval--;
						//printf ("pentru %d si %d avem %d posibilitati\n", a[i],a[j],curentval);
						sol[nr]+=curentval;
						//printf ("am marit cu %d\n", curentval);
						if (a[j+1] == curent) { cont = 0;
									  for (l=j+1; l<n; l++) 
										if ((a[l] > a[j]) || (l==n-1)) 
										 if (l==n-1) { cont = cont+l-j; break;}
										 else {cont=cont+l-j-1; break;}
									  sol[nr]+=cont*curentval;
									  j=l;
			                          //printf ("am marit cu %d facut din %d si %d \n", cont*curentval, cont,curentval);
			                          for (k=nr; k>=0; k--)
										if (sol[k] > 9) 
											if (k==0) { sol.insert (sol.begin(), sol[k]/10); sol[k+1]=sol[k+1]%10; nr++;  }
											else { sol[k-1]+=sol[k]/10; sol[k]=sol[k]%10; }
										else break;
									//for (i=0; i<=nr; i++) printf ("%d",sol[i]);	
									//printf ("\n");
				        }
						//printf ("am marit cu %d\n", curentval);
						for (k=nr; k>=0; k--)
							if (sol[k] > 9) 
								if (k==0) { sol.insert (sol.begin(), sol[k]/10); sol[k+1]=sol[k+1]%10; nr++; }
								else { sol[k-1]+=sol[k]/10; sol[k]=sol[k]%10;}
							else break;
						//for (i=0; i<=nr; i++) printf ("%d",sol[i]);	
						//printf ("\n");		
					}
				}
	for (i=0; i<=nr; i++) printf ("%d",sol[i]);	
	return 0;
}