답안 #341049

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
341049 2020-12-29T00:08:24 Z 12tqian 조교 (CEOI16_popeala) C++17
100 / 100
1317 ms 27116 KB
#pragma comment(linker, "/stack:200000000")
//#pragma GCC optimize("Ofast")
//#pragma GCC target("sse,sse2,sse3,ssse3,sse4,popcnt,abm,mmx,avx,tune=native")
//#pragma GCC target ("avx2")
//#pragma GCC optimization ("unroll-loops")
#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>

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

const long double PI = 4*atan(1);

typedef long long ll;
typedef long double ld;

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

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

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

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

#define sz(x) (int)(x).size()
#define all(x) x.begin(), x.end()
#define rall(x) rbegin(x), rend(x)
#define resz resize
#define ins insert

template<typename A, typename B> ostream& operator<<(ostream &cout, pair<A, B> const &p) { return cout << "(" << p.f << ", " << p.s << ")"; }
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 << "]";
}

template<class T> bool ckmin(T& a, const T& b) {
	return a > b ? a = b, 1 : 0; }
template<class T> bool ckmax(T& a, const T& b) {
	return a < b ? a = b, 1 : 0; }

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 T, class... Ts> void re(T& t, Ts&... ts) {
		re(t); re(ts...);
	}

	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 {
	void pr(int x) { cout << x; }
	void pr(long x) { cout << x; }
	void pr(ll x) { cout << x; }
	void pr(unsigned x) { cout << x; }
	void pr(unsigned long x) { cout << x; }
	void pr(unsigned long long x) { cout << x; }
	void pr(float x) { cout << x; }
	void pr(double x) { cout << x; }
	void pr(ld x) { cout << x; }
	void pr(char x) { cout << x; }
	void pr(const char* x) { cout << x; }
	void pr(const string& x) { cout << x; }
	void pr(bool x) { pr(x ? "true" : "false"); }
	template<class T> void pr(const complex<T>& x) { cout << x; }

	template<class T1, class T2> void pr(const pair<T1,T2>& x);
	template<class T> void pr(const T& x);

	template<class T, class... Ts> void pr(const T& t, const Ts&... ts) {
		pr(t); pr(ts...);
	}
	template<class T1, class T2> void pr(const pair<T1,T2>& x) {
		pr("{",x.f,", ",x.s,"}");
	}
	template<class T> void pr(const T& x) {
		pr("{"); // const iterator needed for vector<bool>
		bool fst = 1; for (const auto& a: x) pr(!fst?", ":"",a), fst = 0;
		pr("}");
	}

	void ps() { pr("\n"); } // print w/ spaces
	template<class T, class... Ts> void ps(const T& t, const Ts&... ts) {
		pr(t); if (sizeof...(ts)) pr(" "); ps(ts...);
	}

	void pc() { pr("]\n"); } // debug w/ commas
	template<class T, class... Ts> void pc(const T& t, const Ts&... ts) {
		pr(t); if (sizeof...(ts)) pr(", "); pc(ts...);
	}
	#define dbg(x...) pr("[",#x,"] = ["), pc(x);
}

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 = "") {
		cin.sync_with_stdio(0); cin.tie(0); // fast I/O
		// cin.exceptions(cin.failbit); // ex. throws exception when you try to read letter into int
		if (sz(s)) { setIn(s+".in"), setOut(s+".out"); } // for USACO
	}
}

using namespace io;
mt19937 rng((uint32_t)chrono::steady_clock::now().time_since_epoch().count());

const ll MOD = 1e9 + 7;

typedef decay<decltype(MOD)>::type T;
struct mi {
	T val;
	explicit operator T() const { return val; }
	mi() { val = 0; }
	mi(const ll& v) {
		val = (-MOD <= v && v <= MOD) ? v : v % MOD;
		if (val < 0) val += MOD;
	}
	// friend ostream& operator<<(ostream& os, const mi& a) {
		// return os << a.val; }
	friend void pr(const mi& a) { pr(a.val); }
	friend void re(mi& a) { ll x; re(x); a = mi(x); }

	friend bool operator==(const mi& a, const mi& b) {
		return a.val == b.val; }
	friend bool operator!=(const mi& a, const mi& b) {
		return !(a == b); }
	friend bool operator<(const mi& a, const mi& b) {
		return a.val < b.val; }

	mi operator-() const { return mi(-val); }
	mi& operator+=(const mi& m) {
		if ((val += m.val) >= MOD) val -= MOD;
		return *this; }
	mi& operator-=(const mi& m) {
		if ((val -= m.val) < 0) val += MOD;
		return *this; }
	mi& operator*=(const mi& m) {
		val = (ll)val*m.val%MOD; return *this; }
	friend mi pow(mi a, ll p) {
		mi ans = 1; assert(p >= 0);
		for (; p; p /= 2, a *= a) if (p&1) ans *= a;
		return ans;
	}
	friend mi inv(const mi& a) {
		assert(a != 0); return pow(a,MOD-2); }
	mi& operator/=(const mi& m) { return (*this) *= inv(m); }

	friend mi operator+(mi a, const mi& b) { return a += b; }
	friend mi operator-(mi a, const mi& b) { return a -= b; }
	friend mi operator*(mi a, const mi& b) { return a *= b; }
	friend mi operator/(mi a, const mi& b) { return a /= b; }
};

