답안 #872705

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
872705 2023-11-13T15:20:48 Z vjudge1 Nivelle (COCI20_nivelle) C++17
24 / 110
1000 ms 3416 KB
#include<bits/stdc++.h>
using namespace std;
#pragma GCC optimize("O3")

#define tof_io  ios_base::sync_with_stdio(false);cin.tie(0) , cout.tie(0);
#define double  long double
#define int     long long
#define pb      push_back

#define all(x)  x.begin(),x.end()
#define endl    '\n'

const int mod = 998244353; //998244353 1e9+7 1e9+9
const int inf = 1e18;
const int N = 2e4 + 23;	
const int lg = 23;
int fac[N];
int inv[N];
int  dnt_pow	(int a, int b, int md = mod){int ans = 1; while(b){if(b&1){ans = (a*ans)%md;}a = (a*a)%md;b >>= 1;}return ans ;}
void dnt_bld	(){fac[0] = 1; inv[0] = dnt_pow(fac[0],mod-2) ;for(int i = 1 ; i < N ; i++) {fac[i] = (fac[i-1] * i) % mod;inv[i] = dnt_pow( fac[i] , mod-2);}}
int  dnt_ncr	(int r,int n){if(r>n) return 0; return fac[n] * inv[r] % mod * inv[n-r] % mod;}
bool cmp (pair<int,int> a, pair<int,int> b){ return a.second > b.second; }
char x[6] = {'a','b','c','d','e'};
vector<int> v ;
int vis[10];
double ans = 1e18;
int L,R;
int freq[N][6],n;
double mn = 1.0;
vector<int> cnt(26);
void check(string s , int i , int j)
{
	double len = j - i + 1;
	double cnt1 = 0;
	for(int i = 0; i < 26; i++)
	{
		if(cnt[i] > 0) cnt1++;
	}
	double res = cnt1 / len;
	if(res < mn)
	{
		L = i;
		R = j;
		mn = res;
	}

}
bool ok(int mid,int l)
{
 
    if(l + mid - 1 >= n)
        return 0;

	for(int i = 0; i < 5; i++)
	{
 
        int x;
        if(l == 0)
            x = freq[l+mid-1][i];
 
        else
            x = freq[l+mid-1][i] - freq[l-1][i];
 
        if(vis[i]==0 and x!=0)
            return 0;
 
    }
 
    return 1;
 
}
void bt(int index)
{
 
    if(index == 5)
	{
 
        for(int i = 0 ; i < n ;i++)
		{
 
            int l=0;
			int r=n;
            while(l < r)
			{
 
                int mid = ( l + r + 1 ) / 2;
                if(ok(mid,i) == 1)
				{
					l = mid;
				}
                else 
				{
					r=mid-1;
				}
 
            }
            double cnt1 = 0;
            for(int i = 0 ; i < 5 ; i++)
                if(vis[i])
                    cnt1++;
 
            double len=l;
			double res = cnt1 / len;
            if(cnt1/l < ans)
			{
				L = i;
				R = i + len - 1;
				ans = res;
			} 
        }
        return ;
 
    }

    vis[x[index]-'a'] = 1;
    bt(index + 1);
    vis[x[index]-'a'] = 0;
    bt(index + 1);
 
}
void solve1(int n, string s)
{
	for(int j = 0; j < 5; j++)
	{
		freq[0][j]=(j==(s[0]-'a'));
	}
		
	for(int i = 1; i < n; i++)
	{
		for(int j = 0; j < 5; j++)
		{
			freq[i][j] = freq[i-1][j] +( j == (s[i]-'a'));
		}
	}

	bt(0);

	cout << L + 1 <<' ' << R + 1 ;
}
void solve2(int n, string s)
{

		for(int i = 0; i < n; i++)
		{
			for(int j = 0; j < 26; j++) cnt[j] = 0;
			string k="";
			for(int j = i; j < n; j++)
			{
				k = k + s[j];
				cnt[s[j]-'a']++;
				check(k,i,j);
			}
		}
		cout << L+1 << ' ' << R+1;
}
int32_t main()
{
    cin >> n;
    string s;
    cin >> s;
	int wich = 0;
	for(int i = 0; i < n; i++)
	{
		if(s[i] == 'a' or s[i] == 'b' or s[i] == 'c' or s[i] == 'd' or s[i] == 'e') wich++;
	}
	if(wich == n)
	{
		solve1(n,s);
	}
	else
	{
		solve2(n,s);
	}
	
}

Compilation message

nivelle.cpp: In function 'bool ok(long long int, long long int)':
nivelle.cpp:51:5: warning: this 'if' clause does not guard... [-Wmisleading-indentation]
   51 |     if(l + mid - 1 >= n)
      |     ^~
nivelle.cpp:54:2: note: ...this statement, but the latter is misleadingly indented as if it were guarded by the 'if'
   54 |  for(int i = 0; i < 5; i++)
      |  ^~~
# 결과 실행 시간 메모리 Grader output
1 Correct 1 ms 348 KB Output is correct
2 Correct 1 ms 348 KB Output is correct
3 Correct 1 ms 348 KB Output is correct
4 Correct 1 ms 348 KB Output is correct
5 Correct 1 ms 348 KB Output is correct
6 Correct 1 ms 348 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 289 ms 512 KB Output is correct
2 Correct 301 ms 508 KB Output is correct
3 Correct 297 ms 504 KB Output is correct
4 Correct 293 ms 504 KB Output is correct
5 Correct 288 ms 512 KB Output is correct
6 Correct 297 ms 348 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Runtime error 4 ms 3416 KB Execution killed with signal 11
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Runtime error 4 ms 3416 KB Execution killed with signal 11
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Execution timed out 1049 ms 1280 KB Time limit exceeded
2 Halted 0 ms 0 KB -