Diff
checker
텍스트
텍스트
이미지
문서
Excel
폴더
Legal
Enterprise
데스크톱
요금제
로그인
데스크톱 앱 다운로드
텍스트 비교
두 텍스트 파일의 차이점을 찾아보세요
도구
기록
실시간 편집
변경 없는 행 숨기기
줄바꿈 비활성화
레이아웃
나란히 보기
합쳐 보기
비교 단위
스마트
단어
글자
구문 강조
언어 선택
제외
텍스트 변환
첫 변경으로
수정
Diffchecker Desktop
가장 안전하게 Diffchecker를 사용하는 방법. 데스크톱 앱을 사용하면 비교 데이터가 외부로 전송되지 않습니다!
데스크톱 앱 받기
Untitled diff
생성일
10년 전
비교 결과 만료 없음
초기화
내보내기
공유
설명
12 삭제
행
총
삭제
글자
총
삭제
이 기능을 계속 사용하려면 업그레이드해 주세요
Diff
checker
Pro
요금제 보기
136 행
복사
8 추가
행
총
추가
글자
총
추가
이 기능을 계속 사용하려면 업그레이드해 주세요
Diff
checker
Pro
요금제 보기
128 행
복사
#include <bits/stdc++.h>
#include <bits/stdc++.h>
using namespace std;
using namespace std;
#define error(args...) { vector<string> _v = split(#args, ','); err(_v.begin(), args); }
#define error(args...) { vector<string> _v = split(#args, ','); err(_v.begin(), args); }
vector<string> split(const string& s, char c) { vector<string> v; stringstream ss(s); string x; while (getline(ss, x, c)) v.push_back(move(x)); return v; }
vector<string> split(const string& s, char c) { vector<string> v; stringstream ss(s); string x; while (getline(ss, x, c)) v.push_back(move(x)); return v; }
void err(vector<string>::iterator it) {}
void err(vector<string>::iterator it) {}
template<typename T, typename... Args> void err(vector<string>::iterator it, T a, Args... args) { cerr << it->substr((*it)[0] == ' ', it->length()) << " = " << a << '\n'; err(++it, args...); }
template<typename T, typename... Args> void err(vector<string>::iterator it, T a, Args... args) { cerr << it->substr((*it)[0] == ' ', it->length()) << " = " << a << '\n'; err(++it, args...); }
#define MAXN 100013
#define MAXN 100013
#define MAXM 100013
#define MAXM 100013
#define MAXC 100013
#define MAXC 100013
#define MAXSQRT 320
#define MAXSQRT 320
int N, M;
int N, M;
int C[MAXN];
int C[MAXN];
vector<int> adj[MAXN];
vector<int> adj[MAXN];
int preorder[MAXN]; // where a node appears in preorder
int preorder[MAXN]; // where a node appears in preorder
int ID[MAXN]; // real value of a preorder index
int ID[MAXN]; // real value of a preorder index
int endofsubtree[MAXN]; // last element in preorder of subtree of this node
int endofsubtree[MAXN]; // last element in preorder of subtree of this node
int t = 0;
int t = 0;
int BL[MAXN];
int BL[MAXN];
struct query {
struct query {
int id, b, e, k;
int id, b, e, k;
bool operator<(query other) {
bool operator<(query other) {
return BL[b] == BL[other.b] ? e < other.e : BL[b] < BL[other.b];
return BL[b] == BL[other.b] ? e < other.e : BL[b] < BL[other.b];
}
}
} Q[MAXM];
} Q[MAXM];
int VAL[MAXN]; // mo stuff
int VAL[MAXN]; // mo stuff
복사
복사됨
복사
복사됨
bool VIS[MAXN];
int ANS[MAXM];
int ANS[MAXM];
struct fenwick {
struct fenwick {
int ar[MAXC] = {0};
int ar[MAXC] = {0};
int query(int idx) {
int query(int idx) {
int ans = 0;
int ans = 0;
for (int i = idx + 1; i > 0; i -= i & -i) {
for (int i = idx + 1; i > 0; i -= i & -i) {
ans += ar[i];
ans += ar[i];
}
}
return ans;
return ans;
}
}
void update(int idx, int x) {
void update(int idx, int x) {
for (int i = idx + 1; i < MAXC; i += i & -i) {
for (int i = idx + 1; i < MAXC; i += i & -i) {
ar[i] += x;
ar[i] += x;
}
}
}
}
} F;
} F;
void dfs(int n, int prev=-1) {
void dfs(int n, int prev=-1) {
preorder[n] = t++;
preorder[n] = t++;
ID[preorder[n]] = n;
ID[preorder[n]] = n;
for (int x : adj[n]) {
for (int x : adj[n]) {
if (x != prev) {
if (x != prev) {
dfs(x, n);
dfs(x, n);
}
}
}
}
endofsubtree[n] = t - 1;
endofsubtree[n] = t - 1;
}
}
복사
복사됨
복사
복사됨
inline void check(int x
) {
inline void check(int x
,
int
p
) {
int
prev = VAL[C[x]];
F.update(VAL[C[x]], -1);
if (VIS[x]
) {
VAL[C[x]] += p;
VAL[C[x]]--;
}
else {
VAL[C[x]]++;
}
VIS[x] ^= 1;
F.update(prev, -1);
F.update(VAL[C[x]], 1);
F.update(VAL[C[x]], 1);
}
}
void compute() {
void compute() {
int curB = Q[0].b, curE = Q[0].b - 1;
int curB = Q[0].b, curE = Q[0].b - 1;
for (int i = 0; i < M; i++) {
for (int i = 0; i < M; i++) {
query q = Q[i];
query q = Q[i];
// error(q.id, q.b, q.e);
// error(q.id, q.b, q.e);
복사
복사됨
복사
복사됨
while (curB > q.b) check(ID[--curB]
);
while (curB > q.b) check(ID[--curB]
, 1
);
while (curB < q.b) check(ID[curB++]
);
while (curB < q.b) check(ID[curB++]
, -1
);
while (curE > q.e) check(ID[curE--]
);
while (curE > q.e) check(ID[curE--]
, -1
);
while (curE < q.e) check(ID[++curE]
);
while (curE < q.e) check(ID[++curE]
, 1
);
ANS[q.id] = F.query(MAXC - 1) - F.query(q.k - 1);
ANS[q.id] = F.query(MAXC - 1) - F.query(q.k - 1);
}
}
}
}
int main() {
int main() {
ios_base::sync_with_stdio(false);
ios_base::sync_with_stdio(false);
cin.tie(0);
cin.tie(0);
// freopen("input.txt", "r", stdin);
// freopen("input.txt", "r", stdin);
// freopen("output.txt", "w", stdout);
// freopen("output.txt", "w", stdout);
cin >> N >> M;
cin >> N >> M;
for (int i = 0; i < N; i++) {
for (int i = 0; i < N; i++) {
cin >> C[i];
cin >> C[i];
}
}
// okee read in the edges
// okee read in the edges
for (int i = 0; i < N - 1; i++) {
for (int i = 0; i < N - 1; i++) {
int a, b;
int a, b;
cin >> a >> b;
cin >> a >> b;
a--; b--;
a--; b--;
adj[a].push_back(b);
adj[a].push_back(b);
adj[b].push_back(a);
adj[b].push_back(a);
}
}
dfs(0);
dfs(0);
int size = sqrt(N);
int size = sqrt(N);
for (int i = 0; i < N; i++) {
for (int i = 0; i < N; i++) {
BL[i] = i / size;
BL[i] = i / size;
}
}
for (int i = 0; i < M; i++) {
for (int i = 0; i < M; i++) {
int v, k;
int v, k;
cin >> v >> k; v--;
cin >> v >> k; v--;
Q[i].id = i;
Q[i].id = i;
Q[i].b = preorder[v];
Q[i].b = preorder[v];
Q[i].e = endofsubtree[v];
Q[i].e = endofsubtree[v];
Q[i].k = k;
Q[i].k = k;
}
}
sort(Q, Q + M);
sort(Q, Q + M);
compute();
compute();
for (int i = 0; i < M; i++) {
for (int i = 0; i < M; i++) {
cout << ANS[i] << '\n';
cout << ANS[i] << '\n';
}
}
cout.flush();
cout.flush();
return 0;
return 0;
}
}
저장된 비교 결과
원본
파일 열기
#include <bits/stdc++.h> using namespace std; #define error(args...) { vector<string> _v = split(#args, ','); err(_v.begin(), args); } vector<string> split(const string& s, char c) { vector<string> v; stringstream ss(s); string x; while (getline(ss, x, c)) v.push_back(move(x)); return v; } void err(vector<string>::iterator it) {} template<typename T, typename... Args> void err(vector<string>::iterator it, T a, Args... args) { cerr << it->substr((*it)[0] == ' ', it->length()) << " = " << a << '\n'; err(++it, args...); } #define MAXN 100013 #define MAXM 100013 #define MAXC 100013 #define MAXSQRT 320 int N, M; int C[MAXN]; vector<int> adj[MAXN]; int preorder[MAXN]; // where a node appears in preorder int ID[MAXN]; // real value of a preorder index int endofsubtree[MAXN]; // last element in preorder of subtree of this node int t = 0; int BL[MAXN]; struct query { int id, b, e, k; bool operator<(query other) { return BL[b] == BL[other.b] ? e < other.e : BL[b] < BL[other.b]; } } Q[MAXM]; int VAL[MAXN]; // mo stuff bool VIS[MAXN]; int ANS[MAXM]; struct fenwick { int ar[MAXC] = {0}; int query(int idx) { int ans = 0; for (int i = idx + 1; i > 0; i -= i & -i) { ans += ar[i]; } return ans; } void update(int idx, int x) { for (int i = idx + 1; i < MAXC; i += i & -i) { ar[i] += x; } } } F; void dfs(int n, int prev=-1) { preorder[n] = t++; ID[preorder[n]] = n; for (int x : adj[n]) { if (x != prev) { dfs(x, n); } } endofsubtree[n] = t - 1; } inline void check(int x) { int prev = VAL[C[x]]; if (VIS[x]) { VAL[C[x]]--; } else { VAL[C[x]]++; } VIS[x] ^= 1; F.update(prev, -1); F.update(VAL[C[x]], 1); } void compute() { int curB = Q[0].b, curE = Q[0].b - 1; for (int i = 0; i < M; i++) { query q = Q[i]; // error(q.id, q.b, q.e); while (curB > q.b) check(ID[--curB]); while (curB < q.b) check(ID[curB++]); while (curE > q.e) check(ID[curE--]); while (curE < q.e) check(ID[++curE]); ANS[q.id] = F.query(MAXC - 1) - F.query(q.k - 1); } } int main() { ios_base::sync_with_stdio(false); cin.tie(0); // freopen("input.txt", "r", stdin); // freopen("output.txt", "w", stdout); cin >> N >> M; for (int i = 0; i < N; i++) { cin >> C[i]; } // okee read in the edges for (int i = 0; i < N - 1; i++) { int a, b; cin >> a >> b; a--; b--; adj[a].push_back(b); adj[b].push_back(a); } dfs(0); int size = sqrt(N); for (int i = 0; i < N; i++) { BL[i] = i / size; } for (int i = 0; i < M; i++) { int v, k; cin >> v >> k; v--; Q[i].id = i; Q[i].b = preorder[v]; Q[i].e = endofsubtree[v]; Q[i].k = k; } sort(Q, Q + M); compute(); for (int i = 0; i < M; i++) { cout << ANS[i] << '\n'; } cout.flush(); return 0; }
수정본
파일 열기
#include <bits/stdc++.h> using namespace std; #define error(args...) { vector<string> _v = split(#args, ','); err(_v.begin(), args); } vector<string> split(const string& s, char c) { vector<string> v; stringstream ss(s); string x; while (getline(ss, x, c)) v.push_back(move(x)); return v; } void err(vector<string>::iterator it) {} template<typename T, typename... Args> void err(vector<string>::iterator it, T a, Args... args) { cerr << it->substr((*it)[0] == ' ', it->length()) << " = " << a << '\n'; err(++it, args...); } #define MAXN 100013 #define MAXM 100013 #define MAXC 100013 #define MAXSQRT 320 int N, M; int C[MAXN]; vector<int> adj[MAXN]; int preorder[MAXN]; // where a node appears in preorder int ID[MAXN]; // real value of a preorder index int endofsubtree[MAXN]; // last element in preorder of subtree of this node int t = 0; int BL[MAXN]; struct query { int id, b, e, k; bool operator<(query other) { return BL[b] == BL[other.b] ? e < other.e : BL[b] < BL[other.b]; } } Q[MAXM]; int VAL[MAXN]; // mo stuff int ANS[MAXM]; struct fenwick { int ar[MAXC] = {0}; int query(int idx) { int ans = 0; for (int i = idx + 1; i > 0; i -= i & -i) { ans += ar[i]; } return ans; } void update(int idx, int x) { for (int i = idx + 1; i < MAXC; i += i & -i) { ar[i] += x; } } } F; void dfs(int n, int prev=-1) { preorder[n] = t++; ID[preorder[n]] = n; for (int x : adj[n]) { if (x != prev) { dfs(x, n); } } endofsubtree[n] = t - 1; } inline void check(int x, int p) { F.update(VAL[C[x]], -1); VAL[C[x]] += p; F.update(VAL[C[x]], 1); } void compute() { int curB = Q[0].b, curE = Q[0].b - 1; for (int i = 0; i < M; i++) { query q = Q[i]; // error(q.id, q.b, q.e); while (curB > q.b) check(ID[--curB], 1); while (curB < q.b) check(ID[curB++], -1); while (curE > q.e) check(ID[curE--], -1); while (curE < q.e) check(ID[++curE], 1); ANS[q.id] = F.query(MAXC - 1) - F.query(q.k - 1); } } int main() { ios_base::sync_with_stdio(false); cin.tie(0); // freopen("input.txt", "r", stdin); // freopen("output.txt", "w", stdout); cin >> N >> M; for (int i = 0; i < N; i++) { cin >> C[i]; } // okee read in the edges for (int i = 0; i < N - 1; i++) { int a, b; cin >> a >> b; a--; b--; adj[a].push_back(b); adj[b].push_back(a); } dfs(0); int size = sqrt(N); for (int i = 0; i < N; i++) { BL[i] = i / size; } for (int i = 0; i < M; i++) { int v, k; cin >> v >> k; v--; Q[i].id = i; Q[i].b = preorder[v]; Q[i].e = endofsubtree[v]; Q[i].k = k; } sort(Q, Q + M); compute(); for (int i = 0; i < M; i++) { cout << ANS[i] << '\n'; } cout.flush(); return 0; }
비교하기