您的位置:首页 > 其它

Educational Codeforces Round 19

2017-04-16 10:36 344 查看
  由于时间原因只A掉了前三题。

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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: