답안 #134475

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
134475 2019-07-22T18:31:32 Z Benq 우주 해적 (JOI14_space_pirate) C++14
80 / 100
2000 ms 23412 KB
#pragma GCC optimize ("O3")
#pragma GCC target ("sse4")

#include <bits/stdc++.h>
#include <ext/pb_ds/tree_policy.hpp>
#include <ext/pb_ds/assoc_container.hpp>
#include <ext/rope>

using namespace std;
using namespace __gnu_pbds;
using namespace __gnu_cxx;
 
typedef long long ll;
typedef long double ld;
typedef complex<ld> cd;

typedef pair<int, int> pi;
typedef pair<ll,ll> pl;
typedef pair<ld,ld> pd;

typedef vector<int> vi;
typedef vector<ld> vd;
typedef vector<ll> vl;
typedef vector<pi> vpi;
typedef vector<pl> vpl;
typedef vector<cd> vcd;

template <class T> using Tree = tree<T, null_type, less<T>, rb_tree_tag,tree_order_statistics_node_update>;

#define FOR(i, a, b) for (int i = (a); i < (b); i++)
#define F0R(i, a) for (int i = 0; i < (a); i++)
#define FORd(i,a,b) for (int i = (b)-1; i >= (a); i--)
#define F0Rd(i,a) for (int i = (a)-1; i >= 0; i--)
#define trav(a, x) for (auto& a : x)

#define mp make_pair
#define pb push_back
#define f first
#define s second
#define lb lower_bound
#define ub upper_bound

#define sz(x) (int)x.size()
#define all(x) begin(x), end(x)
#define rsz resize

const int MOD = 1000000007; // 998244353
const ll INF = 1e18;
const int MX = 100005;
const ld PI = 4*atan((ld)1);

template<class T> void ckmin(T &a, T b) { a = min(a, b); }
template<class T> void ckmax(T &a, T b) { a = max(a, b); }

namespace input {
    template<class T> void re(complex<T>& x);
    template<class T1, class T2> void re(pair<T1,T2>& p);
    template<class T> void re(vector<T>& a);
    template<class T, size_t SZ> void re(array<T,SZ>& a);

    template<class T> void re(T& x) { cin >> x; }
    void re(double& x) { string t; re(t); x = stod(t); }
    void re(ld& x) { string t; re(t); x = stold(t); }
    template<class Arg, class... Args> void re(Arg& first, Args&... rest) { 
        re(first); re(rest...); 
    }

    template<class T> void re(complex<T>& x) { T a,b; re(a,b); x = cd(a,b); }
    template<class T1, class T2> void re(pair<T1,T2>& p) { re(p.f,p.s); }
    template<class T> void re(vector<T>& a) { F0R(i,sz(a)) re(a[i]); }
    template<class T, size_t SZ> void re(array<T,SZ>& a) { F0R(i,SZ) re(a[i]); }
}

using namespace input;

namespace output {
    template<class T1, class T2> void pr(const pair<T1,T2>& x);
    template<class T, size_t SZ> void pr(const array<T,SZ>& x);
    template<class T> void pr(const vector<T>& x);
    template<class T> void pr(const set<T>& x);
    template<class T1, class T2> void pr(const map<T1,T2>& x);

    template<class T> void pr(const T& x) { cout << x; }
    template<class Arg, class... Args> void pr(const Arg& first, const Args&... rest) { 
        pr(first); pr(rest...); 
    }

    template<class T1, class T2> void pr(const pair<T1,T2>& x) { 
        pr("{",x.f,", ",x.s,"}"); 
    }
    template<class T> void prContain(const T& x) {
        pr("{");
        bool fst = 1; for (const auto& a: x) pr(!fst?", ":"",a), fst = 0; // const needed for vector<bool>
        pr("}");
    }
    template<class T, size_t SZ> void pr(const array<T,SZ>& x) { prContain(x); }
    template<class T> void pr(const vector<T>& x) { prContain(x); }
    template<class T> void pr(const set<T>& x) { prContain(x); }
    template<class T1, class T2> void pr(const map<T1,T2>& x) { prContain(x); }
    
