Skip to content

Commit fea2c1c

Browse files
committed
SRM 627
1 parent 600309c commit fea2c1c

File tree

8 files changed

+43
-35
lines changed

8 files changed

+43
-35
lines changed

TopCoder/SRM/627/500_BIT.png

86.7 KB
Loading

TopCoder/SRM/627/GraphInversions.cpp

Lines changed: 29 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -137,11 +137,28 @@ string i2s(int n) {
137137
// END CUT HERE
138138

139139
#define INF 1000000000
140+
#define MAXN 1005
140141

141142
int n, k, res;
142143
VVI mm;
143144
VI val;
144-
int used[1005], que[1005];
145+
int used[MAXN], sum[MAXN];
146+
147+
void update(int idx, int v) {
148+
while (idx <= MAXN) {
149+
sum[idx] += v;
150+
idx += (idx & -idx);
151+
}
152+
}
153+
154+
int total(int idx) {
155+
int t = 0;
156+
while (idx > 0) {
157+
t += sum[idx];
158+
idx -= (idx & -idx);
159+
}
160+
return t;
161+
}
145162

146163
class GraphInversions {
147164
public:
@@ -152,16 +169,16 @@ class GraphInversions {
152169
return;
153170
}
154171
REP(i,SZ(mm[cur])) {
155-
int next = mm[cur][i];
156-
if (used[next] == 1) continue;
157-
used[next] = 1;
158-
que[num] = next;
159-
int add = 0;
160-
REP(j,num) {
161-
if (val[next] < val[que[j]]) ++add;
172+
int prev = mm[cur][i];
173+
if (used[prev] == 0) {
174+
used[prev] = 1;
175+
int cur = val[prev];
176+
update(cur, 1);
177+
int add = total(cur - 1);
178+
dfs(prev, num + 1, sum + add);
179+
used[prev] = 0;
180+
update(cur, -1);
162181
}
163-
dfs(next, num + 1, sum + add);
164-
used[next] = 0;
165182
}
166183
}
167184
int getMinimumInversions(vector <int> A, vector <int> B, vector <int> V, int K) {
@@ -177,8 +194,9 @@ class GraphInversions {
177194
res = INF;
178195
REP(i,n) {
179196
CLR(used);
180-
que[0] = i;
197+
CLR(sum);
181198
used[i] = 1;
199+
update(val[i], 1);
182200
dfs(i, 1, 0);
183201
}
184202
if (res == INF) return -1;

TopCoder/SRM/627/HappyLetterDiv1.cpp

Lines changed: 10 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -141,40 +141,26 @@ class HappyLetterDiv1 {
141141
string getHappyLetters(string letters) {
142142
VI mm(26, 0);
143143
int len = letters.size();
144-
REP(i,len) {
145-
mm[letters[i] - 'a']++;
146-
}
144+
REP(i,len) mm[letters[i] - 'a']++;
147145
string res = "";
148-
146+
int m = (len & 1) ? 1 : 2;
147+
int r = (len - m) >> 1;
149148
REP(ch,26) {
150-
if (mm[ch] == 0) continue;
151-
bool isok = false;
152-
FOR(m,1,mm[ch]) {
153-
int cnt = len - m;
154-
if (cnt & 1) continue;
155-
VI tmp = mm;
156-
tmp[ch] = mm[ch] - m;
157-
bool flag = true;
158-
REP(i,26) {
159-
if (tmp[i] > (cnt / 2)) {
160-
flag = false;
161-
break;
162-
}
163-
}
164-
if (flag) {
165-
isok = true;
149+
if (mm[ch] < m) continue;
150+
bool isok = true;
151+
REP(i,26) {
152+
if (i == ch) continue;
153+
if (mm[i] > r) {
154+
isok = false;
166155
break;
167156
}
168157
}
169-
if (isok) {
170-
res += char(ch + 'a');
171-
}
158+
if (isok) res += char('a' + ch);
172159
}
173160

174161
SORT(res);
175162
return res;
176163
}
177-
178164
};
179165
// BEGIN CUT HERE
180166
int main() {

TopCoder/SRM/627/readme.txt

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
500_sub1.png no optimization
2+
500_sub2.png backtrack if current sum >= res
3+
500_sub3.png backtrack if current num >= k
4+
500_BIT.png using Binary Index Tree

0 commit comments

Comments
 (0)