Compare commits
1 Commits
main
...
try-fast-r
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
1b1fe3df11
|
@@ -77,7 +77,7 @@ BreakConstructorInitializersBeforeComma: false
|
||||
BreakConstructorInitializers: BeforeColon
|
||||
BreakAfterJavaFieldAnnotations: false
|
||||
BreakStringLiterals: true
|
||||
ColumnLimit: 100
|
||||
ColumnLimit: 80
|
||||
CommentPragmas: '^ IWYU pragma:'
|
||||
QualifierAlignment: Leave
|
||||
CompactNamespaces: false
|
||||
|
||||
3
.gitignore
vendored
3
.gitignore
vendored
@@ -7,5 +7,4 @@
|
||||
*.o
|
||||
*.dat
|
||||
*.ilk
|
||||
*.pdb
|
||||
*.in
|
||||
*.pdb
|
||||
151
2023202/main.cpp
151
2023202/main.cpp
@@ -1,47 +1,138 @@
|
||||
#include <stdio.h>
|
||||
|
||||
struct Node{
|
||||
int prev, next;
|
||||
template <class E> class Node {
|
||||
private:
|
||||
E content;
|
||||
Node<E> *next;
|
||||
|
||||
public:
|
||||
Node(const E &_content) : content(_content), next(this){};
|
||||
Node(const E &_content, Node<E> *nextPtr)
|
||||
: content(_content), next(nextPtr){};
|
||||
void setNext(Node<E> *_ptr) {
|
||||
this->next = _ptr;
|
||||
}
|
||||
E &getContent() {
|
||||
return this->content;
|
||||
}
|
||||
Node<E> *getNextPtr() {
|
||||
return this->next;
|
||||
}
|
||||
};
|
||||
|
||||
Node map[100000];
|
||||
template <class E> class Iterator {
|
||||
private:
|
||||
Node<E> *current;
|
||||
|
||||
public:
|
||||
Iterator(Node<E> *start) : current(start){};
|
||||
E &peekNext() {
|
||||
return this->current->getNextPtr()->getContent();
|
||||
}
|
||||
void next() {
|
||||
this->current = this->current->getNextPtr();
|
||||
}
|
||||
E &peek() {
|
||||
return this->current->getContent();
|
||||
}
|
||||
Node<E> *peekNode() {
|
||||
return this->current;
|
||||
}
|
||||
void insertHere(const E &newItem) {
|
||||
this->current->setNext(
|
||||
new Node<E>(newItem, this->current->getNextPtr()));
|
||||
}
|
||||
};
|
||||
|
||||
template <class E> class List {
|
||||
private:
|
||||
// int _length;
|
||||
Node<E> head;
|
||||
|
||||
public:
|
||||
List(const E &dummyValue)
|
||||
: head(Node<E>(dummyValue)){
|
||||
// this->_length = 0;
|
||||
};
|
||||
void insert(const E &target, const E &newItem) {
|
||||
Iterator<E> iter = Iterator<E>(&this->head);
|
||||
// Remember to add a loop to stop at length!!;
|
||||
while (iter.peek() != target) {
|
||||
iter.next();
|
||||
}
|
||||
iter.insertHere(newItem);
|
||||
// this->_length++;
|
||||
}
|
||||
void remove(const E &target) {
|
||||
Iterator<E> iter = Iterator<E>(&this->head);
|
||||
while (iter.peekNext() != target) {
|
||||
iter.next();
|
||||
}
|
||||
Node<E> *toBeDeleted = iter.peekNode()->getNextPtr();
|
||||
iter.peekNode()->setNext(toBeDeleted->getNextPtr());
|
||||
delete toBeDeleted;
|
||||
// this->_length--;
|
||||
}
|
||||
Iterator<E> iterate() {
|
||||
return Iterator<E>(&this->head);
|
||||
}
|
||||
};
|
||||
|
||||
int read_num() {
|
||||
int summ = 0;
|
||||
char c = getchar();
|
||||
while (c < '0' || c > '9') {
|
||||
c = getchar();
|
||||
}
|
||||
while (c >= '0' && c <= '9') {
|
||||
summ = summ * 10 + c - '0';
|
||||
c = getchar();
|
||||
}
|
||||
return summ;
|
||||
}
|
||||
|
||||
int main() {
|
||||
map[0].prev = 1;
|
||||
map[0].next = 1;
|
||||
map[1].prev = 0;
|
||||
map[1].next = 0;
|
||||
List<int> aList(0);
|
||||
aList.insert(0, 1);
|
||||
int n;
|
||||
int cmd, x, y;
|
||||
scanf("%d", &n);
|
||||
// scanf("%d", &n);
|
||||
n = read_num();
|
||||
while (n) {
|
||||
scanf("%d %d", &cmd, &x);
|
||||
switch(cmd) {
|
||||
case 1: {
|
||||
scanf("%d", &y);
|
||||
map[y].prev = x;
|
||||
map[y].next = map[x].next;
|
||||
map[x].next = y;
|
||||
map[map[y].next].prev = y;
|
||||
break;
|
||||
}
|
||||
case 2: {
|
||||
printf("%d\n", map[x].next);
|
||||
break;
|
||||
}
|
||||
case 3: {
|
||||
map[map[x].prev].next = map[x].next;
|
||||
map[map[x].next].prev = map[x].prev;
|
||||
break;
|
||||
cmd = read_num();
|
||||
x = read_num();
|
||||
// scanf("%d %d", &cmd, &x);
|
||||
switch (cmd) {
|
||||
case 1: {
|
||||
// scanf("%d", &y);
|
||||
y = read_num();
|
||||
aList.insert(x, y);
|
||||
break;
|
||||
}
|
||||
case 2: {
|
||||
Iterator<int> iter = aList.iterate();
|
||||
while (iter.peek() != x) {
|
||||
iter.next();
|
||||
}
|
||||
printf("%d\n", iter.peekNext());
|
||||
break;
|
||||
}
|
||||
case 3: {
|
||||
aList.remove(x);
|
||||
}
|
||||
}
|
||||
n--;
|
||||
}
|
||||
|
||||
int cur = map[0].next;
|
||||
while (cur != 0) {
|
||||
printf("%d\n", cur);
|
||||
cur = map[cur].next;
|
||||
Iterator<int> iter = aList.iterate();
|
||||
iter.next();
|
||||
while (true) {
|
||||
int content = iter.peek();
|
||||
if (content == 0) {
|
||||
break;
|
||||
}
|
||||
printf("%d\n", content);
|
||||
iter.next();
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
@@ -1,48 +0,0 @@
|
||||
#include <stdio.h>
|
||||
// 创建一个栈,拿到一个数,与栈顶比较,如果比栈顶小,压栈(正在波峰向波谷下降)
|
||||
// 比栈顶大,弹栈并计数;和栈顶相同,计数并且压入。
|
||||
|
||||
struct NumberNode {
|
||||
int data;
|
||||
int count;
|
||||
};
|
||||
|
||||
|
||||
long long totalPairs;
|
||||
NumberNode powers[500010];
|
||||
|
||||
int main() {
|
||||
int len = 1;
|
||||
int N;
|
||||
int input;
|
||||
totalPairs = 0;
|
||||
powers[0].data = 0;
|
||||
powers[0].count = 0;
|
||||
scanf("%d", &N);
|
||||
scanf("%d", &powers[1].data);
|
||||
powers[1].count = 1;
|
||||
N--;
|
||||
for (int i = 0; i < N; i++) {
|
||||
scanf("%d", &input);
|
||||
while (len != 0 && powers[len].data < input) {
|
||||
totalPairs += powers[len].count;
|
||||
len--;
|
||||
}
|
||||
if (len == 0 ) {
|
||||
powers[1].data = input;
|
||||
powers[1].count = 1;
|
||||
len = 1;
|
||||
} else {
|
||||
if (powers[len].data == input) {
|
||||
totalPairs += powers[len].count + (len > 1);
|
||||
powers[len].count++;
|
||||
}
|
||||
else {
|
||||
totalPairs += 1;
|
||||
powers[++len] = NumberNode {input, 1};
|
||||
}
|
||||
}
|
||||
}
|
||||
printf("%lld", totalPairs);
|
||||
return 0;
|
||||
}
|
||||
164
2023204/main.cpp
164
2023204/main.cpp
@@ -1,164 +0,0 @@
|
||||
#include <stdio.h>
|
||||
#define DEAD false
|
||||
#define ALIVE true
|
||||
// 'Natural count' is the name of the node when all the nodes in the tree is
|
||||
// alive. xxx_num denotes the count as the question described.
|
||||
|
||||
// SEE ALSO BRANCH 04_02 WITH A CORRECT IMPLEMENTATION
|
||||
|
||||
int ans[200] = {0};
|
||||
long long dead_nodes_num[105] = {0};
|
||||
int total_dead_nodes = 0;
|
||||
long long target_nodes_num[105] = {0};
|
||||
int total_target_nodes = 0;
|
||||
|
||||
struct SeveralContinuedDeadNode {
|
||||
bool status;
|
||||
long long length; // Caution that when status == dead and length == 1, the node itself is alive.
|
||||
};
|
||||
|
||||
struct SearchResult {
|
||||
int next_ans_pos; // pos in the ans[] array.
|
||||
long long count_in_father_line; // natural count.
|
||||
};
|
||||
|
||||
SearchResult find_node(long long target, long long start_num, int next_dead_node_num_ptr,
|
||||
SeveralContinuedDeadNode *upper_line, long long upper_line_segment_count,
|
||||
int layer) {
|
||||
long long spawned_node_max_num = start_num - 1;
|
||||
long long segment_count = upper_line_segment_count;
|
||||
SeveralContinuedDeadNode current_line_node[200] = {0};
|
||||
long long current_line_len = 0;
|
||||
bool all_dead = true;
|
||||
|
||||
// Spawing all the nodes in current line
|
||||
for (int upper_line_iter = 0; upper_line_iter < upper_line_segment_count; upper_line_iter++) {
|
||||
if (upper_line[upper_line_iter].status == DEAD) {
|
||||
current_line_node[current_line_len] = upper_line[upper_line_iter];
|
||||
current_line_node[current_line_len].length *= 2;
|
||||
current_line_len++;
|
||||
}
|
||||
else {
|
||||
all_dead = false;
|
||||
long long total_spawned_after =
|
||||
spawned_node_max_num + upper_line[upper_line_iter].length * 2;
|
||||
while (dead_nodes_num[next_dead_node_num_ptr] <= total_spawned_after &&
|
||||
next_dead_node_num_ptr < total_dead_nodes) {
|
||||
if (dead_nodes_num[next_dead_node_num_ptr] - spawned_node_max_num > 1) {
|
||||
current_line_node[current_line_len] = SeveralContinuedDeadNode{
|
||||
ALIVE, dead_nodes_num[next_dead_node_num_ptr] - spawned_node_max_num - 1};
|
||||
current_line_len++; // things before this new dead node
|
||||
}
|
||||
current_line_node[current_line_len] =
|
||||
SeveralContinuedDeadNode{DEAD, 1}; // this new dead node
|
||||
current_line_len++;
|
||||
|
||||
spawned_node_max_num = dead_nodes_num[next_dead_node_num_ptr]; // we now spawned to
|
||||
// this dead node.
|
||||
next_dead_node_num_ptr++;
|
||||
}
|
||||
if (spawned_node_max_num < total_spawned_after) {
|
||||
current_line_node[current_line_len] =
|
||||
SeveralContinuedDeadNode{ALIVE, total_spawned_after - spawned_node_max_num};
|
||||
current_line_len++;
|
||||
}
|
||||
|
||||
spawned_node_max_num = total_spawned_after;
|
||||
}
|
||||
}
|
||||
|
||||
if (all_dead) {
|
||||
return SearchResult{1, -1};
|
||||
}
|
||||
|
||||
if (target <= spawned_node_max_num) {
|
||||
ans[0] = target;
|
||||
long long natural_pos = -1, num = start_num - 1;
|
||||
for (int i = 0; i < current_line_len; i++) {
|
||||
if (current_line_node[i].status == DEAD) {
|
||||
natural_pos += current_line_node[i].length;
|
||||
num += (current_line_node[i].length == 1);
|
||||
if (num == target) {
|
||||
return SearchResult{1, natural_pos / 2};
|
||||
}
|
||||
continue;
|
||||
}
|
||||
|
||||
// Now deal with alive nodes
|
||||
if (num + current_line_node[i].length < target) {
|
||||
natural_pos += current_line_node[i].length;
|
||||
num += current_line_node[i].length;
|
||||
}
|
||||
else {
|
||||
// if we made it here, then the target > num + current_line_node[i].length
|
||||
return SearchResult{1, (natural_pos + target - num) / 2};
|
||||
}
|
||||
}
|
||||
return SearchResult{1, -1};
|
||||
}
|
||||
else {
|
||||
SearchResult current_line_pos =
|
||||
find_node(target, spawned_node_max_num + 1, next_dead_node_num_ptr, current_line_node,
|
||||
current_line_len, layer + 1);
|
||||
if (current_line_pos.count_in_father_line < 0) {
|
||||
// The path does not exist.
|
||||
return SearchResult{1, -1};
|
||||
}
|
||||
|
||||
long long natural_count = -1, num = start_num - 1;
|
||||
for (int i = 0; i < current_line_len; i++) {
|
||||
natural_count += current_line_node[i].length;
|
||||
if (current_line_node[i].status == ALIVE || current_line_node[i].length == 1) {
|
||||
num += current_line_node[i].length;
|
||||
}
|
||||
|
||||
if (natural_count >= current_line_pos.count_in_father_line) {
|
||||
num -= natural_count - current_line_pos.count_in_father_line;
|
||||
ans[current_line_pos.next_ans_pos++] = num;
|
||||
break;
|
||||
}
|
||||
}
|
||||
return SearchResult{current_line_pos.next_ans_pos,
|
||||
current_line_pos.count_in_father_line / 2};
|
||||
}
|
||||
}
|
||||
|
||||
int main() {
|
||||
scanf("%d %d", &total_dead_nodes, &total_target_nodes);
|
||||
for (int i = 0; i < total_dead_nodes; i++) {
|
||||
scanf("%lld", &dead_nodes_num[i]);
|
||||
}
|
||||
for (int i = 0; i < total_target_nodes; i++) {
|
||||
scanf("%lld", &target_nodes_num[i]);
|
||||
}
|
||||
if (dead_nodes_num[0] == 1) {
|
||||
for (int i = 0; i < total_target_nodes; i++) {
|
||||
if (target_nodes_num[i] == 1) {
|
||||
printf("1\n");
|
||||
continue;
|
||||
}
|
||||
else {
|
||||
printf("0\n");
|
||||
}
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
else {
|
||||
SeveralContinuedDeadNode firstline = SeveralContinuedDeadNode{ALIVE, 1};
|
||||
for (int i = 0; i < total_target_nodes; i++) {
|
||||
SearchResult result = find_node(target_nodes_num[i], 2, 0, &firstline, 1, 2);
|
||||
if (result.count_in_father_line == -1) {
|
||||
printf("0\n");
|
||||
}
|
||||
else {
|
||||
printf("1 ");
|
||||
for (int j = result.next_ans_pos - 1; j >= 0; j--) {
|
||||
printf("%lld ", ans[j]);
|
||||
}
|
||||
printf("\n");
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
111
2023205/main.cpp
111
2023205/main.cpp
@@ -1,111 +0,0 @@
|
||||
#include <stdio.h>
|
||||
// 并查集。并查集只关注双向连通性。
|
||||
|
||||
struct Edge {
|
||||
unsigned short end;
|
||||
bool used_in_dfs;
|
||||
};
|
||||
|
||||
Edge edges[1050000];
|
||||
char nodes_visited[65540];
|
||||
int pos[65540];
|
||||
|
||||
int dfs(int start) {
|
||||
if (nodes_visited[start] >= 1) {
|
||||
// nodes_visited[start] = 2;
|
||||
return 0;
|
||||
}
|
||||
nodes_visited[start] = 1;
|
||||
for (int j = pos[start]; j < pos[start + 1]; j++) {
|
||||
edges[j].used_in_dfs = dfs(edges[j].end);
|
||||
}
|
||||
return 1;
|
||||
}
|
||||
|
||||
int dfs_with_dead_edge(int start, int dead_edge_start, int dead_edge_end) {
|
||||
if (nodes_visited[start] >= 1) {
|
||||
return 0;
|
||||
}
|
||||
nodes_visited[start] = 1;
|
||||
if (start == dead_edge_start) {
|
||||
for (int j = pos[start]; j < pos[start + 1]; j++) {
|
||||
if (edges[j].end == dead_edge_end) {
|
||||
continue;
|
||||
}
|
||||
dfs_with_dead_edge(edges[j].end, dead_edge_start, dead_edge_end);
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
for (int j = pos[start]; j < pos[start + 1]; j++) {
|
||||
dfs_with_dead_edge(edges[j].end, dead_edge_start, dead_edge_end);
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
int main() {
|
||||
int N, M;
|
||||
scanf("%d %d", &N, &M);
|
||||
int total_edge = 0;
|
||||
for (int start = 0; start < N; start++) {
|
||||
pos[start] = total_edge;
|
||||
int edge_count;
|
||||
scanf("%d", &edge_count);
|
||||
for (int j = 0; j < edge_count; j++) {
|
||||
unsigned short terminal;
|
||||
scanf("%hu", &terminal);
|
||||
edges[pos[start] + j] = Edge{terminal, false};
|
||||
}
|
||||
total_edge += edge_count;
|
||||
}
|
||||
pos[N] = total_edge;
|
||||
|
||||
dfs(0);
|
||||
|
||||
for (int i = 0; i < N; i++) {
|
||||
if (nodes_visited[i] < 1) {
|
||||
// Not connected!
|
||||
for (int j = 0; j <= M; j++) {
|
||||
printf("0\n");
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
|
||||
printf("1\n");
|
||||
|
||||
for (int i = 0; i < M; i++) {
|
||||
int start, end;
|
||||
scanf("%d %d", &start, &end);
|
||||
for (int j = pos[start]; j < pos[start + 1]; j++) {
|
||||
if (edges[j].end == end) {
|
||||
if (edges[j].used_in_dfs) {
|
||||
for (int k = 0; k < N; k++) {
|
||||
nodes_visited[k] = 0;
|
||||
}
|
||||
dfs_with_dead_edge(0, start, end);
|
||||
|
||||
bool connected = true;
|
||||
for (int k = 0; k < N; k++) {
|
||||
if (nodes_visited[k] < 1) {
|
||||
connected = false;
|
||||
break;
|
||||
}
|
||||
}
|
||||
if (connected) {
|
||||
printf("1\n");
|
||||
}
|
||||
else {
|
||||
printf("0\n");
|
||||
}
|
||||
}
|
||||
else {
|
||||
printf("1\n");
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
@@ -1,5 +0,0 @@
|
||||
4 2 2 1 2 2 2 3 0 1 0 0 1 0 2
|
||||
|
||||
4 1 1 1 2 2 3 2 1 3 2 1 2 0 1
|
||||
|
||||
4 1 1 1 2 2 3 2 1 3 2 1 2 1 2
|
||||
@@ -1,21 +0,0 @@
|
||||
#include <stdio.h>
|
||||
int stairs[100000] = {0};
|
||||
int M, K, H;
|
||||
long long total = 0;
|
||||
|
||||
int main() {
|
||||
scanf("%d %d %d", &M , &K, &H);
|
||||
// stairs = new int[M];
|
||||
for (int i = 0; i < M ; i++) {
|
||||
scanf("%d", &stairs[i]);
|
||||
}
|
||||
for (int i = 0; i < M; i++) {
|
||||
for (int j = i + 1; j <= i + K && j < M; j++) {
|
||||
if (stairs[j] <= ((long long)stairs[i]) + H && stairs[j] >= stairs[i] - H) {
|
||||
total++;
|
||||
}
|
||||
}
|
||||
}
|
||||
printf("%lld\n", total);
|
||||
return 0;
|
||||
}
|
||||
@@ -1,9 +0,0 @@
|
||||
import random
|
||||
size = 1000
|
||||
arr = list(range(0, size))
|
||||
random.shuffle(arr)
|
||||
with open("random_num.txt", 'w') as f:
|
||||
f.write("%d\n" % size)
|
||||
for i in arr:
|
||||
f.write("%d " % i)
|
||||
f.write('\n')
|
||||
@@ -1,35 +0,0 @@
|
||||
#include <stdio.h>
|
||||
int* stairs = NULL;
|
||||
bool* visited = NULL;
|
||||
int M, K, H;
|
||||
long long total = 0;
|
||||
|
||||
int dfs(int start) {
|
||||
if (visited[start]) {
|
||||
return 0;
|
||||
}
|
||||
visited[start] = true;
|
||||
for (int i = 1; start + i < M && i <= K; i++) {
|
||||
if (((stairs[start + i] - stairs[start]) < 0 ? stairs[start] - stairs[start + i] : stairs[start + i] - stairs[start]) <= H) {
|
||||
total++;
|
||||
dfs(start + i);
|
||||
}
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
int main() {
|
||||
scanf("%d %d %d", &M , &K, &H);
|
||||
stairs = new int[M];
|
||||
visited = new bool[M];
|
||||
for (int i = 0; i < M ; i++) {
|
||||
scanf("%d", &stairs[i]);
|
||||
}
|
||||
for (int i = 0; i < M; i++) {
|
||||
if (!visited[i]) {
|
||||
dfs(i);
|
||||
}
|
||||
}
|
||||
printf("%lld\n", total);
|
||||
return 0;
|
||||
}
|
||||
@@ -1,2 +0,0 @@
|
||||
10 5 1
|
||||
2 3 8 0 1 7 9 5 6 4
|
||||
140
2023206/main.cpp
140
2023206/main.cpp
@@ -1,140 +0,0 @@
|
||||
#include <stdio.h>
|
||||
#define TREE_SIZE 65536
|
||||
#define NOTHING 65535
|
||||
struct TreeNode {
|
||||
// int val;
|
||||
unsigned short size;
|
||||
unsigned short left;
|
||||
unsigned short right;
|
||||
};
|
||||
|
||||
TreeNode tree[TREE_SIZE] = {0};
|
||||
int vals[TREE_SIZE] = {0};
|
||||
int tree_root = NOTHING;
|
||||
int M, K, H;
|
||||
long long total = 0;
|
||||
int l = 0;
|
||||
|
||||
int insert_node(int num, int pos) {
|
||||
if (pos == NOTHING) {
|
||||
// The tree_root is -1!
|
||||
tree[l % K] = TreeNode{1, NOTHING, NOTHING};
|
||||
tree_root = l % K;
|
||||
vals[l % K] = num;
|
||||
return l % K;
|
||||
}
|
||||
tree[pos].size++;
|
||||
if (vals[pos] > num) {
|
||||
if (tree[pos].left == NOTHING) {
|
||||
tree[pos].left = l % K;
|
||||
tree[l % K] = TreeNode{1, NOTHING, NOTHING};
|
||||
vals[l % K] = num;
|
||||
return l % K;
|
||||
}
|
||||
else {
|
||||
return insert_node(num, tree[pos].left);
|
||||
}
|
||||
}
|
||||
else {
|
||||
if (tree[pos].right == NOTHING) {
|
||||
tree[pos].right = l % K;
|
||||
tree[l % K] = TreeNode{1, NOTHING, NOTHING};
|
||||
vals[l % K] = num;
|
||||
return l % K;
|
||||
}
|
||||
else {
|
||||
return insert_node(num, tree[pos].right);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
int delete_node(int num, int pos) {
|
||||
if (pos == NOTHING) {
|
||||
return NOTHING;
|
||||
}
|
||||
|
||||
if (vals[pos] < num) {
|
||||
tree[pos].size--;
|
||||
tree[pos].right = delete_node(num, tree[pos].right);
|
||||
return pos;
|
||||
}
|
||||
|
||||
if (vals[pos] > num) {
|
||||
tree[pos].size--;
|
||||
tree[pos].left = delete_node(num, tree[pos].left);
|
||||
return pos;
|
||||
}
|
||||
|
||||
// If reached here, tree[pos].val == num, so we are going to delete tree[pos]
|
||||
if (tree[pos].left == NOTHING) {
|
||||
// The case when left is null, right is something
|
||||
// and also the case when both left and right is null
|
||||
return tree[pos].right;
|
||||
}
|
||||
|
||||
if (tree[pos].right == NOTHING) {
|
||||
// The case when left is something while right is null
|
||||
return tree[pos].left;
|
||||
}
|
||||
|
||||
// Here, we deal with the case that both children exist.
|
||||
int parent = pos;
|
||||
int child = tree[parent].right;
|
||||
tree[parent].size--;
|
||||
while (tree[child].left < NOTHING) {
|
||||
parent = child;
|
||||
child = tree[child].left;
|
||||
tree[parent].size--;
|
||||
}
|
||||
|
||||
if (parent == pos) {
|
||||
tree[parent].right = tree[child].right;
|
||||
}
|
||||
else {
|
||||
tree[parent].left = tree[child].right;
|
||||
}
|
||||
|
||||
tree[child].left = tree[pos].left;
|
||||
tree[child].right = tree[pos].right;
|
||||
tree[child].size = tree[pos].size;
|
||||
return child;
|
||||
}
|
||||
|
||||
int count_less_than(long long target, int pos) {
|
||||
if (pos == NOTHING) {
|
||||
return 0;
|
||||
}
|
||||
|
||||
if (vals[pos] < target) {
|
||||
if (tree[pos].left == NOTHING) {
|
||||
return 1 + count_less_than(target, tree[pos].right);
|
||||
}
|
||||
return tree[tree[pos].left].size + 1 + count_less_than(target, tree[pos].right);
|
||||
}
|
||||
if (vals[pos] > target) {
|
||||
return count_less_than(target, tree[pos].left);
|
||||
}
|
||||
|
||||
if (tree[pos].left == NOTHING) {
|
||||
return 1;
|
||||
}
|
||||
return 1 + tree[tree[pos].left].size;
|
||||
}
|
||||
|
||||
int main() {
|
||||
scanf("%d %d %d", &M, &K, &H);
|
||||
int num = 0;
|
||||
|
||||
for (l = 0; l < M; l++) {
|
||||
scanf("%d", &num);
|
||||
total += count_less_than(((long long)num) + H, tree_root) -
|
||||
count_less_than(num - H - 1, tree_root);
|
||||
if (l >= K) {
|
||||
tree_root = delete_node(vals[l % K], tree_root);
|
||||
}
|
||||
insert_node(num, tree_root);
|
||||
}
|
||||
|
||||
printf("%lld\n", total);
|
||||
return 0;
|
||||
}
|
||||
@@ -1,24 +0,0 @@
|
||||
import random
|
||||
import os
|
||||
# M = random.randint(10000, 100000)
|
||||
# K = random.randint(10000, 65536)
|
||||
# H = random.randint(10000, 100000)
|
||||
M = 10
|
||||
K = 5
|
||||
H = 1
|
||||
# arr = list(range(2147483647, 2147483647 - M, -1))
|
||||
arr = list(range(0, M))
|
||||
random.shuffle(arr)
|
||||
# print(arr)
|
||||
with open('fuck.txt', 'w') as f:
|
||||
f.write(str(M)+' '+str(K)+' '+str(H)+'\n')
|
||||
for i in arr:
|
||||
f.write(str(i)+' ')
|
||||
f.write('\n')
|
||||
|
||||
print("main")
|
||||
os.system("./main.out < ./fuck.txt")
|
||||
print("\ncorrect")
|
||||
os.system("./correct.out < ./fuck.txt")
|
||||
print("\nbrute_force")
|
||||
os.system("./brute_force.out < ./fuck.txt")
|
||||
@@ -1,2 +0,0 @@
|
||||
1000
|
||||
358 987 347 875 110 505 59 179 361 313 616 286 516 886 804 588 563 405 325 277 75 879 759 626 768 812 279 123 910 36 747 837 399 833 456 255 552 970 900 392 734 238 750 69 646 329 219 443 551 997 520 321 539 121 924 789 320 206 957 650 491 10 241 666 698 998 326 919 752 565 999 979 978 228 447 515 170 351 342 51 809 434 365 107 835 773 455 124 281 531 381 220 362 379 70 817 80 925 692 424 60 258 24 229 9 263 546 207 587 118 623 777 985 642 885 210 317 257 580 410 975 870 652 712 996 645 482 226 722 242 908 981 850 249 920 272 858 751 65 723 649 628 993 673 16 418 844 195 86 388 140 297 887 715 584 793 915 604 283 481 597 374 366 776 428 93 8 468 923 204 945 785 132 994 792 493 991 303 472 569 644 631 918 76 878 847 685 115 324 264 341 547 716 214 223 555 851 166 868 470 145 836 622 517 94 225 327 657 795 909 178 838 150 477 101 621 108 895 158 794 308 3 962 14 586 245 745 82 19 702 521 956 859 611 694 842 690 968 244 763 854 727 18 535 688 537 824 877 545 840 980 346 190 658 239 37 976 40 533 807 973 458 831 253 578 188 705 825 892 704 921 724 269 757 336 312 371 971 32 498 713 558 243 582 155 56 684 606 159 142 15 417 686 591 811 853 445 963 955 149 105 490 943 423 681 215 89 469 78 527 672 415 830 391 659 217 530 929 959 986 504 344 148 20 268 791 299 917 394 935 765 187 147 782 989 114 711 461 674 474 502 860 637 282 761 772 676 939 899 977 529 154 420 216 969 952 931 446 291 567 710 880 180 305 68 454 278 561 756 104 348 309 288 697 579 419 230 48 663 79 96 964 861 703 743 294 205 608 274 668 175 648 857 821 938 307 431 42 103 250 164 682 669 97 513 466 385 556 12 396 401 614 436 805 863 601 803 251 81 280 965 726 134 240 495 607 95 169 296 21 661 67 942 406 191 471 234 203 814 566 173 452 799 398 665 873 185 413 796 156 526 914 285 47 640 806 818 152 151 740 762 35 576 633 271 800 593 478 61 425 335 881 227 662 643 883 786 720 944 528 356 323 708 953 2 100 514 383 459 755 200 380 54 808 213 828 542 893 508 874 636 958 435 742 463 820 827 696 731 797 512 441 90 450 338 615 500 872 790 328 695 73 664 386 63 967 564 444 940 231 486 581 102 725 898 585 829 605 741 613 91 218 247 701 192 819 345 774 902 778 49 52 571 174 699 562 823 252 138 568 315 311 575 350 387 680 72 596 389 760 871 153 143 122 360 440 157 400 654 653 354 261 125 246 865 619 131 46 116 106 638 739 475 630 927 660 194 314 890 988 209 85 784 172 411 29 934 501 560 693 866 370 888 736 221 1 186 373 66 161 402 259 359 894 771 484 677 438 813 479 617 352 160 948 598 922 906 679 815 896 34 430 427 889 319 610 426 266 852 903 31 783 196 583 5 990 737 113 306 671 882 839 343 408 687 480 592 488 775 117 330 208 916 41 766 714 369 290 826 548 810 235 483 651 248 845 522 449 930 961 111 262 437 135 781 432 109 509 675 721 543 554 728 717 559 384 748 11 541 577 984 23 718 624 758 532 310 595 834 146 634 77 538 382 780 949 442 422 334 764 510 43 974 733 224 237 176 92 273 719 709 162 316 496 907 4 620 744 201 553 749 706 494 788 211 933 536 126 867 397 912 632 691 232 911 639 136 534 869 167 503 599 798 465 841 267 378 589 139 462 412 27 58 519 137 439 433 71 376 304 492 506 127 849 656 864 129 395 683 50 972 404 932 289 655 770 284 730 609 855 13 946 141 144 363 298 457 7 992 26 182 954 45 476 163 951 295 848 30 212 473 746 753 393 802 83 544 499 612 17 982 574 594 600 84 901 355 331 523 337 133 570 995 276 339 87 540 557 120 460 590 0 497 448 112 926 897 966 767 832 518 905 603 409 801 947 184 332 74 453 421 816 647 884 28 367 292 372 256 236 707 64 489 550 573 602 44 856 524 936 39 822 57 700 353 22 375 862 625 641 260 98 572 177 198 390 735 403 891 941 928 233 913 667 635 130 33 275 729 618 368 364 779 53 222 99 270 340 357 670 128 549 429 507 88 407 300 678 414 843 197 904 377 451 787 485 62 349 25 511 960 416 168 950 171 846 769 754 464 876 302 983 689 467 38 318 265 732 487 333 627 119 165 189 199 322 55 254 525 738 937 301 181 6 183 193 293 629 287 202
|
||||
@@ -1,9 +0,0 @@
|
||||
#include <stdio.h>
|
||||
#include <assert.h>
|
||||
|
||||
int main() {
|
||||
int m, k, h;
|
||||
scanf("%d %d %d", &m, &k, &h);
|
||||
assert(m < 100000);
|
||||
return 0;
|
||||
}
|
||||
@@ -1,28 +0,0 @@
|
||||
9 5 2
|
||||
6 8 5 7 4 3 9 2 10
|
||||
|
||||
9 5 2 6 8 5 7 4 3 9 2 10
|
||||
|
||||
ans: 14
|
||||
|
||||
9 5 2 -6 -8 -5 -7 -4 -3 -9 -2 -10
|
||||
|
||||
15 2 2
|
||||
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
|
||||
|
||||
15 2 2
|
||||
15 14 13 12 11 10 9 8 7 6 5 4 3 2 1
|
||||
|
||||
15 20 2
|
||||
15 14 13 12 11 10 9 8 7 6 5 4 3 2 1
|
||||
|
||||
10 5 1
|
||||
2147483639 2147483647 2147483641 2147483645 2147483643 2147483640 2147483642 2147483638 2147483644 2147483646
|
||||
|
||||
10 5 1
|
||||
2 10 4 8 6 3 5 1 7 9
|
||||
|
||||
10 5 1
|
||||
5 3 6 7 4 1 9 2 0 8
|
||||
|
||||
10 5 1 5 3 6 7 4 1 9 2 0 8
|
||||
@@ -1,9 +0,0 @@
|
||||
3
|
||||
3 2
|
||||
44 62
|
||||
44 43 30
|
||||
3 34
|
||||
27 63 53
|
||||
14 52 19
|
||||
|
||||
3 3 2 44 62 44 43 30 3 34 27 63 53 14 52 19
|
||||
150
2023207/main.cpp
150
2023207/main.cpp
@@ -1,150 +0,0 @@
|
||||
#include <math.h>
|
||||
#include <stdio.h>
|
||||
int p = 0;
|
||||
int m = 0, n = 0;
|
||||
double A[5][10000], Z[10000];
|
||||
|
||||
double get_content(int row, int column) {
|
||||
if (abs(row - column) > p / 2) {
|
||||
return 0;
|
||||
}
|
||||
if (row < 0 || row >= n) {
|
||||
return 0;
|
||||
}
|
||||
if (column < 0 || column >= n) {
|
||||
return 0;
|
||||
}
|
||||
return A[(row - column + p / 2)][column];
|
||||
}
|
||||
|
||||
int set_content(int row, int column, double val) {
|
||||
if (abs(row - column) > p / 2) {
|
||||
return 0;
|
||||
}
|
||||
if (row < 0 || row >= n) {
|
||||
return 0;
|
||||
}
|
||||
if (column < 0 || column >= n) {
|
||||
return 0;
|
||||
}
|
||||
A[(row - column + p / 2)][column] = val;
|
||||
return 0;
|
||||
}
|
||||
|
||||
// int output() {
|
||||
// for (int i = 0; i < p; i++) {
|
||||
// for (int j = 0; j < n; j++) {
|
||||
// printf("%lf ", get_content(i, j));
|
||||
// }
|
||||
// printf("\n");
|
||||
// }
|
||||
// printf("\n");
|
||||
// return 0;
|
||||
// }
|
||||
|
||||
int outputZ() {
|
||||
for (int i = 0; i < n; i++) {
|
||||
printf("%.4lf ", Z[i]);
|
||||
}
|
||||
printf("\n");
|
||||
return 0;
|
||||
}
|
||||
|
||||
int main() {
|
||||
scanf("%d", &p);
|
||||
scanf("%d %d", &n, &m);
|
||||
for (int i = 0; i < p / 2; i++) {
|
||||
for (int j = p / 2 - i; j < n; j++) {
|
||||
scanf("%lf", &A[i][j]);
|
||||
}
|
||||
}
|
||||
for (int i = p / 2; i < p; i++) {
|
||||
for (int j = 0; j < n - (i - p / 2); j++) {
|
||||
scanf("%lf", &A[i][j]);
|
||||
}
|
||||
}
|
||||
|
||||
// printf("Readin\n");
|
||||
// output();
|
||||
|
||||
for (int col = 0; col < n; col++) {
|
||||
double diag_elem = get_content(col, col);
|
||||
// make everything below the diag to 0 row by row
|
||||
for (int row = col + 1; row < n; row++) {
|
||||
double base = get_content(row, col);
|
||||
if (base != 0) {
|
||||
double coefficient = base / diag_elem;
|
||||
set_content(row, col, -coefficient);
|
||||
for (int l = col + 1; l < col + 3; l++) {
|
||||
set_content(row, l, get_content(row, l) - coefficient * get_content(col, l));
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// printf("L ready\n");
|
||||
// output();
|
||||
|
||||
for (int row = 0; row < n; row++) {
|
||||
double diag_elem = get_content(row, row);
|
||||
set_content(row, row, 1 / diag_elem);
|
||||
for (int col = row + 1; col < n; col++) {
|
||||
set_content(row, col, -get_content(row, col) / diag_elem);
|
||||
}
|
||||
}
|
||||
|
||||
// printf("All ready\n");
|
||||
// output();
|
||||
|
||||
for (int i = 0; i < m; i++) {
|
||||
// read in one col of z
|
||||
for (int j = 0; j < n; j++) {
|
||||
scanf("%lf", &Z[j]);
|
||||
}
|
||||
|
||||
// printf("Readin\n");
|
||||
// outputZ();
|
||||
|
||||
// calculate Z = L-1 * Z
|
||||
// do this column by column
|
||||
for (int j = 0; j < n; j++) {
|
||||
// diag of U is always 1, z[j] * U[j][j] = z[j], so k doesn't have to equal to j
|
||||
for (int k = j + 1; k < j + 3 && k < n; k++) {
|
||||
Z[k] += Z[j] * get_content(k, j);
|
||||
}
|
||||
}
|
||||
|
||||
// printf("L-1 * Z\n");
|
||||
// outputZ();
|
||||
|
||||
// calculate Z = D-1 * Z
|
||||
for (int j = 0; j < n; j++) {
|
||||
Z[j] = Z[j] * get_content(j, j);
|
||||
}
|
||||
|
||||
// printf("D-1 L-1 * Z\n");
|
||||
// outputZ();
|
||||
|
||||
// calculate Z = U-1 * Z
|
||||
// do this column by column
|
||||
// printf("Starting U-1\n");
|
||||
for (int j = n - 1; j >= 0; j--) {
|
||||
// diag of U is always 1, z[j] * U[j][j] = z[j], so k doesn't have to equal to j
|
||||
for (int k = j - 1; k > j - 3 && k >= 0; k--) {
|
||||
Z[k] += Z[j] * get_content(k, j);
|
||||
}
|
||||
// outputZ();
|
||||
}
|
||||
|
||||
// printf("U-1 D-1 L-1 * Z\n");
|
||||
// outputZ();
|
||||
|
||||
// output
|
||||
// for (int j = 0; j < n; j++) {
|
||||
// printf("%.4lf ", Z[j]);
|
||||
// }
|
||||
// printf("\n");
|
||||
outputZ();
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
179
2023208/main.cpp
179
2023208/main.cpp
@@ -1,179 +0,0 @@
|
||||
#include <math.h>
|
||||
#include <stdio.h>
|
||||
#define EPSILON 1e-6
|
||||
|
||||
double A[5051] = {0};
|
||||
double point_xs[101] = {0};
|
||||
int valid_point_num = 0;
|
||||
double t[101] = {0};
|
||||
int n, m;
|
||||
|
||||
double get_num(int row, int col) {
|
||||
if (col > row) {
|
||||
return 0;
|
||||
}
|
||||
return A[row * (row + 1) / 2 + col];
|
||||
}
|
||||
|
||||
double set_num(int row, int col, double content) {
|
||||
if (col > row) {
|
||||
return 0;
|
||||
}
|
||||
return A[row * (row + 1) / 2 + col] = content;
|
||||
}
|
||||
|
||||
bool compare_double(long double a, long double b) {
|
||||
return (a - b > 0 ? a - b : -(a - b)) < EPSILON;
|
||||
}
|
||||
|
||||
double evaluate(double x, int highest) {
|
||||
double ans = get_num(highest, highest);
|
||||
for (int j = highest - 1; j >= 0; j--) {
|
||||
ans *= x - point_xs[j];
|
||||
ans += get_num(j, j);
|
||||
}
|
||||
return ans;
|
||||
}
|
||||
|
||||
double evaluate_2(double x, int highest) {
|
||||
double ans = t[highest];
|
||||
for (int j = highest - 1; j >= 0; j--) {
|
||||
ans *= x - point_xs[j];
|
||||
ans += t[j];
|
||||
}
|
||||
return ans;
|
||||
}
|
||||
|
||||
int display_mat() {
|
||||
for (int i = 0; i < valid_point_num; i++) {
|
||||
for (int j = 0; j < valid_point_num; j++) {
|
||||
printf("%lf ", get_num(i, j));
|
||||
}
|
||||
printf("\n");
|
||||
}
|
||||
printf("\n");
|
||||
return 0;
|
||||
}
|
||||
|
||||
int main_2() {
|
||||
double read_x, read_y;
|
||||
bool found_duplicate = false;
|
||||
for (int i = 0; i < n; i++) {
|
||||
scanf("%lf %lf", &read_x, &read_y);
|
||||
for (int j = 0; j < valid_point_num; j++) {
|
||||
if (compare_double(read_x, point_xs[valid_point_num])) {
|
||||
found_duplicate = true;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if (!found_duplicate) {
|
||||
point_xs[valid_point_num] = read_x;
|
||||
t[valid_point_num] = read_y;
|
||||
valid_point_num++;
|
||||
}
|
||||
}
|
||||
|
||||
// Prepare the matrix
|
||||
for (int row = 0; row < valid_point_num; row++) {
|
||||
set_num(row, 0, 1);
|
||||
for (int col = 1; col <= row; col++) {
|
||||
set_num(row, col, get_num(row, col - 1) * (point_xs[row] - point_xs[col - 1]));
|
||||
}
|
||||
}
|
||||
|
||||
// Solve for t
|
||||
for (int row = 0; row < valid_point_num; row++) {
|
||||
for (int i = 0; i < row; i++) {
|
||||
t[row] -= t[i] * get_num(row, i);
|
||||
}
|
||||
if (!compare_double(t[row], 0)) {
|
||||
t[row] /= get_num(row, row);
|
||||
}
|
||||
else {
|
||||
t[row] = 0;
|
||||
}
|
||||
}
|
||||
|
||||
// Find for highest exponent
|
||||
int highest = valid_point_num - 1;
|
||||
for (; highest >= 0; highest--) {
|
||||
if (!compare_double(t[highest], 0)) {
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
printf("%d\n", highest);
|
||||
|
||||
// Evaluate
|
||||
for (int i = 0; i < m; i++) {
|
||||
double to_be_evaled = 0;
|
||||
scanf("%lf", &to_be_evaled);
|
||||
printf("%lf\n", evaluate_2(to_be_evaled, highest));
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
int main_1() {
|
||||
for (int i = 0; i < n; i++) {
|
||||
bool found_duplicate = false;
|
||||
double read_x, read_y;
|
||||
scanf("%lf %lf", &read_x, &read_y);
|
||||
for (int j = 0; j < valid_point_num; j++) {
|
||||
if (compare_double(read_x, point_xs[j])) {
|
||||
found_duplicate = true;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if (!found_duplicate) {
|
||||
point_xs[valid_point_num] = read_x;
|
||||
set_num(valid_point_num, 0, read_y);
|
||||
valid_point_num++;
|
||||
}
|
||||
}
|
||||
|
||||
// Go create the full table
|
||||
for (int col = 1; col < valid_point_num; col++) {
|
||||
int delta = col;
|
||||
for (int row = col; row < valid_point_num; row++) {
|
||||
set_num(row, col,
|
||||
(get_num(row, col - 1) - get_num(row - 1, col - 1)) /
|
||||
(point_xs[row] - point_xs[row - delta]));
|
||||
}
|
||||
if (compare_double(get_num(col, col) / 1000, 0)) {
|
||||
set_num(col, col, 0);
|
||||
}
|
||||
// display_mat();
|
||||
}
|
||||
|
||||
// Find the highest
|
||||
int highest = valid_point_num - 1;
|
||||
for (; highest >= 0; highest--) {
|
||||
if (compare_double(get_num(highest, highest) / 1000, 0)) {
|
||||
continue;
|
||||
}
|
||||
break;
|
||||
}
|
||||
|
||||
printf("%d\n", highest);
|
||||
|
||||
double to_be_evaled = 0;
|
||||
for (int i = 0; i < m; i++) {
|
||||
scanf("%lf", &to_be_evaled);
|
||||
printf("%lf\n", evaluate(to_be_evaled, highest));
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
int main() {
|
||||
scanf("%d %d", &n, &m);
|
||||
if (n > 50) {
|
||||
main_2();
|
||||
}
|
||||
else {
|
||||
main_1();
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
@@ -1,124 +0,0 @@
|
||||
#include <stdio.h>
|
||||
#define EPSILON 1e-6
|
||||
struct Point {
|
||||
double x, y;
|
||||
};
|
||||
|
||||
double A[101][101] = {0};
|
||||
Point points[101] = {0};
|
||||
int valid_point_num = 0;
|
||||
int n = 0, m = 0;
|
||||
|
||||
int display_matrix() {
|
||||
for (int i = 0; i < valid_point_num; i++) {
|
||||
for (int j = 0; j < valid_point_num; j++) {
|
||||
printf("%lf ", A[i][j]);
|
||||
}
|
||||
printf("| %lf\n", points[i].y);
|
||||
}
|
||||
printf("\n");
|
||||
return 0;
|
||||
}
|
||||
|
||||
int display_result_vec() {
|
||||
for (int i = 0; i < valid_point_num; i++) {
|
||||
printf("%lf ", points[i].x);
|
||||
}
|
||||
|
||||
printf("\n");
|
||||
return 0;
|
||||
}
|
||||
|
||||
bool compare_double(double a, double b) {
|
||||
return (a - b > 0 ? a - b : -(a - b)) < EPSILON;
|
||||
}
|
||||
|
||||
double evaluate(double x, int highest) {
|
||||
double ans = points[highest].x;
|
||||
for (int i = highest + 1; i < valid_point_num; i++) {
|
||||
ans *= x;
|
||||
ans += points[i].x;
|
||||
}
|
||||
return ans;
|
||||
}
|
||||
|
||||
int main() {
|
||||
// freopen("lambdaeight19.in", "r", stdin);
|
||||
scanf("%d %d", &n, &m);
|
||||
for (int i = 0; i < n; i++) {
|
||||
bool found_duplicate = false;
|
||||
double read_x, read_y;
|
||||
scanf("%lf %lf", &read_x, &read_y);
|
||||
for (int j = 0; j < valid_point_num; j++) {
|
||||
if (compare_double(read_x, points[j].x)) {
|
||||
found_duplicate = true;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if (!found_duplicate) {
|
||||
points[valid_point_num++] = Point {read_x, read_y};
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
// vandermonde matrix
|
||||
for (int i = 0; i < valid_point_num; i++) {
|
||||
A[i][n - 1] = 1;
|
||||
for (int j = valid_point_num - 2; j >= 0; j--) {
|
||||
A[i][j] = points[i].x * A[i][j + 1];
|
||||
}
|
||||
}
|
||||
|
||||
// display_matrix();
|
||||
|
||||
// Gauss
|
||||
for (int col = 0; col < valid_point_num; col++) {
|
||||
for (int row = col + 1; row < valid_point_num; row++) {
|
||||
if (compare_double(A[col][col], 0)) {
|
||||
continue;
|
||||
}
|
||||
double coeff = - A[row][col] / A[col][col];
|
||||
A[row][col] = 0;
|
||||
for (int i = col + 1; i < valid_point_num; i++) {
|
||||
A[row][i] += coeff * A[col][i];
|
||||
}
|
||||
points[row].y += coeff * points[col].y;
|
||||
}
|
||||
// display_matrix();
|
||||
}
|
||||
|
||||
// Solve for x
|
||||
for (int i = valid_point_num - 1; i >= 0; i--) {
|
||||
for (int j = valid_point_num - 1; j > i; j--) {
|
||||
points[i].y -= points[j].x * A[i][j];
|
||||
}
|
||||
if (compare_double(points[i].y, 0)) {
|
||||
points[i].x = 0;
|
||||
} else {
|
||||
points[i].x = points[i].y / A[i][i];
|
||||
}
|
||||
// display_result_vec();
|
||||
}
|
||||
|
||||
// display_result_vec();
|
||||
|
||||
// Find highest
|
||||
int highest = 0;
|
||||
for (int i = 0; i < valid_point_num; i++) {
|
||||
if (!compare_double(points[i].x, 0)) {
|
||||
highest = i;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
printf("%d\n", valid_point_num - 1 - highest);
|
||||
|
||||
//Evaluate
|
||||
for (int i = 0; i < m; i++) {
|
||||
double to_be_evaled = 0;
|
||||
scanf("%lf", &to_be_evaled);
|
||||
printf("%lf\n", evaluate(to_be_evaled, highest));
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
@@ -1,2 +0,0 @@
|
||||
4 5 0 1 1 1 0 2 4 2 1 2 1 5 1 3 4 2 2 3 1 1 0 3 4
|
||||
4 5 0 1 1 1 1 2 1 5 1 3 4 2 2 0 4 2 2 3 1 1 0 3 4
|
||||
164
2023209/main.cpp
164
2023209/main.cpp
@@ -1,164 +0,0 @@
|
||||
#include <stdio.h>
|
||||
#include <queue>
|
||||
#include <functional>
|
||||
|
||||
struct Point {
|
||||
unsigned short name;
|
||||
int known_shortest;
|
||||
int time;
|
||||
|
||||
Point(int _name, int _known_shortest, int _time): name(_name), known_shortest(_known_shortest), time(_time) {}
|
||||
|
||||
Point() {};
|
||||
};
|
||||
|
||||
template <class T>
|
||||
struct compare_point {
|
||||
bool operator()(T &a, T &b) {
|
||||
return a.known_shortest < b.known_shortest;
|
||||
}
|
||||
};
|
||||
struct Edge{
|
||||
unsigned short end, time, cost;
|
||||
};
|
||||
|
||||
int N, M;
|
||||
unsigned short edges[1050000][3] = {0};
|
||||
// 边是否顺序? 按开始点排序
|
||||
// 时间限制最大是多少? 超过unsigned short
|
||||
int head[66000] = {0};
|
||||
unsigned short start = 0, terminal = 0;
|
||||
int time_limit = 0;
|
||||
int path[1000] = {0};
|
||||
int current_cheap = 2147483647;
|
||||
Edge edges_dij[1050000] = {0};
|
||||
bool included[66000] = {0};
|
||||
Point points[66000];
|
||||
|
||||
int dfs(unsigned short cur, int cur_time, int cur_cost, int path_ptr) {
|
||||
path[path_ptr] = cur;
|
||||
if (cur_time > time_limit) {
|
||||
return 0;
|
||||
}
|
||||
|
||||
if (cur_cost > current_cheap) {
|
||||
return 0;
|
||||
}
|
||||
|
||||
if (cur == terminal) {
|
||||
if (cur_cost < current_cheap) {
|
||||
current_cheap = cur_cost;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
for (int i = head[cur]; i < head[cur + 1]; i++) {
|
||||
for (int j = 0; j < path_ptr; j++) {
|
||||
if (path[j] == edges[i][0]) {
|
||||
continue;
|
||||
}
|
||||
}
|
||||
dfs(edges[i][0], cur_time + edges[i][1], cur_cost + edges[i][2], path_ptr + 1);
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
int dijkstra() {
|
||||
std::priority_queue<Point, std::vector<Point>, compare_point<Point>> q;
|
||||
for (int i = 0; i < N; i++) {
|
||||
points[i] = Point{(unsigned short) i, 2147483647, 2147483647};
|
||||
// q.push(points[i]);
|
||||
}
|
||||
|
||||
|
||||
|
||||
// points[start].known_shortest = 0;
|
||||
q.emplace(start, 0, 0);
|
||||
|
||||
while (!q.empty()) {
|
||||
Point current = q.top();
|
||||
q.pop();
|
||||
if (current.name == terminal) {
|
||||
printf("%d\n", current.known_shortest);
|
||||
break;
|
||||
}
|
||||
for (int i = head[current.name]; i < head[current.name + 1]; i++) {
|
||||
int new_time = current.time + edges_dij[i].time;
|
||||
int new_cost = current.known_shortest + edges_dij[i].cost;
|
||||
if (new_time > time_limit) {
|
||||
continue;
|
||||
}
|
||||
if (new_cost < points[edges_dij[i].end].known_shortest) {
|
||||
q.emplace(edges_dij[i].end, new_cost, new_time);
|
||||
points[edges_dij[i].end].known_shortest = new_cost;
|
||||
points[edges_dij[i].end].time = new_time < points[edges_dij[i].end].time ? new_time : points[edges_dij[i].end].time;
|
||||
}
|
||||
else if (new_time < points[edges_dij[i].end].time) {
|
||||
q.emplace(edges_dij[i].end, new_cost, new_time);
|
||||
points[edges_dij[i].end].time = new_time;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
int main() {
|
||||
scanf("%d %d", &N, &M);
|
||||
if (N < 50000) {
|
||||
head[0] = 0;
|
||||
int next_empty_edge = 0;
|
||||
int current_start = 0;
|
||||
for (int i = 0; i < M; i++) {
|
||||
int from, to, time, cost;
|
||||
scanf("%d %d %d %d", &from, &to, &time, &cost);
|
||||
if (from != current_start) {
|
||||
for (int j = current_start + 1; j <= from; j++) {
|
||||
head[j] = next_empty_edge;
|
||||
}
|
||||
current_start = from;
|
||||
// head[from] = next_empty_edge;
|
||||
}
|
||||
edges[next_empty_edge][0] = to;
|
||||
edges[next_empty_edge][1] = time;
|
||||
edges[next_empty_edge][2] = cost;
|
||||
next_empty_edge++;
|
||||
}
|
||||
head[++current_start] = next_empty_edge;
|
||||
scanf("%hu %hu %d", &start, &terminal, &time_limit);
|
||||
|
||||
dfs(start, 0, 0, 0);
|
||||
if (current_cheap == 2147483647) {
|
||||
printf("-1\n");
|
||||
return 0;
|
||||
}
|
||||
printf("%d\n", current_cheap);
|
||||
return 0;
|
||||
}
|
||||
else {
|
||||
head[0] = 0;
|
||||
int next_empty_edge = 0;
|
||||
int current_start = 0;
|
||||
for (int i = 0; i < M; i++) {
|
||||
unsigned short from, to, time, cost;
|
||||
scanf("%hu %hu %hu %hu", &from, &to, &time, &cost);
|
||||
if (from != current_start) {
|
||||
for (int j = current_start + 1; j <= from; j++) {
|
||||
head[j] = next_empty_edge;
|
||||
}
|
||||
current_start = from;
|
||||
// head[from] = next_empty_edge;
|
||||
}
|
||||
// edges[next_empty_edge][0] = to;
|
||||
// edges[next_empty_edge][1] = time;
|
||||
// edges[next_empty_edge][2] = cost;
|
||||
edges_dij[next_empty_edge] = Edge{to, time, cost};
|
||||
next_empty_edge++;
|
||||
}
|
||||
head[++current_start] = next_empty_edge;
|
||||
scanf("%hu %hu %d", &start, &terminal, &time_limit);
|
||||
|
||||
dijkstra();
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
@@ -1 +0,0 @@
|
||||
3 3 1 1 2 1 2 3 10 3 4
|
||||
181
2023210/main.cpp
181
2023210/main.cpp
@@ -1,181 +0,0 @@
|
||||
#include <stdio.h>
|
||||
|
||||
struct CalcResult {
|
||||
int dim_status;
|
||||
int min_multiply_times;
|
||||
};
|
||||
|
||||
unsigned short *tensors;
|
||||
// unsigned short tensors[66000];
|
||||
int n = 0, k = 0;
|
||||
CalcResult *m;
|
||||
// CalcResult m[10000];
|
||||
// int* m;
|
||||
int dim_sizes[32] = {0};
|
||||
|
||||
// int precalc[2][1048576] = {0};
|
||||
|
||||
inline int tensor_pos(int num, int dim) {
|
||||
return k * num + dim;
|
||||
}
|
||||
|
||||
inline int setm(int i, int j, int num) {
|
||||
if (j <= i) {
|
||||
return 0;
|
||||
}
|
||||
|
||||
return m[i * n + j].min_multiply_times = num;
|
||||
}
|
||||
|
||||
inline int getm(int i, int j) {
|
||||
if (j <= i) {
|
||||
return 0;
|
||||
}
|
||||
|
||||
return m[i * n + j].min_multiply_times;
|
||||
}
|
||||
|
||||
inline int setmdim(int i, int j, int d) {
|
||||
if (j < i) {
|
||||
return 0;
|
||||
}
|
||||
|
||||
return m[i * n + j].dim_status = d;
|
||||
}
|
||||
|
||||
inline int getmdim(int i, int j) {
|
||||
if (j < i) {
|
||||
return 0;
|
||||
}
|
||||
|
||||
return m[i * n + j].dim_status;
|
||||
}
|
||||
|
||||
int find_min(int start, int end) {
|
||||
if (start == end || getm(start, end) != 0) {
|
||||
return getm(start, end);
|
||||
}
|
||||
|
||||
int min = 2147483647;
|
||||
int needed_multiply_by_d = 1;
|
||||
int dim_status = getmdim(start, end);
|
||||
|
||||
// prepare the dims
|
||||
for (int i = 0; i < k - 2; i++) {
|
||||
if ((dim_status >> i) & 1) {
|
||||
needed_multiply_by_d *= dim_sizes[i];
|
||||
}
|
||||
}
|
||||
// for (int i = 0; i <= (k - 2) / 16; i++) {
|
||||
// needed_multiply_by_d *= precalc[i][(dim_status >> (16 * i)) & 0xffff];
|
||||
// }
|
||||
|
||||
for (int split_pos = start; split_pos < end; split_pos++) {
|
||||
int total_needed = tensors[tensor_pos(start, k - 2)] *
|
||||
tensors[tensor_pos(split_pos, k - 1)] * tensors[tensor_pos(end, k - 1)] *
|
||||
needed_multiply_by_d;
|
||||
int left = find_min(start, split_pos), right = find_min(split_pos + 1, end);
|
||||
total_needed += left + right;
|
||||
if (total_needed < min) {
|
||||
min = total_needed;
|
||||
}
|
||||
}
|
||||
|
||||
setm(start, end, min);
|
||||
return min;
|
||||
}
|
||||
|
||||
int clac_min() {
|
||||
for (int i = 0; i < n; i++) {
|
||||
setm(i, i, 0);
|
||||
}
|
||||
|
||||
for (int length = 1; length <= n; length++) {
|
||||
for (int start = 0; start <= n - length; start++) {
|
||||
int min = 2147483647;
|
||||
int needed_multiply_by_d = 1;
|
||||
int dim_status = getmdim(start, start + length);
|
||||
|
||||
// prepare the dims
|
||||
for (int i = 0; i < k - 2; i++) {
|
||||
if ((dim_status >> i) & 1) {
|
||||
needed_multiply_by_d *= dim_sizes[i];
|
||||
}
|
||||
}
|
||||
|
||||
int matrix_partial_needed = tensors[tensor_pos(start, k - 2)] *
|
||||
tensors[tensor_pos(start + length, k - 1)] * needed_multiply_by_d;
|
||||
|
||||
for (int split = 0; split < length; split++) {
|
||||
int total_needed = matrix_partial_needed * tensors[tensor_pos(start + split, k - 1)] + getm(start, start + split) + getm(start + split + 1, start + length);
|
||||
if (total_needed < min) {
|
||||
min = total_needed;
|
||||
}
|
||||
}
|
||||
setm(start, start + length, min);
|
||||
}
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
void preparedim(int length) {
|
||||
if (length == 1) {
|
||||
for (int i = 0; i < n; i++) {
|
||||
int cur_stat = 0;
|
||||
for (int j = 0; j < k - 2; j++) {
|
||||
if (tensors[tensor_pos(i, j)] != 1) {
|
||||
cur_stat |= 1 << j;
|
||||
}
|
||||
}
|
||||
setmdim(i, i, cur_stat);
|
||||
}
|
||||
return;
|
||||
}
|
||||
|
||||
preparedim(length - 1);
|
||||
for (int i = length - 1; i < n; i++) {
|
||||
setmdim(i - length + 1, i, getmdim(i - length + 1, i - 1) | getmdim(i, i));
|
||||
}
|
||||
}
|
||||
|
||||
int main() {
|
||||
scanf("%d %d", &n, &k);
|
||||
tensors = new unsigned short[n * k];
|
||||
// m = new CalcResult[(n + 1) * n / 2];
|
||||
m = new CalcResult[n * n];
|
||||
|
||||
for (int i = 0; i < 32; i++) {
|
||||
dim_sizes[i] = 1;
|
||||
}
|
||||
// m = new int[(n + 1) * n / 2];
|
||||
for (int tensor_count = 0; tensor_count < n; tensor_count++) {
|
||||
for (int dim = 0; dim < k; dim++) {
|
||||
scanf("%hu", &tensors[tensor_pos(tensor_count, dim)]);
|
||||
if (tensors[tensor_pos(tensor_count, dim)] != 1) {
|
||||
dim_sizes[dim] = tensors[tensor_pos(tensor_count, dim)];
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// for (int i = 0; i < 2; i++) {
|
||||
// for (int j = 0; j < 0xffff; j++) {
|
||||
// int prod = 1;
|
||||
// for (int r = 0; r < 16; r++) {
|
||||
// if ((j >> r) & 1) {
|
||||
// prod *= dim_sizes[i * 16 + r];
|
||||
// }
|
||||
// }
|
||||
// precalc[i][j] = prod;
|
||||
// }
|
||||
// }
|
||||
|
||||
preparedim(n);
|
||||
|
||||
// printf("%d\n", find_min(0, n - 1));
|
||||
|
||||
clac_min();
|
||||
printf("%d\n", getm(0, n - 1));
|
||||
|
||||
return 0;
|
||||
}
|
||||
168
csapp/csapp.h
168
csapp/csapp.h
@@ -1,168 +0,0 @@
|
||||
/* $begin csapp.h */
|
||||
#ifndef __CSAPP_H__
|
||||
#define __CSAPP_H__
|
||||
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <unistd.h>
|
||||
#include <string.h>
|
||||
#include <ctype.h>
|
||||
#include <setjmp.h>
|
||||
#include <signal.h>
|
||||
#include <sys/time.h>
|
||||
#include <sys/types.h>
|
||||
#include <sys/wait.h>
|
||||
#include <sys/stat.h>
|
||||
#include <fcntl.h>
|
||||
#include <sys/mman.h>
|
||||
#include <errno.h>
|
||||
#include <math.h>
|
||||
#include <pthread.h>
|
||||
#include <semaphore.h>
|
||||
#include <sys/socket.h>
|
||||
#include <netdb.h>
|
||||
#include <netinet/in.h>
|
||||
#include <arpa/inet.h>
|
||||
|
||||
|
||||
/* Default file permissions are DEF_MODE & ~DEF_UMASK */
|
||||
/* $begin createmasks */
|
||||
#define DEF_MODE S_IRUSR|S_IWUSR|S_IRGRP|S_IWGRP|S_IROTH|S_IWOTH
|
||||
#define DEF_UMASK S_IWGRP|S_IWOTH
|
||||
/* $end createmasks */
|
||||
|
||||
/* Simplifies calls to bind(), connect(), and accept() */
|
||||
/* $begin sockaddrdef */
|
||||
typedef struct sockaddr SA;
|
||||
/* $end sockaddrdef */
|
||||
|
||||
/* Persistent state for the robust I/O (Rio) package */
|
||||
/* $begin rio_t */
|
||||
#define RIO_BUFSIZE 8192
|
||||
typedef struct {
|
||||
int rio_fd; /* Descriptor for this internal buf */
|
||||
int rio_cnt; /* Unread bytes in internal buf */
|
||||
char *rio_bufptr; /* Next unread byte in internal buf */
|
||||
char rio_buf[RIO_BUFSIZE]; /* Internal buffer */
|
||||
} rio_t;
|
||||
/* $end rio_t */
|
||||
|
||||
/* External variables */
|
||||
// extern int h_errno; /* Defined by BIND for DNS errors */
|
||||
extern char **environ; /* Defined by libc */
|
||||
|
||||
/* Misc constants */
|
||||
#define MAXLINE 8192 /* Max text line length */
|
||||
#define MAXBUF 8192 /* Max I/O buffer size */
|
||||
#define LISTENQ 1024 /* Second argument to listen() */
|
||||
|
||||
/* Our own error-handling functions */
|
||||
void unix_error(char *msg);
|
||||
void posix_error(int code, char *msg);
|
||||
void dns_error(char *msg);
|
||||
void app_error(char *msg);
|
||||
|
||||
/* Process control wrappers */
|
||||
pid_t Fork(void);
|
||||
void Execve(const char *filename, char *const argv[], char *const envp[]);
|
||||
pid_t Wait(int *status);
|
||||
pid_t Waitpid(pid_t pid, int *iptr, int options);
|
||||
void Kill(pid_t pid, int signum);
|
||||
unsigned int Sleep(unsigned int secs);
|
||||
void Pause(void);
|
||||
unsigned int Alarm(unsigned int seconds);
|
||||
void Setpgid(pid_t pid, pid_t pgid);
|
||||
pid_t Getpgrp();
|
||||
|
||||
/* Signal wrappers */
|
||||
typedef void handler_t(int);
|
||||
handler_t *Signal(int signum, handler_t *handler);
|
||||
void Sigprocmask(int how, const sigset_t *set, sigset_t *oldset);
|
||||
void Sigemptyset(sigset_t *set);
|
||||
void Sigfillset(sigset_t *set);
|
||||
void Sigaddset(sigset_t *set, int signum);
|
||||
void Sigdelset(sigset_t *set, int signum);
|
||||
int Sigismember(const sigset_t *set, int signum);
|
||||
|
||||
/* Unix I/O wrappers */
|
||||
int Open(const char *pathname, int flags, mode_t mode);
|
||||
ssize_t Read(int fd, void *buf, size_t count);
|
||||
ssize_t Write(int fd, const void *buf, size_t count);
|
||||
off_t Lseek(int fildes, off_t offset, int whence);
|
||||
void Close(int fd);
|
||||
int Select(int n, fd_set *readfds, fd_set *writefds, fd_set *exceptfds,
|
||||
struct timeval *timeout);
|
||||
int Dup2(int fd1, int fd2);
|
||||
void Stat(const char *filename, struct stat *buf);
|
||||
void Fstat(int fd, struct stat *buf) ;
|
||||
|
||||
/* Memory mapping wrappers */
|
||||
void *Mmap(void *addr, size_t len, int prot, int flags, int fd, off_t offset);
|
||||
void Munmap(void *start, size_t length);
|
||||
|
||||
/* Standard I/O wrappers */
|
||||
void Fclose(FILE *fp);
|
||||
FILE *Fdopen(int fd, const char *type);
|
||||
char *Fgets(char *ptr, int n, FILE *stream);
|
||||
FILE *Fopen(const char *filename, const char *mode);
|
||||
void Fputs(const char *ptr, FILE *stream);
|
||||
size_t Fread(void *ptr, size_t size, size_t nmemb, FILE *stream);
|
||||
void Fwrite(const void *ptr, size_t size, size_t nmemb, FILE *stream);
|
||||
|
||||
/* Dynamic storage allocation wrappers */
|
||||
void *Malloc(size_t size);
|
||||
void *Realloc(void *ptr, size_t size);
|
||||
void *Calloc(size_t nmemb, size_t size);
|
||||
void Free(void *ptr);
|
||||
|
||||
/* Sockets interface wrappers */
|
||||
int Socket(int domain, int type, int protocol);
|
||||
void Setsockopt(int s, int level, int optname, const void *optval, int optlen);
|
||||
void Bind(int sockfd, struct sockaddr *my_addr, int addrlen);
|
||||
void Listen(int s, int backlog);
|
||||
int Accept(int s, struct sockaddr *addr, socklen_t *addrlen);
|
||||
void Connect(int sockfd, struct sockaddr *serv_addr, int addrlen);
|
||||
|
||||
/* DNS wrappers */
|
||||
struct hostent *Gethostbyname(const char *name);
|
||||
struct hostent *Gethostbyaddr(const char *addr, int len, int type);
|
||||
|
||||
/* Pthreads thread control wrappers */
|
||||
void Pthread_create(pthread_t *tidp, pthread_attr_t *attrp,
|
||||
void * (*routine)(void *), void *argp);
|
||||
void Pthread_join(pthread_t tid, void **thread_return);
|
||||
void Pthread_cancel(pthread_t tid);
|
||||
void Pthread_detach(pthread_t tid);
|
||||
void Pthread_exit(void *retval);
|
||||
pthread_t Pthread_self(void);
|
||||
void Pthread_once(pthread_once_t *once_control, void (*init_function)());
|
||||
|
||||
/* POSIX semaphore wrappers */
|
||||
void Sem_init(sem_t *sem, int pshared, unsigned int value);
|
||||
void P(sem_t *sem);
|
||||
void V(sem_t *sem);
|
||||
|
||||
/* Rio (Robust I/O) package */
|
||||
ssize_t rio_readn(int fd, void *usrbuf, size_t n);
|
||||
ssize_t rio_writen(int fd, void *usrbuf, size_t n);
|
||||
void rio_readinitb(rio_t *rp, int fd);
|
||||
ssize_t rio_readnb(rio_t *rp, void *usrbuf, size_t n);
|
||||
ssize_t rio_readlineb(rio_t *rp, void *usrbuf, size_t maxlen);
|
||||
|
||||
/* Wrappers for Rio package */
|
||||
ssize_t Rio_readn(int fd, void *usrbuf, size_t n);
|
||||
void Rio_writen(int fd, void *usrbuf, size_t n);
|
||||
void Rio_readinitb(rio_t *rp, int fd);
|
||||
ssize_t Rio_readnb(rio_t *rp, void *usrbuf, size_t n);
|
||||
ssize_t Rio_readlineb(rio_t *rp, void *usrbuf, size_t maxlen);
|
||||
|
||||
/* Client/server helper functions */
|
||||
int open_clientfd(char *hostname, int portno);
|
||||
int open_listenfd(int portno);
|
||||
|
||||
/* Wrappers for client/server helper functions */
|
||||
int Open_clientfd(char *hostname, int port);
|
||||
int Open_listenfd(int port);
|
||||
|
||||
#endif /* __CSAPP_H__ */
|
||||
/* $end csapp.h */
|
||||
23
csapp/fork.c
23
csapp/fork.c
@@ -1,23 +0,0 @@
|
||||
// #include <iostream>
|
||||
// #include <unistd.h>
|
||||
// #include <sys/wait.h>
|
||||
// #include <signal.h>
|
||||
// #include <stdio.h>
|
||||
// #include <stdlib.h>
|
||||
// #include <fcntl.h>
|
||||
|
||||
#include "csapp.h"
|
||||
|
||||
|
||||
int main(int argc, char** argv) {
|
||||
int fd1, fd2, fd3;
|
||||
char *fname = argv[1];
|
||||
fd1 = open(fname, O_CREAT | O_TRUNC | O_RDWR, S_IRUSR |S_IWUSR);
|
||||
write(fd1, "pqrs", 4);
|
||||
fd3 = open(fname, O_APPEND | O_WRONLY, 0);
|
||||
write(fd3, "jklmn", 5);
|
||||
fd2 = dup(fd1);
|
||||
write(fd2, "wxyz", 4);
|
||||
write(fd3, "ef", 2);
|
||||
return 0;
|
||||
}
|
||||
22
fork.cpp
22
fork.cpp
@@ -1,22 +0,0 @@
|
||||
#include <iostream>
|
||||
#include <unistd.h>
|
||||
#include <sys/wait.h>
|
||||
|
||||
int main() {
|
||||
std::cout << "wo shi ni die" << std::endl;
|
||||
pid_t pid;
|
||||
int result;
|
||||
for (int i = 0; i < 1024; i++) {
|
||||
if ((pid = fork()) == 0) {
|
||||
std::cout << "child #" << i << std::endl;
|
||||
exit(i);
|
||||
// return 0;
|
||||
}
|
||||
else {
|
||||
waitpid(pid, &result, 0);
|
||||
}
|
||||
std::cout << "child #" << i << " exited with code" << WEXITSTATUS(result) << std::endl;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
Reference in New Issue
Block a user