• Codeforces Round #593 (Div. 2)


    Contest Info


    [Practice Link](https://codeforces.com/contest/1236)
    Solved A B C D E F
    5/6 O O O O Ø -
    • O 在比赛中通过
    • Ø 赛后通过
    • ! 尝试了但是失败了
    • - 没有尝试

    Solutions


    A. Stones

    签到。

    代码:

    view code
    #pragma GCC optimize("Ofast,unroll-loops,no-stack-protector,fast-math")
    #pragma GCC target("sse,sse2,sse3,ssse3,sse4,popcnt,abm,mmx,avx,tune=native")
    #include <bits/stdc++.h>
    #define fi first
    #define se second
    #define endl "
    " 
    using namespace std;
    using db = double;
    using ll = long long;
    using ull = unsigned long long; 
    using pII = pair <int, int>;
    using pLL = pair <ll, ll>;
    constexpr int mod = 1e9 + 7;
    template <class T1, class T2> inline void chadd(T1 &x, T2 y) { x += y; while (x >= mod) x -= mod; while (x < 0) x += mod; } 
    template <class T1, class T2> inline void chmax(T1 &x, T2 y) { if (x < y) x = y; }
    template <class T1, class T2> inline void chmin(T1 &x, T2 y) { if (x > y) x = y; }
    inline int rd() { int x; cin >> x; return x; }
    template <class T> inline void rd(T &x) { cin >> x; }
    template <class T> inline void rd(vector <T> &vec) { for (auto &it : vec) cin >> it; }  
    #define dbg(x...) do { cout << "33[32;1m" << #x << " -> "; err(x); } while (0) 
    void err() { cout << "33[39;0m" << endl; } 
    template <class T, class... Ts> void err(const T& arg, const Ts&... args) { cout << arg << ' '; err(args...); }
    template <template<typename...> class T, typename t, typename... A> 
    void err(const T <t> &arg, const A&... args) { for (auto &v : arg) cout << v << ' '; err(args...); }
    inline void pt() { cout << endl; } 
    template <class T, class... Ts> void pt(const T& arg, const Ts&... args) { cout << arg << ' '; pt(args...); }
    template <template<typename...> class T, typename t, typename... A> 
    void pt(const T <t> &arg, const A&... args) { for (auto &v : arg) cout << v << ' '; pt(args...); }
    ll gcd(ll a, ll b) { return b ? gcd(b, a % b) : a; }
    inline ll qpow(ll base, ll n) { ll res = 1; while (n) { if (n & 1) res = res * base % mod; base = base * base % mod; n >>= 1; } return res; }
    //head
    constexpr int N = 1e5 + 10;
    int a, b, c; 
    void run() {
    	cin >> a >> b >> c;
    	int res = 0;
    	int x = min(b, c / 2);
    	res += 3 * x;
    	b -= x;
    	res += min(a, b / 2) * 3;
    	pt(res);
    }
    
    int main() {
    	ios::sync_with_stdio(false);
    	cin.tie(nullptr); cout.tie(nullptr);
    	cout << fixed << setprecision(20);
    	int _T; cin >> _T;
    	while (_T--) run();
    	return 0;
    }
    

    B. Alice and the List of Presents

    题意:
    (n)种数,有(m)个集合,需要给(m)个集合放置一些数,使得每一种数至少要在一个集合中出现过。

    思路:
    考虑针对每个数考虑,一个数在(m)个集合中出现或不出现的方案数(2^m),然后减去全都不出现的情况即可。

    代码:

    view code
    #pragma GCC optimize("Ofast,unroll-loops,no-stack-protector,fast-math")
    #pragma GCC target("sse,sse2,sse3,ssse3,sse4,popcnt,abm,mmx,avx,tune=native")
    #include <bits/stdc++.h>
    #define fi first
    #define se second
    #define endl "
    " 
    using namespace std;
    using db = double;
    using ll = long long;
    using ull = unsigned long long; 
    using pII = pair <int, int>;
    using pLL = pair <ll, ll>;
    constexpr ll mod = 1e9 + 7;
    template <class T1, class T2> inline void chadd(T1 &x, T2 y) { x += y; while (x >= mod) x -= mod; while (x < 0) x += mod; } 
    template <class T1, class T2> inline void chmax(T1 &x, T2 y) { if (x < y) x = y; }
    template <class T1, class T2> inline void chmin(T1 &x, T2 y) { if (x > y) x = y; }
    inline int rd() { int x; cin >> x; return x; }
    template <class T> inline void rd(T &x) { cin >> x; }
    template <class T> inline void rd(vector <T> &vec) { for (auto &it : vec) cin >> it; }  
    #define dbg(x...) do { cout << "33[32;1m" << #x << " -> "; err(x); } while (0) 
    void err() { cout << "33[39;0m" << endl; } 
    template <class T, class... Ts> void err(const T& arg, const Ts&... args) { cout << arg << ' '; err(args...); }
    template <template<typename...> class T, typename t, typename... A> 
    void err(const T <t> &arg, const A&... args) { for (auto &v : arg) cout << v << ' '; err(args...); }
    inline void pt() { cout << endl; } 
    template <class T, class... Ts> void pt(const T& arg, const Ts&... args) { cout << arg << ' '; pt(args...); }
    template <template<typename...> class T, typename t, typename... A> 
    void pt(const T <t> &arg, const A&... args) { for (auto &v : arg) cout << v << ' '; pt(args...); }
    ll gcd(ll a, ll b) { return b ? gcd(b, a % b) : a; }
    inline ll qpow(ll base, ll n) { ll res = 1; while (n) { if (n & 1) res = res * base % mod; base = base * base % mod; n >>= 1; } return res; }
    //head
    constexpr int N = 1e5 + 10;
    ll n, m; 
    void run() {
    	pt(qpow((qpow(2, m) - 1 + mod) % mod, n));
    }
    
    int main() {
    	ios::sync_with_stdio(false);
    	cin.tie(nullptr); cout.tie(nullptr);
    	cout << fixed << setprecision(20);
    	while (cin >> n >> m) run();
    	return 0;
    }
    

    C. Labs

    题意:
    (n^2)个实验室,标号大的能向标号小的流水,现在要将他们分组,组内的实验室可以互相流通,组与组之间的流量定义为(f(X, Y)),表示有多少对((i, j))使得(i in X, j in Y)并且(i > j)
    现在要将(n^2)个实验室分成(n)组,使得最小的(f(X, Y))最大。

    思路:
    类似于这样:

    1 6 7
    2 5 8
    3 4 9

    代码:

    view code
    #pragma GCC optimize("Ofast,unroll-loops,no-stack-protector,fast-math")
    #pragma GCC target("sse,sse2,sse3,ssse3,sse4,popcnt,abm,mmx,avx,tune=native")
    #include <bits/stdc++.h>
    #define fi first
    #define se second
    #define endl "
    " 
    using namespace std;
    using db = double;
    using ll = long long;
    using ull = unsigned long long; 
    using pII = pair <int, int>;
    using pLL = pair <ll, ll>;
    constexpr int mod = 1e9 + 7;
    template <class T1, class T2> inline void chadd(T1 &x, T2 y) { x += y; while (x >= mod) x -= mod; while (x < 0) x += mod; } 
    template <class T1, class T2> inline void chmax(T1 &x, T2 y) { if (x < y) x = y; }
    template <class T1, class T2> inline void chmin(T1 &x, T2 y) { if (x > y) x = y; }
    inline int rd() { int x; cin >> x; return x; }
    template <class T> inline void rd(T &x) { cin >> x; }
    template <class T> inline void rd(vector <T> &vec) { for (auto &it : vec) cin >> it; }  
    #define dbg(x...) do { cout << "33[32;1m" << #x << " -> "; err(x); } while (0) 
    void err() { cout << "33[39;0m" << endl; } 
    template <class T, class... Ts> void err(const T& arg, const Ts&... args) { cout << arg << ' '; err(args...); }
    template <template<typename...> class T, typename t, typename... A> 
    void err(const T <t> &arg, const A&... args) { for (auto &v : arg) cout << v << ' '; err(args...); }
    inline void pt() { cout << endl; } 
    template <class T, class... Ts> void pt(const T& arg, const Ts&... args) { cout << arg << ' '; pt(args...); }
    template <template<typename...> class T, typename t, typename... A> 
    void pt(const T <t> &arg, const A&... args) { for (auto &v : arg) cout << v << ' '; pt(args...); }
    ll gcd(ll a, ll b) { return b ? gcd(b, a % b) : a; }
    inline ll qpow(ll base, ll n) { ll res = 1; while (n) { if (n & 1) res = res * base % mod; base = base * base % mod; n >>= 1; } return res; }
    //head
    constexpr int N = 5e2 + 10;
    int n, a[N][N]; 
    void run() {
    	for (int j = 1; j <= n; ++j) {
    		int id = (j - 1) * n;
    		if (j & 1) {
    			for (int i = 1; i <= n; ++i)
    				a[i][j] = ++id;
    		} else {
    			for (int i = n; i >= 1; --i) {
    				a[i][j] = ++id;
    			}
    		}
    	}
    	for (int i = 1; i <= n; ++i) {
    		for (int j = 1; j <= n; ++j) {
    			cout << a[i][j] << " 
    "[j == n];		
    		}
    	}
    }
    
    int main() {
    	ios::sync_with_stdio(false);
    	cin.tie(nullptr); cout.tie(nullptr);
    	cout << fixed << setprecision(20);
    	while (cin >> n) run();
    	return 0;
    }
    

    D. Alice and the Doll

    题意:
    在一个(n cdot m)的矩形中,有(k)个障碍物,现在从((1, 1))出发,在每个点只能向右转动一次,并且每个点只能访问一次,问能不能访问完所有非障碍的结点。

    思路:
    访问的路径肯定是蛇形的,模拟即可。

    代码:

    view code
    #pragma GCC optimize("Ofast,unroll-loops,no-stack-protector,fast-math")
    #pragma GCC target("sse,sse2,sse3,ssse3,sse4,popcnt,abm,mmx,avx,tune=native")
    #include <bits/stdc++.h>
    #define fi first
    #define se second
    #define endl "
    " 
    using namespace std;
    using db = double;
    using ll = long long;
    using ull = unsigned long long; 
    using pII = pair <int, int>;
    using pLL = pair <ll, ll>;
    constexpr int mod = 1e9 + 7;
    template <class T1, class T2> inline void chadd(T1 &x, T2 y) { x += y; while (x >= mod) x -= mod; while (x < 0) x += mod; } 
    template <class T1, class T2> inline void chmax(T1 &x, T2 y) { if (x < y) x = y; }
    template <class T1, class T2> inline void chmin(T1 &x, T2 y) { if (x > y) x = y; }
    inline int rd() { int x; cin >> x; return x; }
    template <class T> inline void rd(T &x) { cin >> x; }
    template <class T> inline void rd(vector <T> &vec) { for (auto &it : vec) cin >> it; }  
    #define dbg(x...) do { cout << "33[32;1m" << #x << " -> "; err(x); } while (0) 
    void err() { cout << "33[39;0m" << endl; } 
    template <class T, class... Ts> void err(const T& arg, const Ts&... args) { cout << arg << ' '; err(args...); }
    template <template<typename...> class T, typename t, typename... A> 
    void err(const T <t> &arg, const A&... args) { for (auto &v : arg) cout << v << ' '; err(args...); }
    inline void pt() { cout << endl; } 
    template <class T, class... Ts> void pt(const T& arg, const Ts&... args) { cout << arg << ' '; pt(args...); }
    template <template<typename...> class T, typename t, typename... A> 
    void pt(const T <t> &arg, const A&... args) { for (auto &v : arg) cout << v << ' '; pt(args...); }
    ll gcd(ll a, ll b) { return b ? gcd(b, a % b) : a; }
    inline ll qpow(ll base, ll n) { ll res = 1; while (n) { if (n & 1) res = res * base % mod; base = base * base % mod; n >>= 1; } return res; }
    //head
    constexpr int N = 1e5 + 10;
    int n, m, k;
    set <int> row[N], col[N]; 
    bool del(int up, int down, int left, int right) {
    	for (int i = up; i <= down; ++i) {
    		for (int j = left; j <= right; ++j) {
    			if (row[i].find(j) == row[i].end() || col[j].find(i) == col[j].end()) {
    				return false;
    			} else {
    				row[i].erase(j);
    				col[j].erase(i);
    				--k; 
    			}
    		}
    	}
    	return true;
    }
    //dir
    //0 right
    //1 down
    //2 left
    //3 up
    void run() {
    	for (int i = 1; i <= n; ++i) row[i].clear();
    	for (int i = 1; i <= m; ++i) col[i].clear();
    	for (int i = 1, x, y; i <= k; ++i) {
    		cin >> x >> y;
    		row[x].insert(y);
    		col[y].insert(x);
    	}
    	if (!k) return pt("Yes");
    	int up = 1, down = n, left = 1, right = m; 
    	int x = 1, y = 1, dir = 0;
    	bool F = 0;
    	while (k) {
    	//	dbg(up, down, left, right, dir, x, y); 
    		if (dir == 0) { // right
    			auto it = row[x].begin(); 
    			if (it == row[x].end()) { 
    				y = right; 
    			} else {
    				int pos = *it; 
    				if (!del(up, down, pos, right)) {
    					return pt("No");
    				}
    				right = pos - 1; 
    				y = pos - 1; 
    			}
    			left += F;
    		} else if (dir == 1) { // down
    			auto it = col[y].begin();
    			if (it == col[y].end()) { 
    				x = down;
    			} else {
    				int pos = *it;
    				if (!del(pos, down, left, right)) {
    					return pt("No");
    				}
    				down = pos - 1;
    				x = pos - 1;
    			}
    			up += F;
    		} else if (dir == 2) { // left
    			auto it = row[x].end();
    			if (it != row[x].begin()) {
    				--it;
    				int pos = *it;
    				if (!del(up, down, left, pos)) {
    					return pt("No");
    				}
    				left = pos + 1;
    				y = pos + 1;
    			} else {
    				y = left;
    			}
    			right -= F;
    		} else { // up
    			auto it = col[y].end();
    			if (it != col[y].begin()) {
    				--it;
    				int pos = *it;
    				if (!del(up, pos, left, right)) {
    					return pt("No");
    				}
    				up = pos + 1;
    				x = pos + 1;
    			} else {
    				x = up;
    			}
    			down -= F;
    		}
    		dir = (dir + 1) % 4;
    		F = 1;
    	}
    	pt("Yes");
    }
    
    int main() {
    	ios::sync_with_stdio(false);
    	cin.tie(nullptr); cout.tie(nullptr);
    	cout << fixed << setprecision(20);
    	while (cin >> n >> m >> k) run();
    	return 0;
    }
    

    E. Alice and the Unfair Game

    题意:
    在一个一维数轴上,长度为(n),在第(i)秒第(a_i)个位置会有怪物出现,定义一个二元组((x, y))表示刚开始从(x)出发,最后能停留在(y)是否可行。
    问有多少个这样的二元组可行。

    思路:
    猜测对于一个起点(x)来说,它可行的(y)的是一段范围,那么我们只需要找到最远的(y)即可。
    我们将它放在二维坐标系上,一维是时间,一维是位置。
    刚开始从((0, x))出发,要到((m, y)),并且只能向右上、右、右下走,并且不能走到障碍物。
    并且我们只需要关心最远能走到的地方,那么以右上为例,能右上走就右上,否则往右。
    那么发现跟线段的斜率有关,贪心(dp)即可。

    代码:

    view code
    #pragma GCC optimize("Ofast,unroll-loops,no-stack-protector,fast-math")
    #pragma GCC target("sse,sse2,sse3,ssse3,sse4,popcnt,abm,mmx,avx,tune=native")
    #include <bits/stdc++.h>
    #define fi first
    #define se second
    #define endl "
    " 
    using namespace std;
    using db = double;
    using ll = long long;
    using ull = unsigned long long; 
    using pII = pair <int, int>;
    using pLL = pair <ll, ll>;
    constexpr int mod = 1e9 + 7;
    template <class T1, class T2> inline void chadd(T1 &x, T2 y) { x += y; while (x >= mod) x -= mod; while (x < 0) x += mod; } 
    template <class T1, class T2> inline void chmax(T1 &x, T2 y) { if (x < y) x = y; }
    template <class T1, class T2> inline void chmin(T1 &x, T2 y) { if (x > y) x = y; }
    inline int rd() { int x; cin >> x; return x; }
    template <class T> inline void rd(T &x) { cin >> x; }
    template <class T> inline void rd(vector <T> &vec) { for (auto &it : vec) cin >> it; }  
    #define dbg(x...) do { cout << "33[32;1m" << #x << " -> "; err(x); } while (0) 
    void err() { cout << "33[39;0m" << endl; } 
    template <class T, class... Ts> void err(const T& arg, const Ts&... args) { cout << arg << ' '; err(args...); }
    template <template<typename...> class T, typename t, typename... A> 
    void err(const T <t> &arg, const A&... args) { for (auto &v : arg) cout << v << ' '; err(args...); }
    inline void pt() { cout << endl; } 
    template <class T, class... Ts> void pt(const T& arg, const Ts&... args) { cout << arg << ' '; pt(args...); }
    template <template<typename...> class T, typename t, typename... A> 
    void pt(const T <t> &arg, const A&... args) { for (auto &v : arg) cout << v << ' '; pt(args...); }
    ll gcd(ll a, ll b) { return b ? gcd(b, a % b) : a; }
    inline ll qpow(ll base, ll n) { ll res = 1; while (n) { if (n & 1) res = res * base % mod; base = base * base % mod; n >>= 1; } return res; }
    //head
    constexpr int N = 1e6 + 10, OFFSET = 2e5;
    int n, m, a[N], l[N], r[N], f[N], last[N];
    //y - x
    void gaol() {
    	memset(last, -1, sizeof last);
    	for (int i = m; i >= 1; --i) {
    		int p = a[i] + 1 + i;
    		if (last[p] == -1) f[i] = max(1, a[i] - (m - i)); 
    		else f[i] = f[last[p]];
    		last[a[i] + i] = i;
    	}
    	for (int i = 1; i <= n; ++i) {
    		int p = i;
    //		dbg(i, p, last[p]);
    		if (last[p] == -1) l[i] = max(1, i - (m + 1));
    		else l[i] = f[last[p]];
    	}
    }
    void gaor() {
    	memset(last, -1, sizeof last);
    	for (int i = m; i >= 1; --i) {
    		int p = a[i] - 1 - i + OFFSET; 
    		if (last[p] == -1) f[i] = min(n, a[i] + m - i); 
    		else f[i] = f[last[p]];
    		last[a[i] - i + OFFSET] = i;
    	}
    	for (int i = 1; i <= n; ++i) {
    		int p = i + OFFSET;
    		if (last[p] == -1) r[i] = min(n, i + m + 1);
    		else r[i] = f[last[p]];
    	}
    }
    void run() {
    	for (int i = 1; i <= m; ++i) a[i] = rd();
    	if (n == 1) return pt(0);
    	gaol();
       	gaor();
    	ll ans = 0;
    	for (int i = 1; i <= n; ++i) {
    	//	dbg(i, l[i], r[i]);
    		ans += r[i] - l[i] + 1;
    	}
    	pt(ans);	
    }
    
    int main() {
    	ios::sync_with_stdio(false);
    	cin.tie(nullptr); cout.tie(nullptr);
    	cout << fixed << setprecision(20);
    	while (cin >> n >> m) run();
    	return 0;
    }
    
  • 相关阅读:
    python CST中国标准时间格式转换
    pytest+报告插件
    getopt实现命令行
    初识Redis
    python list 切片及翻转的使用
    mysql中information_schema表
    获取两个字符串中最长的相同子串
    mongodb数据库备份
    VS2005下边不能使用target>remote tool解决方法
    wince LoadDriver tool
  • 原文地址:https://www.cnblogs.com/Dup4/p/11717716.html
Copyright © 2020-2023  润新知