#include <iostream>
#include <algorithm>
#include <stdio.h>
#include <set>
#include <vector>
#include <map>
using namespace std;
#define LL long long
LL tab[1000100];
LL funcel[1000][1000];
LL med2(int i, int j)
{
set<LL>s(tab+i,tab+j+1);
auto it = s.begin();
int l=(j-i+1)/2;
while(l--)it++;
if((j-i+1)%2==1)return *it * 2;
else
{
LL p=*it;
it--;
return (*it + p);
}
}
LL policz(int i, int j)
{
if(i>j)return 0;
return med2(i,j)+j-i+1;
}
int findmax(LL n)
{
int maxi = -1;
LL max = 0;
for (int i =0;i<n;i++)
{
if(tab[i]>max) {max=tab[i];maxi=i;}
}
return maxi;
}
set<pair<int,int>>odwiedzone;
LL ile=0;
LL cel=0;
LL n;
void rek(int i, int j)
{
if(odwiedzone.find(make_pair(i,j))!=odwiedzone.end()) return;
odwiedzone.insert(make_pair(i,j));
LL p = policz(i,j);
if (p!=cel)return;
ile++;
if(i>0)rek(i-1,j);
if(j<n-1)rek(i,j+1);
if(i!=j)
{
rek(i+1,j);
rek(i,j-1);
}
}
void alg()
{
cel = policz(0,n-1);
int i = findmax(n);
rek(i,i);
rek(0,n-1);
printf("%lld %lld\n",cel,ile);
}
int main() {
// your code goes here
scanf("%lld",&n);
for(int i = 0; i<n;i++)
{
scanf("%lld",tab+i);
}
/*
for(int i=0;i<n;i++)
{
for(int j=0;j<n;j++)
{
funcel[i][j]=policz(i,j);
}
}
printf(" ");
for(int i=0;i<n;i++)printf(" %d",i);
printf("\n");
for(int i=0;i<n;i++)
{
printf("%d ",i);
for(int j=0;j<n;j++)
{
funcel[i][j]=policz(i,j);
printf("%3lld ",funcel[i][j]);
}
printf("\n");
}
*/
alg();
return 0;
}
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 | #include <iostream> #include <algorithm> #include <stdio.h> #include <set> #include <vector> #include <map> using namespace std; #define LL long long LL tab[1000100]; LL funcel[1000][1000]; LL med2(int i, int j) { set<LL>s(tab+i,tab+j+1); auto it = s.begin(); int l=(j-i+1)/2; while(l--)it++; if((j-i+1)%2==1)return *it * 2; else { LL p=*it; it--; return (*it + p); } } LL policz(int i, int j) { if(i>j)return 0; return med2(i,j)+j-i+1; } int findmax(LL n) { int maxi = -1; LL max = 0; for (int i =0;i<n;i++) { if(tab[i]>max) {max=tab[i];maxi=i;} } return maxi; } set<pair<int,int>>odwiedzone; LL ile=0; LL cel=0; LL n; void rek(int i, int j) { if(odwiedzone.find(make_pair(i,j))!=odwiedzone.end()) return; odwiedzone.insert(make_pair(i,j)); LL p = policz(i,j); if (p!=cel)return; ile++; if(i>0)rek(i-1,j); if(j<n-1)rek(i,j+1); if(i!=j) { rek(i+1,j); rek(i,j-1); } } void alg() { cel = policz(0,n-1); int i = findmax(n); rek(i,i); rek(0,n-1); printf("%lld %lld\n",cel,ile); } int main() { // your code goes here scanf("%lld",&n); for(int i = 0; i<n;i++) { scanf("%lld",tab+i); } /* for(int i=0;i<n;i++) { for(int j=0;j<n;j++) { funcel[i][j]=policz(i,j); } } printf(" "); for(int i=0;i<n;i++)printf(" %d",i); printf("\n"); for(int i=0;i<n;i++) { printf("%d ",i); for(int j=0;j<n;j++) { funcel[i][j]=policz(i,j); printf("%3lld ",funcel[i][j]); } printf("\n"); } */ alg(); return 0; } |
English