typedef pair<mi,mi> pmi;
typedef vector<mi> vmi;
typedef vector<pmi> vpmi;
const int MAXT = 2e4 + 5;
const int MAXN = 55;
const int INF = 1e9;
int p[MAXT];
bool res[MAXN][MAXT];
int cnt[MAXN][MAXT];
int dp[MAXN][MAXT];
int pre[MAXT];
inline int sum(int i, int j){return pre[j] - (i == 0? 0: pre[i-1]);}
inline int get(int k, int i, int j){return cnt[k][j] - (i == 0? 0: cnt[k][i-1]);}
int levels[MAXN];
vi down[MAXT];
vi bad[MAXT];
vi good[MAXT];
int curLevel[MAXT];
int nxt[MAXN][MAXT];
int main(){
    int n, t, s; re(n, t, s);

    f0r(i, t) re(p[i]);
    f0r(i, n) {
        string line; re(line);
        f0r(j, t) res[i][j] = line[j] - '0';
        f0r(j, t){
            if(res[i][j]) good[j].eb(i);
            else bad[j].eb(i);
        }
    }
    f0r(i,n) f0r(j, t) nxt[i][j] = -1;
    f0r(i, n){
        int st = -1;
        f0r(j, t){
            if(res[i][j] && st == -1) st = j;
            if(!res[i][j]){
                nxt[i][j] = j;
                if(st == -1) continue;
                f1r(k, st, j) nxt[i][k] = j;
                st = -1;
            }
        }
    }
    f0r(i, t){
        if(i == 0) pre[i] = p[i];
        else pre[i] = pre[i-1] + p[i];
    }
    f0r(i, n){
        f0r(j, t){
            if(j == 0) cnt[i][j] = res[i][j];
            else cnt[i][j] = cnt[i][j-1] + res[i][j];
        }
    }
    f1r(i, 1, s+1){
        if(i == 1){
            f0r(j, t){
                f0r(k, n){
                    if(get(k, 0, j) == j+1) dp[i][j] += sum(0, j);
                }
            }
            continue;
        }
        f0r(k, MAXN){
            levels[k] = INF;
        }
        f0r(j, t) down[j].clear();
        f1r(j, i-1, t){
            ///update the previous
            if(j != i-1){

                for(auto x: down[j]){
                    curLevel[x]--;
                    ckmin(levels[curLevel[x]], dp[i-1][x] - pre[x]*curLevel[x]);
                }

            }
            /// insert dp[i-1][j-1];
            int num = 0;
            for(int k: good[j]){
                num++;
                if(nxt[k][j] != -1) down[nxt[k][j]].eb(j-1);
            }
            ckmin(levels[num], dp[i-1][j-1]- num*pre[j-1]);
            curLevel[j-1] = num;
            dp[i][j] = 1e9;
            f0r(k, n+1){
                if(levels[k] != INF) {
                    ckmin(dp[i][j], levels[k] + k*pre[j]);
                }
            }
        }
    }
    f1r(i, 1, s+1){
        ps(dp[i][t-1]);
    }

    return 0;
}

Compilation message

popeala.cpp:1: warning: ignoring #pragma comment  [-Wunknown-pragmas]
    1 | #pragma comment(linker, "/stack:200000000")
      | 
popeala.cpp: In function 'void io::setIn(std::string)':
popeala.cpp:133:32: warning: ignoring return value of 'FILE* freopen(const char*, const char*, FILE*)', declared with attribute warn_unused_result [-Wunused-result]
  133 |  void setIn(string s) { freopen(s.c_str(),"r",stdin); }
      |                         ~~~~~~~^~~~~~~~~~~~~~~~~~~~~
popeala.cpp: In function 'void io::setOut(std::string)':
popeala.cpp:134:33: warning: ignoring return value of 'FILE* freopen(const char*, const char*, FILE*)', declared with attribute warn_unused_result [-Wunused-result]
  134 |  void setOut(string s) { freopen(s.c_str(),"w",stdout); }
      |                          ~~~~~~~^~~~~~~~~~~~~~~~~~~~~~
# 결과 실행 시간 메모리 Grader output
1 Correct 2 ms 1776 KB Output is correct
2 Correct 2 ms 2284 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 27 ms 3180 KB Output is correct
2 Correct 25 ms 3180 KB Output is correct
3 Correct 26 ms 3308 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 112 ms 5356 KB Output is correct
2 Correct 170 ms 6380 KB Output is correct
3 Correct 216 ms 7660 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 2 ms 1776 KB Output is correct
2 Correct 2 ms 2284 KB Output is correct
3 Correct 27 ms 3180 KB Output is correct
4 Correct 25 ms 3180 KB Output is correct
5 Correct 26 ms 3308 KB Output is correct
6 Correct 112 ms 5356 KB Output is correct
7 Correct 170 ms 6380 KB Output is correct
8 Correct 216 ms 7660 KB Output is correct
9 Correct 377 ms 10732 KB Output is correct
10 Correct 557 ms 13344 KB Output is correct
11 Correct 1232 ms 26492 KB Output is correct
12 Correct 1317 ms 26732 KB Output is correct
13 Correct 1266 ms 26884 KB Output is correct
14 Correct 1282 ms 26904 KB Output is correct
15 Correct 1289 ms 27116 KB Output is correct