    void ps() { pr("\n"); }
    template<class Arg> void ps(const Arg& first) { 
        pr(first); ps(); // no space at end of line
    }
    template<class Arg, class... Args> void ps(const Arg& first, const Args&... rest) { 
        pr(first," "); ps(rest...); // print w/ spaces
    }
}

using namespace output;

namespace io {
    void setIn(string s) { freopen(s.c_str(),"r",stdin); }
    void setOut(string s) { freopen(s.c_str(),"w",stdout); }
    void setIO(string s = "") {
        ios_base::sync_with_stdio(0); cin.tie(0); // fast I/O
        if (sz(s)) { setIn(s+".in"), setOut(s+".out"); } // for USACO
    }
}

using namespace io;

template<class T> T invGeneral(T a, T b) {
    a %= b; if (a == 0) return b == 1 ? 0 : -1;
    T x = invGeneral(b,a); 
    return x == -1 ? -1 : ((1-(ll)b*x)/a+b)%b;
}

template<class T> struct modular {
    T val; 
    explicit operator T() const { return val; }
    modular() { val = 0; }
    modular(const ll& v) { 
        val = (-MOD <= v && v <= MOD) ? v : v % MOD;
        if (val < 0) val += MOD;
    }
    
    friend ostream& operator<<(ostream& os, const modular& a) { return os << a.val; }
    friend bool operator==(const modular& a, const modular& b) { return a.val == b.val; }
    friend bool operator!=(const modular& a, const modular& b) { return !(a == b); }
    friend bool operator<(const modular& a, const modular& b) { return a.val < b.val; }

    modular operator-() const { return modular(-val); }
    modular& operator+=(const modular& m) { if ((val += m.val) >= MOD) val -= MOD; return *this; }
    modular& operator-=(const modular& m) { if ((val -= m.val) < 0) val += MOD; return *this; }
    modular& operator*=(const modular& m) { val = (ll)val*m.val%MOD; return *this; }
    friend modular pow(modular a, ll p) {
        modular ans = 1; for (; p; p /= 2, a *= a) if (p&1) ans *= a;
        return ans;
    }
    friend modular inv(const modular& a) { 
        auto i = invGeneral(a.val,MOD); assert(i != -1);
        return i;
    } // equivalent to return exp(b,MOD-2) if MOD is prime
    modular& operator/=(const modular& m) { return (*this) *= inv(m); }
    
    friend modular operator+(modular a, const modular& b) { return a += b; }
    friend modular operator-(modular a, const modular& b) { return a -= b; }
    friend modular operator*(modular a, const modular& b) { return a *= b; }
    
    friend modular operator/(modular a, const modular& b) { return a /= b; }
};

typedef modular<int> mi;
typedef pair<mi,mi> pmi;
typedef vector<mi> vmi;
typedef vector<pmi> vpmi;

mt19937 rng(chrono::steady_clock::now().time_since_epoch().count());

int N,A[MX]; // ind[MX],ori;
ll K, ans[MX];

vector<vi> cyc;
array<int,3> CYC[MX];
int vis[MX];
vi path;

int par(int a, ll b) {
	assert(b >= CYC[a][2]);
	b -= CYC[a][2];
	int ind = (CYC[a][1]+b)%sz(cyc[CYC[a][0]]);
	return cyc[CYC[a][0]][ind];
}

void dfs(int a, int b) {
	if (vis[a]) {
		if (vis[a] != b) return;
		array<int,3> lst = {sz(cyc),0,0}; cyc.pb({});
		while (CYC[a][0] == -1) {
			CYC[a] = lst; cyc.back().pb(a);
			lst[1] ++; a = A[a];
		}
		return;
	}
	vis[a] = b; dfs(A[a],b);
	if (CYC[a][0] == -1) CYC[a] = {CYC[A[a]][0],CYC[A[a]][1],CYC[A[a]][2]+1};
}

vi adj[MX];
int dist[MX];
int special;

