/* ###########################
# Author : Pranay Garg #
# College : SGSITS #
###########################
*/
# include <bits/stdc++.h>
# include <ext/pb_ds/assoc_container.hpp>
# define ll long long int
# define ull unsigned long long int
# define double long double
# define sp(x,y) fixed << setprecision(y) << x
# define ironman ios_base::sync_with_stdio(false);cin.tie(NULL);
# define MOD 1000000007
# define MODT 998244353
# define endl '\n'
# define clr(x,a) memset(x,a,sizeof(x))
# define ar array
# define INF 1000000000000000000ll + 239
# define PI 3.14159265358979323846
# define fi first
# define se second
# define vi std::vector<ll>
# define vii std::vector<vector<ll>>
# define pb push_back
# define pi pair<ll,ll>
# define fo(i,n) for(ll i=0;i<n;i++)
# define all(a) a.begin(), a.end()
# define allr(a) a.rbegin(), a.rend()
# define alla(a,n) a,a+n
# define debug1(x) cout<<#x<<" = "<<x<<endl;
# define debug2(x,y) cout<<#x<<" = "<<x<<" "<<#y<<" = "<<y<<endl;
# define debug3(x,y,z) cout<<#x<<" = "<<x<<" "<<#y<<" = "<<y<<" "<<#z<<" = "<<z<<endl;
# define debug4(x,y,z,w) cout<<#x<<" = "<<x<<" "<<#y<<" = "<<y<<" "<<#z<<" = "<<z<<" "<<#w <<" = "<<w<<endl;
# define debug5(x,y,z,w,v) cout<<#x<<" = "<<x<<" "<<#y<<" = "<<y<<" "<<#z<<" = "<<z<<" "<<#w <<" = "<<w<<" "<<#v <<" = "<<v<<endl;
# define debug6(x,y,z,w,a,b) cout<<#x<<" = "<<x<<" "<<#y<<" = "<<y<<" "<<#z<<" = "<<z<<" "<<#w <<" = "<<w<<" "<<#a<<" = "<<a<<" "<<#b<<" = "<<b<<endl;
using namespace std;
using namespace __gnu_pbds;
template<typename A> istream& operator>>(istream& cin, vector<A> &arr) {
for(ll i=0;i<arr.size();i++)
cin >> arr[i];
return cin;
}
template<typename A> ostream& operator<<(ostream &cout, vector<A> const &v) {
cout << "["; for(int i = 0; i < v.size(); i++) {if (i) cout << ", "; cout << v[i];} return cout << "]";
}
# define max(...)({ \
ll nos[] = { __VA_ARGS__ }; \
ll n = sizeof(nos)/sizeof(ll); \
*std::max_element(&nos[0],&nos[n]); \
})
# define min(...)({ \
ll nos[] = { __VA_ARGS__ }; \
ll n = sizeof(nos)/sizeof(ll); \
*std::min_element(&nos[0],&nos[n]); \
})
typedef tree<int, null_type, less<int>, rb_tree_tag,
tree_order_statistics_node_update> indexed_set;
void fastio(string in,string out)
{
ironman
#ifndef ONLINE_JUDGE
freopen(in.c_str(), "r", stdin);
freopen(out.c_str(), "w", stdout);
#endif
}
vector<bool> prime;
void SieveOfEratosthenes(ll n)//O(nloglogn)
{
prime.assign(n+1,1);
for (ll p = 2; p * p <= n; p++)
{
if (prime[p] == true)
{
for (ll i = p * p; i <= n; i += p)
prime[i] = false;
}
}
}
bool isPrime(ll n)//O(sqrt(n))
{
if (n < 2)
return false;
for (ll i = 2; i * i <= n; i++)
if (n % i == 0)
return false;
return true;
}
std::vector<ll> generatePrimeFactors(ll n)
{
std::vector<ll> prime;
for (ll i = 2; i * i <= n; i++)
{
if (n % i == 0)
{
prime.pb(i);
while (n % i == 0)
n = n / i;
}
}
if (n != 1)
prime.pb(n);
return prime;
}
map<ll,ll> generatePrimeFactorization(ll n)
{
map<ll,ll> cnt;
for(ll i=2;i*i<=n;i++)
{
while(n && n%i==0)
{
n/=i;
cnt[i]++;
}
}
if(n!=1)
cnt[n]++;
return cnt;
}
std::vector<ll> generateFactors(ll n)
{
std::vector<ll> fact;
for (ll i = 2; i * i <= n; i++)
{
if (n % i == 0)
{
fact.pb(i);
if (n / i != i)
fact.pb(n / i);
//24 - 1,2,3,4,6,8,12
}
}
// fact.pb(1);
if (n != 1)
fact.pb(n);
sort(fact.begin(), fact.end());
return fact;
}
ll extendedGCD(ll a, ll b, ll &x, ll &y)
{
//produces correct results for negative integers as well
if (a == 0)
{
x = 0;
y = 1;
return b;
}
ll x1, y1, d;
d = extendedGCD(b % a, a, x1, y1);
x = y1 - (b / a) * x1;
y = x1;
return d;
}
ll gcd(ll a, ll b) //O(log min(a,b))
{
/*
recursive implementation below
if(!b) return a;
return gcd(b,a%b);
*/
//non-recursive implementation below
while (b)
{
a %= b;
swap(a, b);
}
return a;
}
ll multiply(ll a, ll b, ll m);
ll singlemod(ll a, ll m);
ll modpow(ll x, ll n, ll m) //O(logn)// used for calculating (x^n)%m
{
if (n == 0)
return 1;
ll res = 1;
while (n)
{
if (n % 2)
res = multiply(res, x, m);
x = multiply(x, x, m);
n = n >> 1;
}
return singlemod(res, m);
}
ll fastpow(ll x, ll n)
{
if (n == 0)
return 1;
ll res = 1;
while (n)
{
if (n % 2)
res = res * x;
x = x * x;
n = n >> 1;
}
return res;
}
ll modinverse(ll x, ll m) //O(logn)
{
return modpow(x, m - 2, m);
}
ll add(ll a, ll b, ll m)
{
return (((a % m) + (b % m)) % m);
}
ll substract(ll a, ll b, ll m)
{
// if (a < b)
// swap(a, b);
return (((a % m) - (b % m) + m) % m);
}
ll multiply(ll a, ll b, ll m)
{
// if (a > b) swap(a, b);
// ll ans = 0;
// while (a)
// {
// if (a % 2)
// ans = add(ans, b, m);
// b = add(b, b, m);
// a = a >> 1;
// }
// return (ans % m);
return (((a % m) * (b % m)) % m);
}
ll divide(ll a, ll b, ll m)
{
ll temp = modinverse(b, m);
return multiply(a, temp, m);
}
ll singlemod(ll a, ll m)
{
return (((a % m) + m) % m);
}
ll eulerstotientfunction(ll n)//O(sqrt(n))
{
ll ans = n;
for (ll i = 2; i * i <= n; i++)
{
if (n % i == 0)
{
while (n % i == 0)
n = n / i;
ans -= ans / i;
}
}
if (n > 1)
ans -= ans / n;
return ans;
}
ll ncr(ll n, ll k, ll m)
{
if (k > n) return 0;
if (m == 0)
{
ll res = 1;
k = min(k, n - k);
for (ll i = 1; i <= k; i++)
{
res *= (n - i + 1);
res /= i;
}
return res;
}
else
{
ll res = 1;
k = min(k, n - k);
for (ll i = 1; i <= k; i++)
{
res = multiply(res, n - i + 1, m);
res = divide(res, i, m);
}
return singlemod(res, m);
}
}
ll ceil(ll a,ll b)
{
return (a+b-1)/b;
}
template<class T>
void printVector(const std::vector<T> arr)
{
for (auto i : arr)
cout << i << " ";
cout << endl;
}
template<class T>
void printArray(T arr[], ll n)
{
for (ll i = 0; i < n; i++)
cout << arr[i] << " ";
cout << endl;
}
template<class T>
void printUGraph(vector<T> arr[], ll n)
{
for(ll i=0;i<n;i++)
{
cout << i << " : ";
for(auto j : arr[i])
cout << j << " ";
cout << endl;
}
}
template<class T>
void printWGraph(vector<T> arr[], ll n)
{
for(ll i=0;i<n;i++)
{
cout << i << " : ";
for(auto j : arr[i])
cout << j.fi << "," << j.se << " ";
cout << endl;
}
}
//const int p1 = 13331,m1 = 1e9+9,p2 = 7919, m2 = 1e9+9;
//const int p1 = 97266353,m1 = 972663749,p2 = 97336357, m2 = 1000000007;
//const int p1 = 31 ,m1 = 1e9+7;
//grid cells
//D U R L
//ll dx[] = {1, -1, 0, 0};
//ll dy[] = {0, 0, 1, -1};
//ll dx[] = {-1,-1,-1,0,1,1,1,0};
//ll dy[] = {-1,0,1,1,1,0,-1,-1};
//ll dx[] = {-2,-2,-1,1,2,-2,1,-1};
//ll dy[] = {-1,1,2,2,1,-1,-2,-2};
//bool isSafe(ll x, ll y, ll n, ll m)
//{
// return (x >= 0 && x < n && y >= 0 && y < m);
//}
//---------------TEMPLATE ABOVE--------------//
void solve()
{
ll n;
cin >> n;
vector<ar<ll,2>> arr;
for(ll i=0;i<n;i++)
{
ll x;
cin >> x;
arr.pb({x,i});
}
sort(all(arr));
ll dp[n][2];
for(ll i=0;i<n;i++)
{
if(arr[i][0]>i+1)
dp[i][0] = 0,dp[i][1] = -INF;
else
{
ll j = i-arr[i][0];
dp[i][0] = 1;
dp[i][1] = i+1;
for(ll k=j;k>=0;k--)
{
if(1+dp[k][0]>dp[i][0])
{
dp[i][0] = 1+dp[k][0];
dp[i][1] = max(i-k,dp[k][1]);
}
else if(1+dp[k][0]==dp[i][0])
{
dp[i][1] = min(dp[i][1],max(i-k,dp[k][1]));
}
}
}
}
ll ans = dp[n-1][0];
cout << ans << endl;
ll i = n-1;
vector<vector<ll>> a;
while(1)
{
vi curr;
if(ans==1)
{
curr.pb(i+1);
for(ll k=i;k>=0;k--)
curr.pb(arr[k][1]+1);
a.pb(curr);
break;
}
ll j = i-arr[i][0],ind;
for(ll k=j;k>=0;k--)
{
if(dp[k][0]==ans-1 && dp[k][1]<=dp[i][1])
{
ind = k;
break;
}
}
curr.pb(i-ind);
for(ll k=i;k>ind;k--)
curr.pb(arr[k][1]+1);
i = ind;
a.pb(curr);
ans--;
}
for(auto i : a)
{
for(auto j : i)
cout << j << " ";
cout << endl;
}
}
int main()
{
// auto begin = std::chrono::high_resolution_clock::now();
//fastio("input.txt","output.txt");
ll t = 1;
//cin >> t;
ll cases = t;
while (t--)
{
//cout << "Case #" << cases-t << ": ";
solve();
}
// auto end = std::chrono::high_resolution_clock::now();
// cout << setprecision(4) << fixed;
// cout << "Execution time: " << std::chrono::duration_cast<std::chrono::duration<double>>(end - begin).count() << " seconds" << endl;
}
Compilation message
tea.cpp: In function 'int main()':
tea.cpp:435:8: warning: unused variable 'cases' [-Wunused-variable]
435 | ll cases = t;
| ^~~~~
tea.cpp: In function 'void fastio(std::string, std::string)':
tea.cpp:69:12: warning: ignoring return value of 'FILE* freopen(const char*, const char*, FILE*)', declared with attribute warn_unused_result [-Wunused-result]
69 | freopen(in.c_str(), "r", stdin);
| ~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~
tea.cpp:70:12: warning: ignoring return value of 'FILE* freopen(const char*, const char*, FILE*)', declared with attribute warn_unused_result [-Wunused-result]
70 | freopen(out.c_str(), "w", stdout);
| ~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~
tea.cpp: In function 'void solve()':
tea.cpp:415:21: warning: 'ind' may be used uninitialized in this function [-Wmaybe-uninitialized]
415 | for(ll k=i;k>ind;k--)
| ~^~~~
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
1 ms |
208 KB |
Output is correct |
2 |
Correct |
1 ms |
204 KB |
Output is correct |
3 |
Incorrect |
1 ms |
204 KB |
Output isn't correct |
4 |
Halted |
0 ms |
0 KB |
- |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Incorrect |
1 ms |
204 KB |
Output isn't correct |
2 |
Halted |
0 ms |
0 KB |
- |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
1 ms |
204 KB |
Output is correct |
2 |
Correct |
1 ms |
204 KB |
Output is correct |
3 |
Correct |
1 ms |
204 KB |
Output is correct |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
16 ms |
584 KB |
Output is correct |
2 |
Incorrect |
18 ms |
604 KB |
Output isn't correct |
3 |
Halted |
0 ms |
0 KB |
- |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
16 ms |
588 KB |
Output is correct |
2 |
Incorrect |
19 ms |
584 KB |
Output isn't correct |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Execution timed out |
2576 ms |
2712 KB |
Time limit exceeded |
2 |
Halted |
0 ms |
0 KB |
- |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Execution timed out |
2569 ms |
2788 KB |
Time limit exceeded |
2 |
Halted |
0 ms |
0 KB |
- |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Execution timed out |
2598 ms |
16800 KB |
Time limit exceeded |
2 |
Halted |
0 ms |
0 KB |
- |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Execution timed out |
2591 ms |
17716 KB |
Time limit exceeded |
2 |
Halted |
0 ms |
0 KB |
- |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Execution timed out |
2582 ms |
22960 KB |
Time limit exceeded |
2 |
Halted |
0 ms |
0 KB |
- |