Submission #203014

# Submission time Handle Problem Language Result Execution time Memory
203014 2020-02-19T03:21:56 Z rqi Restore Array (RMI19_restore) C++14
100 / 100
585 ms 196884 KB
#pragma GCC optimize ("O3")
#pragma GCC target ("sse4")
 
#include <bits/stdc++.h>
 
using namespace std;
 
typedef double db;
typedef long long ll;
typedef long double ld;
typedef string str;
 
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<str> vs;
typedef vector<pi> vpi;
typedef vector<pl> vpl;
typedef vector<cd> vcd;
 
#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 trav(a,x) for (auto& a : x)
 
#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) begin(x), end(x)
#define rall(x) rbegin(x), rend(x)
#define rsz resize
#define ins insert
 
const int MOD = 1e9+7; // 998244353 = (119<<23)+1
const ll INF = 1e18;
const int MX = 2e5+5;
const ld PI = 4*atan((ld)1);
 
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; }
 
mt19937 rng(chrono::steady_clock::now().time_since_epoch().count());
 
#include <ext/pb_ds/tree_policy.hpp>
#include <ext/pb_ds/assoc_container.hpp>
#include <ext/rope>
 
using namespace __gnu_pbds;
using namespace __gnu_cxx;
 
template <class T> using Tree = tree<T, null_type, less<T>, rb_tree_tag, tree_order_statistics_node_update>;
 
#define ook order_of_key
#define fbo find_by_order
 
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;
 
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 void pr(const modular& a) { pr(a.val); }
	friend void re(modular& a) { ll x; re(x); a = modular(x); }
   
	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;

ll dist[10005][5005];
pair<pi, ll> edges[20005];
int ans[5005];
int main() {
	setIO();
    // you should actually read the stuff at the bottom
    int N, M;
    cin >> N >> M;
    int ind = 0;
    for(int i = 1; i <= M; i++){
    	int l, r, k;
    	ll value;
    	cin >> l >> r >> k >> value;
    	if(value == 0){
    		edges[ind] = (mp(mp(l, r+1), (r-l+1-k)));
    		ind++;
    	}
    	else{
    		edges[ind] = (mp(mp(r+1, l), -(r-l+2-k)));
    		ind++;
    	}
    }
    for(int i = 0; i < N; i++){
    	edges[ind] = (mp(mp(i, i+1), 1));
    	ind++;
    	edges[ind] = (mp(mp(i+1, i), 0));
    	ind++;
    }
    //ps(edges);
    for(int i = 0; i <= N; i++){
    	for(int j = 1; j <= N; j++){
    		dist[i][j] = MOD;
    	}
    }
    dist[0][0] = 0;
    
    for(int i = 1; i <= N+1; i++){
    	for(int j = 0; j < ind; j++){
    		int l, r, k;
    		l = edges[j].f.f;
    		r = edges[j].f.s;
    		k = edges[j].s;
    		if(i == N+1 && dist[i-1][l]+k < dist[i][r]){
    			ps(-1);
    			return 0;
    		}
    		dist[i][r] = min(dist[i][r], dist[i-1][l]+k);
    	}

    }
    for(int i = 1; i <= N; i++){
    	int diff = dist[N][i]-dist[N][i-1];
    	if(diff != 0 && diff != 1){
    		ps(-1);
    		return 0;
    	}
    	ans[i] = diff;
    }
    /*for(int i = 0; i < M; i++){
    	if()
    }*/
    for(int i = 1; i <= N; i++){
    	cout << ans[i] << " ";
    }
}
 
/* 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

restore.cpp: In function 'void io::setIn(std::__cxx11::string)':
restore.cpp:135: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); }
                            ~~~~~~~^~~~~~~~~~~~~~~~~~~~~
restore.cpp: In function 'void io::setOut(std::__cxx11::string)':
restore.cpp:136: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); }
                             ~~~~~~~^~~~~~~~~~~~~~~~~~~~~~
# Verdict Execution time Memory Grader output
1 Correct 5 ms 376 KB Output is correct
2 Correct 5 ms 376 KB Output is correct
3 Correct 5 ms 376 KB Output is correct
4 Correct 5 ms 504 KB Output is correct
5 Correct 5 ms 376 KB Output is correct
6 Correct 5 ms 376 KB Output is correct
7 Correct 5 ms 376 KB Output is correct
8 Correct 5 ms 376 KB Output is correct
9 Correct 5 ms 504 KB Output is correct
10 Correct 5 ms 380 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 573 ms 196532 KB Output is correct
2 Correct 576 ms 194936 KB Output is correct
3 Correct 561 ms 196600 KB Output is correct
4 Correct 559 ms 194296 KB Output is correct
5 Correct 553 ms 193784 KB Output is correct
6 Correct 552 ms 196472 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 573 ms 196532 KB Output is correct
2 Correct 576 ms 194936 KB Output is correct
3 Correct 561 ms 196600 KB Output is correct
4 Correct 559 ms 194296 KB Output is correct
5 Correct 553 ms 193784 KB Output is correct
6 Correct 552 ms 196472 KB Output is correct
7 Correct 565 ms 194424 KB Output is correct
8 Correct 569 ms 194808 KB Output is correct
9 Correct 585 ms 195196 KB Output is correct
10 Correct 552 ms 195452 KB Output is correct
11 Correct 552 ms 193912 KB Output is correct
12 Correct 563 ms 193912 KB Output is correct
13 Correct 551 ms 195192 KB Output is correct
14 Correct 569 ms 196884 KB Output is correct
15 Correct 556 ms 196856 KB Output is correct
16 Correct 554 ms 196728 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 5 ms 376 KB Output is correct
2 Correct 5 ms 376 KB Output is correct
3 Correct 5 ms 376 KB Output is correct
4 Correct 5 ms 504 KB Output is correct
5 Correct 5 ms 376 KB Output is correct
6 Correct 5 ms 376 KB Output is correct
7 Correct 5 ms 376 KB Output is correct
8 Correct 5 ms 376 KB Output is correct
9 Correct 5 ms 504 KB Output is correct
10 Correct 5 ms 380 KB Output is correct
11 Correct 573 ms 196532 KB Output is correct
12 Correct 576 ms 194936 KB Output is correct
13 Correct 561 ms 196600 KB Output is correct
14 Correct 559 ms 194296 KB Output is correct
15 Correct 553 ms 193784 KB Output is correct
16 Correct 552 ms 196472 KB Output is correct
17 Correct 565 ms 194424 KB Output is correct
18 Correct 569 ms 194808 KB Output is correct
19 Correct 585 ms 195196 KB Output is correct
20 Correct 552 ms 195452 KB Output is correct
21 Correct 552 ms 193912 KB Output is correct
22 Correct 563 ms 193912 KB Output is correct
23 Correct 551 ms 195192 KB Output is correct
24 Correct 569 ms 196884 KB Output is correct
25 Correct 556 ms 196856 KB Output is correct
26 Correct 554 ms 196728 KB Output is correct
27 Correct 542 ms 194296 KB Output is correct
28 Correct 566 ms 195704 KB Output is correct
29 Correct 557 ms 195580 KB Output is correct
30 Correct 567 ms 196216 KB Output is correct
31 Correct 548 ms 194812 KB Output is correct
32 Correct 558 ms 195064 KB Output is correct
33 Correct 569 ms 196344 KB Output is correct
34 Correct 552 ms 194680 KB Output is correct
35 Correct 563 ms 194808 KB Output is correct
36 Correct 557 ms 196472 KB Output is correct