Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #pragma GCC optimize("Ofast")
- #pragma GCC target("sse4,avx,avx2,fma")
- #include <bits/stdc++.h>
- using namespace std;
- #define f first
- #define s second
- #define pb push_back
- #define mp make_pair
- #define ts to_string
- #define ub upper_bound
- #define lb lower_bound
- #define ar array
- #define all(x) x.begin(), x.end()
- #define siz(x) (int)x.size()
- #define FOR(x, y, z) for(int x = (y); x < (z); x++)
- #define ROF(x, y, z) for(int x = (y-1); x >= (z); x--)
- #define F0R(x, z) FOR(x, 0, z)
- #define R0F(x, z) ROF(x, z, 0)
- #define trav(x, y) for(auto&x:y)
- using ll = int64_t;
- using vi = vector<int>;
- using vl = vector<ll>;
- using pii = pair<int, int>;
- using pll = pair<ll, ll>;
- using str = string;
- using vpii = vector<pii>;
- using vpll = vector<pll>;
- template<class T> inline bool ckmin(T&a, T b) {return b < a ? a = b, 1 : 0;}
- template<class T> inline bool ckmax(T&a, T b) {return b > a ? a = b, 1 : 0;}
- mt19937 rng(chrono::steady_clock::now().time_since_epoch().count());
- void usaco(string x=""){
- ios_base::sync_with_stdio(0); cin.tie(0); x=x;
- #ifndef D
- if(siz(x)){
- freopen((x+".in").c_str(), "r", stdin);
- freopen((x+".out").c_str(), "w", stdout);
- }
- #endif
- }
- str ts(char c) { return str(1,c); }
- str ts(bool b) { return b ? "true" : "false"; }
- str ts(const char* s) { return (str)s; }
- str ts(str s) { return s; }
- template<class A> str ts(complex<A> c) {
- stringstream ss; ss << c; return ss.str(); }
- str ts(vector<bool> v) {
- str res = "{"; for(int i = 0;i < (int)v.size(); i++) res += char('0'+v[i]);
- res += "}"; return res; }
- template<size_t SZ> str ts(bitset<SZ> b) {
- str res = ""; for(int i = 0; i < b.size(); i++) res += char('0'+b[i]);
- return res; }
- template<class A, class B> str ts(pair<A,B> p);
- template<class T> str ts(T v) {
- bool fst = 1; str res = "{";
- for (const auto& x: v) {
- if (!fst) res += ", ";
- fst = 0; res += ts(x);
- }
- res += "}"; return res;
- }
- template<class A, class B> str ts(pair<A,B> p) {
- return "("+ts(p.f)+", "+ts(p.s)+")"; }
- void DBG() { cerr << "]" << endl; }
- template<class H, class... T> void DBG(H h, T... t) {
- cerr << ts(h); if (sizeof...(t)) cerr << ", ";
- DBG(t...); }
- #ifdef D
- #define dbg(...) cerr << "LINE(" << __LINE__ << ") -> [" << #__VA_ARGS__ << "]: [", DBG(__VA_ARGS__)
- #else
- #define dbg(...) 0
- #endif
- const int mxN = 1e5 + 10;
- int ans[mxN], bit[mxN], n, a[mxN], cnt[mxN]; vi q[mxN];
- int qry(int r){
- int res = 0;
- for(; r; r-=r&-r){
- res += bit[r];
- }
- return res;
- }
- void update(int x, int v){
- for(; v < mxN; v += v & -v){
- bit[v] += x;
- }
- }
- signed main(){
- ifstream cin("haircut.in"); ofstream cout("haircut.out");
- cin >> n;
- FOR(i, 1, n+1) {cin >> a[i]; q[a[i]].pb(i);}
- FOR(i, 1, n+1){
- if(a[i])
- cnt[i] = qry(n)-qry(a[i]);
- else
- cnt[i] = qry(n);
- if(a[i])
- update(1, a[i]);
- }
- int res = 0;
- FOR(i, 1, n+1) res += cnt[i];
- ROF(i, n, 1){
- trav(v, q[i]){
- res -= cnt[v];
- }
- ans[i] = res;
- }
- F0R(i, n) cout << ans[i] << endl;
- }
- /*
- * Stuff I should try:
- * Is it Monotonic? -> Binary Search
- * Is N small? -> Bitsets or other exponential
- * Edge Cases? Look Carefully
- * Can't figure anything out? Brute Force and see patterns
- * Try to prove greedies
- * Prefix Sums, Amortization, DP, Data Structures
- */
Advertisement
Add Comment
Please, Sign In to add comment