Educational Codeforces Round 19
2017-04-16 10:36
344 查看
由于时间原因只A掉了前三题。
题目大意是说给出一个数n,能不能把它分成k个严格大于1的整数的乘积,如果可以,随便输出一种方案,否则就输出-1。
首先对n进行质因数分解,如果质因数的个数小于k就输出-1,否则随便合并几个使总数为k,然后输出就好了。
Code
Problem#C
不过这道题似乎有更简单的实现方法,时间复杂度为O(nk),其中k为字符集大小,这里为26
Problem#A k-Factorization
题目传送门[here]题目大意是说给出一个数n,能不能把它分成k个严格大于1的整数的乘积,如果可以,随便输出一种方案,否则就输出-1。
首先对n进行质因数分解,如果质因数的个数小于k就输出-1,否则随便合并几个使总数为k,然后输出就好了。
Code
/** * CodeForces * Problem#797C * Accepted * Time:46ms * Memory:7360k */ #include<iostream> #include<fstream> #include<sstream> #include<algorithm> #include<cstdio> #include<cstring> #include<cstdlib> #include<cctype> #include<cmath> #include<ctime> #include<map> #include<stack> #include<set> #include<queue> #include<vector> using namespace std; typedef bool boolean; #define inf 0xfffffff #define smin(a, b) (a) = min((a), (b)) #define smax(a, b) (a) = max((a), (b)) typedef class SegTreeNode { public: char val; SegTreeNode *l, *r; SegTreeNode():val(127), l(NULL), r(NULL) { } inline void pushUp() { val = min(l->val, r->val); } }SegTreeNode; typedef class SegTree { public: SegTreeNode* root; SegTree():root(NULL) { } SegTree(int n, char* s) { build(root, 1, n, s); } void build(SegTreeNode*& node, int l, int r, char* s) { node = new SegTreeNode(); if(l == r) { node->val = s[l]; return; } int mid = (l + r) >> 1; build(node->l, l, mid, s); build(node->r, mid + 1, r, s); node->pushUp(); } void update(SegTreeNode*& node, int l, int r, int idx, char val) { if(l == idx && r == idx) { node->val = val; return; } int mid = (l + r) >> 1; if(idx <= mid) update(node->l, l, mid, idx, val); else update(node->r, mid + 1, r, idx, val); node->pushUp(); } char query(SegTreeNode*& node, int l, int r, int ql, int qr) { if(l == ql && r == qr) return node->val; int mid = (l + r) >> 1; if(qr <= mid) return query(node->l, l, mid, ql, qr); else if(ql > mid) return query(node->r, mid + 1, r, ql, qr); int a = query(node->l, l, mid, ql, mid); int b = query(node->r, mid + 1, r, mid + 1, qr); return min(a, b); } }SegTree; int n; char s[100005]; int top = 0; char* sta; int* idx; SegTree st; inline void init() { scanf("%s", s + 1); n = strlen(s + 1); sta = new char[(const int)(n + 5)]; idx = new int[(const int)(n + 5)]; st = SegTree(n, s); } inline void solve() { int front = 1; sta[0] = 127; idx[0] = 0; while(front <= n || top) { if(front <= n) { while(front <= n && sta[top] > st.query(st.root, 1, n, idx[top] + 1, n)) sta[++top] = s[front], idx[top] = front++; st.update(st.root, 1, n, idx[top], 127); putchar(sta[top--]); } else { putchar(sta[top--]); } } } int main() { init(); solve(); return 0; }
Problem#C
不过这道题似乎有更简单的实现方法,时间复杂度为O(nk),其中k为字符集大小,这里为26
相关文章推荐
- Educational Codeforces Round 19 E. Array Queries
- Educational Codeforces Round 19 F(dp+队列优化)
- Educational Codeforces Round 19
- Educational Codeforces Round 19 E. Array Queries
- Educational Codeforces Round 19 A, B, C, E(xjb)
- Educational Codeforces Round 19 E. Array Queries
- Educational Codeforces Round 19 E. Array Queries
- Educational Codeforces Round 19 A. k-Factorization
- Educational Codeforces Round 19 ABCDE题解
- Educational Codeforces Round 19 E. Array Queries
- Educational Codeforces Round 19-E. Array Queries
- Educational Codeforces Round 19
- Educational Codeforces Round 19 B. Odd sum
- Educational Codeforces Round 19 C. Minimal string
- Educational Codeforces Round 19 E. Array Queries
- Educational Codeforces Round 19-D. Broken BST
- Educational Codeforces Round 19 A+B+C+E!
- Educational Codeforces Round 19 A
- Educational Codeforces Round 19 ABCDE题解
- Educational Codeforces Round 19 E. Array Queries