void init() {
    setIO(); re(N,K); 
    FOR(i,1,N+1) {
    	re(A[i]);
    	adj[A[i]].pb(i);
    	CYC[i] = {-1,-1,-1}; // cycle, position, dist
    }
    FOR(i,1,N+1) if (!vis[i]) dfs(i,i);
    FOR(i,1,N+1) dist[i] = -1;
    
    int cur = 1, lst = 0;
    while (dist[cur] == -1) {
    	dist[cur] = lst++;
    	path.pb(cur);
    	cur = A[cur];
    }
    ans[par(1,K)] += (ll)N*(N-sz(path));
}

vi v;
int lst[MX];

void rdfs(int x) {
	v.pb(x); lst[x] = special;
	int rem = (K-dist[special])%sz(v);
	if (rem == 0) ans[v[rem]] ++;
	else ans[v[sz(v)-rem]] ++;
	trav(t,adj[x]) if (t != special) rdfs(t);
	v.pop_back();
}

void process() {
	// ps("HUH",special,dist[special]); exit(0);
	rdfs(special);
	FOR(i,1,N+1) if (lst[i] != special) ans[par(i,K-dist[special]-1)] ++;
}

int main() {
	init();
	set<int> S; FOR(i,1,N+1) S.insert(A[i]);
	if (sz(S) == N) {
		// ps("HA");
		ans[par(1,K)] += sz(path);
		FOR(i,1,N+1) if (dist[i] == -1) ans[i] += sz(path);
		FOR(len,1,sz(path)) {
			int k = K%len;
			ans[path[k]] += len-(k+1); // k+1 to len-1
			ans[path[sz(path)-(len-k)]] += k;
			// continue;
			for (int r = k; ; r += len) {
				int L = max(r-len+1,0); if (L > sz(path)-len) break;
				int R = min(r,sz(path)-len);
				if (r >= sz(path)) {
					ps("??",L,R,r);
					exit(0);
				}
				ans[path[r]] += R-L+1;
			}
			// i from 0 to n-len
			// path[k] up to k 
			// 0 to k: path[k]
			// k+1 to k+len: path[k+len]
			
		}
	} else {
	    trav(t,path) {
	    	special = t;
	    	process();
	    }
	}
    FOR(i,1,N+1) ps(ans[i]);
    exit(0);
}

/* stuff you should look for
    * int overflow, array bounds
    * special cases (n=1?), set tle
    * do smth instead of nothing and stay organized
*/

Compilation message

space_pirate.cpp: In function 'void io::setIn(std::__cxx11::string)':
space_pirate.cpp:113:35: warning: ignoring return value of 'FILE* freopen(const char*, const char*, FILE*)', declared with attribute warn_unused_result [-Wunused-result]
     void setIn(string s) { freopen(s.c_str(),"r",stdin); }
                            ~~~~~~~^~~~~~~~~~~~~~~~~~~~~
space_pirate.cpp: In function 'void io::setOut(std::__cxx11::string)':
space_pirate.cpp:114:36: warning: ignoring return value of 'FILE* freopen(const char*, const char*, FILE*)', declared with attribute warn_unused_result [-Wunused-result]
     void setOut(string s) { freopen(s.c_str(),"w",stdout); }
                             ~~~~~~~^~~~~~~~~~~~~~~~~~~~~~
