Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <bits/stdc++.h>
- using namespace std;
- ifstream fin("oposumi.in");
- ofstream fout("oposumi.out");
- const int INF = 2e9;
- const int N = 1000;
- int a[1 + N][1 + N];
- bool FR[1 + N * N];
- int SearchBLevel(int x, int n)
- {
- int st, dr, ans, mid;
- st = 1;
- dr = n;
- ans = n;
- while(st <= dr)
- {
- mid = (st + dr) >> 1;
- if((n * (n + 1) - (n - mid + 1) * (n - mid + 2)) / 2 + 1 >= x)
- {
- ans = mid;
- dr = mid - 1;
- }
- else
- st = mid + 1;
- }
- return ans;
- }
- void Solution2()
- {
- int n, k, level;
- fin>>n>>k;
- level = SearchBLevel(k, n);
- a[level][level] = k;
- FR[k] = true;
- for(int i = n, j = n, cnt = n * (n + 1) / 2; i > level; cnt--)
- {
- a[i][j] = cnt;
- FR[cnt] = true;
- j--;
- if(j == level - 1)
- {
- i--;
- j = i;
- }
- }
- int cnt = 1;
- for(int i = 1; i <= n; i++)
- {
- for(int j = 1; j < min(level, i + 1); j++)
- {
- while(FR[cnt])
- ++cnt;
- a[i][j] = cnt;
- FR[cnt] = true;
- }
- }
- for(int i = 1; i <= n; i++)
- {
- for(int j = 1; j <= i; j++)
- fout<<a[i][j]<<" ";
- fout<<'\n';
- }
- }
- int main()
- {
- int t;
- fin>>t;
- if(t == 1)
- {
- int n;
- fin>>n;
- for(int x = 1; x <= n * (n + 1) / 2; x++)
- fout<<SearchBLevel(x, n)<<' ';
- }
- else
- Solution2();
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement