dienbien_online
Junior Member
Ai có mấy bài về ghép cặp đăng lên giải chơi
Hmm, nghĩ kỹ thì việc biến đổi input là 1 cái side-effect của cái function, nên yeah, fen nói cũng có lýBác có thể giải thích thêm về Arrays.sort được không? Bác sort lại mảng thì ý nghĩa của mảng vẫn là chứa các dữ liệu, chỉ thay đổi vị trí các phần tử. Còn trong bài kia thì dùng mảng input như mảng đánh dấu là thay đổi hoàn toàn ý nghĩa của mảng rồi.
Lời giải:
#include <cstdio>
#include <cstdlib>
#include <cmath>
#include <cstring>
#include <iostream>
#include <algorithm>
#include <memory.h>
#include <vector>
#include <iomanip>
#include <string>
#include <map>
#include <queue>
#include <set>
#include <ctime>
#include <functional>
#define pb push_back
#define mk make_pair
#define sqr(N) ((N)*(N))
#define F first
#define S second
#define maxn 101010
using namespace std;
typedef long long ll;
vector < int > g[maxn], d;
int i, n, b[maxn], e[maxn], add[maxn], ans;
void dfs(int x, int pr, int lv, int add1, int add2) {
if(lv == 0) b[x] = (b[x] + add2) % 2;
else b[x] = (b[x] + add1) % 2;
if(b[x] != e[x]) {
d.pb(x);
ans++;
if(lv == 0) add2++;
else add1++;
}
for(int i = 0; i < g[x].size(); i++)
if(g[x][i] != pr) {
dfs(g[x][i], x, 1 - lv, add1, add2);
}
}
int main(){
#ifndef ONLINE_JUDGE
freopen("input.txt", "r", stdin);
freopen("output.txt", "w", stdout);
#endif
scanf("%d", &n);
for(i = 1; i < n; i++) {
int a, b;
scanf("%d %d", &a, &b);
g[a].pb(b);
g[b].pb(a);
}
for(i = 1; i <= n; i++) scanf("%d", b + i);
for(i = 1; i <= n; i++) scanf("%d", e + i);
dfs(1, -1, 0, 0, 0);
printf("%d\n", ans);
for(i = 0; i < d.size(); i++) printf("%d\n", d[i]);
return 0;
}
sao lại cần phải có dòng if(g[x] != pr) là sao nhỉ, tui đọc lời giải với code mãi ko hiểu dòng này
ờ ha, cái đơn giản vậy mà quên mất ), tks fen, cứ tưởng nó bỏ qua một sub tree có giá trị root bằng pre nữaĐây là do khi DFS trên cây thì mình phải check để không đi ngược lại cạnh vừa đi. pr là parent đó bác.
luyện algo là luyện tư duy lập trình, mindset để có thể tạo hướng đi trong việc giải quyết vấn đề, mấy cái mà mình đang làm hiện tại đều là tư duy lập trình tạo ra solution cho các problems, có thể hiện tại không cần dùng đến những cái cao siêu, nhưng bản chất đều là giống nhau.Em thấy ở vn ít cty chú trọng về algo (trừ mấy cty lớn), em cũng đọc nhiều ý kiên trái chiều về việc nhiều người ko giỏi algo nhưng vẫn làm được việc do họ học nhiều về tech. Mấy bác có ý kiến như thế nào về vấn đề này nhỉ, em đang luyện leetcode mà thông tin nhiễu loạn quá.
Vấn đề nào cũng có nhiều luồng ý kiến trái chiều nhau thôi bạn ơi.Em thấy ở vn ít cty chú trọng về algo (trừ mấy cty lớn), em cũng đọc nhiều ý kiên trái chiều về việc nhiều người ko giỏi algo nhưng vẫn làm được việc do họ học nhiều về tech. Mấy bác có ý kiến như thế nào về vấn đề này nhỉ, em đang luyện leetcode mà thông tin nhiễu loạn quá.
Mà phương pháp sinh tiếng anh là gì thế các thím? Tra gg không có raBài n quân hậu dùng thuật toán sinh để solve kiểu gì nhỉ các thím?
Permutation chăng ?Mà phương pháp sinh tiếng anh là gì thế các thím? Tra gg không có ra
Quy hoạch động nha thím, backtrackingBài n quân hậu dùng thuật toán sinh để solve kiểu gì nhỉ các thím?
Born algorithmMà phương pháp sinh tiếng anh là gì thế các thím? Tra gg không có ra
thím kiên trì thật, :c em 6 lần submit sai là bỏ cuộc rồixem Output, submit chục lần sai, giải được 1 bài lv 1k7 luôn, ảo quá, mọi người thử đi ;v
https://codeforces.com/contest/202/problem/C
thím kiên trì thật, :c em 6 lần submit sai là bỏ cuộc rồi
GIỜ THÌ TÔI ĐÃ HIỂU TẠI SAO BÀI TOÁN NHẢM NHÍ NÀY LẠI NHIỀU DISLIKE THẾLevel: medium
Không sử dụng toán tử nhân, chia, chia lấy số dư, hãy lập trình hàm tính thương của 2 số nguyên đầu vào
Đáp số phải là một số nguyên, nghĩa là toàn bộ phần thập phân (nếu có) của đáp số sẽ bị bỏ
Ví dụ: 8,345 -> 8; -2,7335 -> -2
Lưu ý: giả sử rằng ta đang thực hiện trên nền tảng 32bit, nghĩa là signed int trả về có giới hạn từ [−2^31, 2^31 − 1]. Do đó, hãy quy ước rằng hàm sẽ trả về kết quả "2^31 − 1" nếu kết quả phép chia đi quá giới hạn.
Hạn chế:
số bị chia, số chia sẽ nằm trong khoảng [−2^31, 2^31 − 1]
số chia khác 0
https://leetcode.com/problems/divide-two-integers/
Không liên quan chứ dis mạnh thế?
View attachment 741571
class Solution {
public:
int bit_size(int arg)
{
// count the number of bits the argument is using
int count = 0;
while(arg > 0)
{
count++;
arg = arg >> 1;
}
return count;
}
void bit_modify(int& arg, int position, int value)
{
// change the bit value at #position to value (0 or 1)
int bitset = 1 << position;
int val = (value != 0) ? 1 : 0;
arg = ((arg & ~bitset) | (val << position));
}
int bit_value(int arg, int position) // get bit value at #position
{
return (arg >> position) & 1;
}
int divide(int dividend, int divisor) {
if(dividend == 0) return 0;
if(divisor == INT_MIN)
{
if(dividend == INT_MIN)
{
return 1;
}
else
{
return 0;
}
}
if(dividend == INT_MIN)
{
if(divisor == INT_MIN)
{
return 1;
}
else if(divisor > 0)
{
int result = divide(dividend + divisor, divisor);
return (result > INT_MIN) ? result - 1 : INT_MIN;
}
else
{
int result = divide(dividend - divisor, divisor);
return (result < INT_MAX) ? result + 1 : INT_MAX;
}
}
if(std::abs(dividend) < std::abs(divisor))
{
return 0;
}
bool negative;
if((dividend >= 0 && divisor < 0) || (dividend < 0 && divisor > 0))
{
negative = true;
}
else
{
negative = false;
}
int N = std::abs(dividend); // numerator
int D = std::abs(divisor); // denominator
int R = NULL; //remainder
int Q = NULL; //quotient
/**************************/
for(int i = bit_size(N) - 1; i >= 0; i--)
{
R = R << 1;
bit_modify(R, 0, bit_value(N, i));
if(R >= D)
{
R = R - D;
bit_modify(Q, i, 1);
}
}
return (negative == false) ? Q : -Q;
}
};
who are you?GIỜ THÌ TÔI ĐÃ HIỂU TẠI SAO BÀI TOÁN NHẢM NHÍ NÀY LẠI NHIỀU DISLIKE THẾ
Bài toán xàm lông đã chơi giới hạn độ phức tạp thuật toán, giới hạn luôn cả toán tử rồi mà còn giới hạn nốt 32bit int only Mà nó giới hạn unsigned không còn đỡ, đây nó đã chơi signed int thì thuật toán trừ trừ Euclid truyền thống các kiểu dẹp hết. Và để thêm phần ức chế thì phải hơn 1/3 test case là xài giá trị INT_MIN, trong khi giá trị tuyệt đối abs(int min) - abs(int max) = 1, nghĩa là nếu convert từ int min sang số dương thì sẽ gặp lỗi, các hàm abs trên ví dụ cho vui chứ thật ra cũng vứt sọt rác với bài toán nhảm nhí này
Anyway, sau cả 1 buổi chiều rảnh rỗi try hard thì tôi đã dứt điểm được bài toán rẻ rách này với một tý trợ giúp từ wikipedia
View attachment 805274C++:class Solution { public: int bit_size(long int arg) { // count the number of bits the argument is using int count = 0; while(arg > 0) { count++; arg = arg >> 1; } return count; } void bit_modify(long int& arg, int position, int value) { // change the bit value at #position to value (0 or 1) int bitset = 1 << position; int val = (value != 0) ? 1 : 0; arg = ((arg & ~bitset) | (val << position)); } int divide(int dividend, int divisor) { if(dividend == 0 || std::abs(dividend) < std::abs(divisor)) return 0; bool negative; if((dividend >= 0 && divisor < 0) || (dividend < 0 && divisor > 0)) { negative = true; } else { negative = false; } long int N = std::abs(dividend); // numerator long int D = std::abs(divisor); // denominator long int R = N; //remainder long int Q = NULL; //quotient /**************************/ D = D << bit_size(N); for(int i = bit_size(N) - 1; i >= 0; i--) { R = R << 1; R = R - D; if(R >= 0) { bit_modify(Q, i, 1); } else { bit_modify(Q, i, 0); R = R + D; } } if(Q >= INT_MAX && negative == false) return INT_MAX; if(Q >= INT_MAX && negative == true) return INT_MIN; return (negative == false) ? Q : -Q; } };