# 결과 실행 시간 메모리 Grader output
1 Correct 4 ms 2788 KB Output is correct
2 Correct 4 ms 2680 KB Output is correct
3 Correct 4 ms 2680 KB Output is correct
4 Correct 5 ms 2680 KB Output is correct
5 Correct 5 ms 2780 KB Output is correct
6 Correct 4 ms 2680 KB Output is correct
7 Correct 5 ms 2704 KB Output is correct
8 Correct 4 ms 2680 KB Output is correct
9 Correct 5 ms 2680 KB Output is correct
10 Correct 4 ms 2684 KB Output is correct
11 Correct 4 ms 2808 KB Output is correct
12 Correct 5 ms 2680 KB Output is correct
13 Correct 4 ms 2680 KB Output is correct
14 Correct 4 ms 2680 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 4 ms 2788 KB Output is correct
2 Correct 4 ms 2680 KB Output is correct
3 Correct 4 ms 2680 KB Output is correct
4 Correct 5 ms 2680 KB Output is correct
5 Correct 5 ms 2780 KB Output is correct
6 Correct 4 ms 2680 KB Output is correct
7 Correct 5 ms 2704 KB Output is correct
8 Correct 4 ms 2680 KB Output is correct
9 Correct 5 ms 2680 KB Output is correct
10 Correct 4 ms 2684 KB Output is correct
11 Correct 4 ms 2808 KB Output is correct
12 Correct 5 ms 2680 KB Output is correct
13 Correct 4 ms 2680 KB Output is correct
14 Correct 4 ms 2680 KB Output is correct
15 Correct 15 ms 3040 KB Output is correct
16 Correct 6 ms 2936 KB Output is correct
17 Correct 18 ms 2936 KB Output is correct
18 Correct 424 ms 3396 KB Output is correct
19 Correct 185 ms 3192 KB Output is correct
20 Correct 214 ms 3348 KB Output is correct
21 Correct 382 ms 3384 KB Output is correct
22 Correct 168 ms 3360 KB Output is correct
23 Correct 355 ms 3412 KB Output is correct
24 Correct 142 ms 3244 KB Output is correct
25 Correct 6 ms 2936 KB Output is correct
26 Correct 422 ms 3384 KB Output is correct
27 Correct 147 ms 3140 KB Output is correct
28 Correct 155 ms 3124 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 90 ms 15332 KB Output is correct
2 Correct 114 ms 23412 KB Output is correct
3 Correct 97 ms 19460 KB Output is correct
4 Correct 103 ms 15432 KB Output is correct
5 Correct 109 ms 23396 KB Output is correct
6 Correct 98 ms 19620 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 4 ms 2788 KB Output is correct
2 Correct 4 ms 2680 KB Output is correct
3 Correct 4 ms 2680 KB Output is correct
4 Correct 5 ms 2680 KB Output is correct
5 Correct 5 ms 2780 KB Output is correct
6 Correct 4 ms 2680 KB Output is correct
7 Correct 5 ms 2704 KB Output is correct
8 Correct 4 ms 2680 KB Output is correct
9 Correct 5 ms 2680 KB Output is correct
10 Correct 4 ms 2684 KB Output is correct
11 Correct 4 ms 2808 KB Output is correct
12 Correct 5 ms 2680 KB Output is correct
13 Correct 4 ms 2680 KB Output is correct
14 Correct 4 ms 2680 KB Output is correct
15 Correct 15 ms 3040 KB Output is correct
16 Correct 6 ms 2936 KB Output is correct
17 Correct 18 ms 2936 KB Output is correct
18 Correct 424 ms 3396 KB Output is correct
19 Correct 185 ms 3192 KB Output is correct
20 Correct 214 ms 3348 KB Output is correct
21 Correct 382 ms 3384 KB Output is correct
22 Correct 168 ms 3360 KB Output is correct
23 Correct 355 ms 3412 KB Output is correct
24 Correct 142 ms 3244 KB Output is correct
25 Correct 6 ms 2936 KB Output is correct
26 Correct 422 ms 3384 KB Output is correct
27 Correct 147 ms 3140 KB Output is correct
28 Correct 155 ms 3124 KB Output is correct
29 Correct 90 ms 15332 KB Output is correct
30 Correct 114 ms 23412 KB Output is correct
31 Correct 97 ms 19460 KB Output is correct
32 Correct 103 ms 15432 KB Output is correct
33 Correct 109 ms 23396 KB Output is correct
34 Correct 98 ms 19620 KB Output is correct
35 Correct 1864 ms 12068 KB Output is correct
36 Correct 881 ms 11844 KB Output is correct
37 Correct 115 ms 8596 KB Output is correct
38 Execution timed out 2041 ms 21984 KB Time limit exceeded
39 Halted 0 ms 0 KB -