Advertisement
Guest User

Untitled

a guest
Nov 23rd, 2017
369
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 58.34 KB | None | 0 0
  1. 23 noemvri
  2. 2D Segment Tree
  3.  
  4.  
  5. 28 septemvri
  6.  
  7. Josif's idea: line sweep on range tree on all xes for every y coordinate
  8. Make segment tree of segment trees. where leaf is a single y coordinate segment trees over x
  9. every internal node is the sum of the two segment trees in the children => O(log(n)^2) per query
  10.  
  11. root represents all x, all y: two children: A, B. Root has one more segmen tree in it where you can do any x query with -inf< y <inf range
  12. A represents all x, <Y/2, B represents all x, >Y/2
  13. A also has a tree that queries all x, -inf < y< Y/2
  14.  
  15.  
  16.  
  17.  
  18. //In July
  19. Hint za Sport: greedy za 30%
  20.  
  21. int main()
  22. {
  23. string a, b;
  24. cin >> a >> b;
  25. int n = a.size();
  26. int numA = 0, numB = 0;
  27. bool are_paired = true;
  28. for(int i=0;i<n;i++)
  29. {
  30. if(a[i]=='P')
  31. {
  32. numA++;
  33. }
  34. if(b[i]=='P')
  35. {
  36. numB++;
  37. }
  38. if(a[i]!=b[i])
  39. {
  40. are_paired = false;
  41. }
  42. }
  43. if(numA+numB == 2*n)
  44. {
  45. cout << -1;
  46. return 0;
  47. }
  48. else if(are_paired)
  49. {
  50. cout << numA <<endl;
  51. return 0;
  52. }
  53. else
  54. {
  55. cout << min(numA, numB)+1 <<endl;
  56. }
  57. return 0;
  58. }
  59.  
  60. 16 july
  61.  
  62.  
  63. http://codeforces.com/problemset/problem/86/D
  64. query
  65. https://www.hackerearth.com/practice/notes/mos-algorithm/
  66. a1, b1
  67. void add(int idx)
  68. cnt[idx] ++;
  69.  
  70. sort(a1.L / blockSize < b1.L / blockSize)
  71. a1.R < b1.R
  72. i++
  73. int mo_Left =0, mo_Right = -1;
  74. for(int i =0; i < q; i ++){
  75. int left = Q[i].L;
  76. int right = Q[i].R;
  77. while(moLeft < left)
  78. moLeft ++;
  79. add(moLeft);
  80. while(moLeft > left)
  81.  
  82. while(moRight > right)
  83.  
  84. while(moRight < right)
  85.  
  86.  
  87.  
  88.  
  89.  
  90. #include <fstream>
  91. #include <iomanip>
  92. #include <iostream>
  93.  
  94. #include <map>
  95. #include <set>
  96. #include <cmath>
  97. #include <queue>
  98. #include <stack>
  99. #include <math.h>
  100. #include <time.h>
  101. #include <string>
  102. #include <vector>
  103. #include <cstring>
  104. #include <cstdlib>
  105. #include <cassert>
  106. #include <algorithm>
  107.  
  108. #define P push
  109. #define f first
  110. #define s second
  111. #define pb push_back
  112. #define mp make_pair
  113. #define DEC 0.00000001
  114. #define MAX 2139062143
  115. #define MAX_63 1061109567
  116. #define MAXll 9187201950435737471
  117. #define bp(a) __builtin_popcount(a)
  118. #define rand(a, b) ((rand()%(b-a+1))+a)
  119. #define MEM(a, b) memset(a, b, sizeof(a))
  120. #define sort_v(a) sort(a.begin(), a.end())
  121. #define rev_v(a) reverse(a.begin(), a.end())
  122.  
  123. //#define fin cin
  124. //#define fout cout
  125. using namespace std;
  126. //ifstream fin(".in");
  127. //ofstream fout(".out");
  128.  
  129. #define set_bit(A,bit) (A|=(1<< (bit)))
  130. #define clear_bit(A,bit) ((A&=~(1 << (bit))))
  131. #define test_bit(A,bit) ((A&(1<<(bit)))!=0)
  132.  
  133. string s;
  134. string t;
  135.  
  136. int letters[27];
  137. vector<int> q;
  138. int main()
  139. {
  140. cin >> s;
  141. cin >> t;
  142. MEM(letters, 0);
  143. for(int i = 0;i<s.size();i++)
  144. {
  145. if(s[i]!='?')
  146. letters[s[i]-'0']++;
  147. else
  148. {
  149. q.pb(i);
  150. }
  151. }
  152. int possible = true;
  153. vector<char> kraj;
  154. while(possible)
  155. {
  156. for(int i = 0;i<t.size();i++)
  157. {
  158. if(letters[t[i]-'0']>0)
  159. {
  160. letters[t[i]-'0']--;
  161. }
  162. else
  163. {
  164. if(q.size()>kraj.size())
  165. {
  166. kraj.pb(t[i]);
  167. }
  168. else
  169. {
  170. possible = false;
  171. break;
  172. }
  173. }
  174. }
  175. }
  176. int kraj_at = 0;
  177. for(int i = 0;i<s.size();i++)
  178. {
  179. if(s[i]!='?')
  180. cout << s[i];
  181. else
  182. {
  183. cout << kraj[kraj_at];
  184. kraj_at++;
  185. }
  186. }
  187. cout << endl;
  188. return 0;
  189. }
  190.  
  191.  
  192. s: aza?
  193. t: az
  194.  
  195. a[]: 2
  196. z[]: 1
  197. ?[]: 1
  198.  
  199. construct: az,
  200.  
  201. a[]: 1
  202. z[]: 0
  203. ?[]: 1
  204.  
  205. construct: az:
  206.  
  207.  
  208. a[]: 0
  209. z[]: 0
  210. ?[]: 0
  211.  
  212. az
  213.  
  214.  
  215. 14 juni
  216. #include <iostream>
  217. using namespace std;
  218. typedef long long ll;
  219. int n, q;
  220. ll arr[100001];
  221. const ll inf = (1LL << 30ll);
  222. struct elem{
  223. ll prefSum, suffSum, sum, mxx;
  224. elem(){}
  225. elem(ll _p, ll _suff, ll _sum, ll _mxx){
  226. prefSum = _p;
  227. suffSum = _suff;
  228. sum = _sum;
  229. mxx = _mxx;
  230. }
  231. };
  232. elem mymerge(elem a, elem b){
  233. elem tmp;
  234. tmp.sum = a.sum + b.sum;
  235. tmp.prefSum = max(a.prefSum, a.sum + b.prefSum);
  236. tmp.suffSum = max(b.suffSum, b.sum + a.suffSum);
  237. tmp.mxx = max(tmp.sum, max(tmp.prefSum, max(tmp.suffSum, max(a.mxx, max(b.mxx, a.suffSum + b.prefSum)))));
  238. return tmp;
  239. }
  240. ll rr;
  241. class node{
  242. public:
  243. elem val;
  244. int leftBound, rightBound;
  245. node *left, *right;
  246. node(int levo, int desno){
  247. leftBound = levo;
  248. rightBound = desno;
  249. if(levo == desno){
  250. val = elem(arr[levo], arr[levo], arr[levo], arr[levo]);
  251. }
  252. else{
  253. int mid = (levo + desno) / 2;
  254. left = new node(levo, mid);
  255. right = new node(mid + 1, desno);
  256. val = mymerge(left -> val, right -> val);
  257. }
  258. }
  259. void update(int &_node, elem &newVal){
  260. if(leftBound == rightBound){
  261. val = newVal;
  262. return;
  263. }
  264. if(_node >= right -> leftBound){
  265. right -> update(_node, newVal);
  266. }
  267. else{
  268. left -> update(_node, newVal);
  269. }
  270. val = mymerge(left -> val, right -> val);
  271. }
  272. elem query(int &i, int &j){
  273. if(i <= leftBound && rightBound <= j){
  274. rr = max(rr, val.mxx);
  275. return val;
  276. }
  277. else if(rightBound < i || j < leftBound){
  278. return elem(-inf, -inf, -inf, -inf);
  279. }
  280. return mymerge(left -> query(i, j), right -> query(i, j));
  281. }
  282. };
  283. int main(int argc, const char * argv[]) {
  284. // ifstream cin("in.txt");
  285. // ofstream cout("out.txt");
  286. cin >> n;
  287. for(int i = 0; i < n; i ++){
  288. cin >> arr[i];
  289. }
  290. cin >> q;
  291. int a, b;
  292. int t;
  293. node segmentTree(0, n - 1);
  294. for(int i = 0; i < q; i ++){
  295. cin >> t >> a >> b;
  296. if(t == 0){
  297. a --;
  298. elem tmp((ll)b, (ll)b, (ll)b, (ll)b);
  299. segmentTree.update(a, tmp);
  300. }
  301. else{
  302. a --;
  303. b --;
  304. rr = -inf;
  305. ll t = segmentTree.query(a, b).mxx;
  306. cout << max(rr, t) << endl;
  307. }
  308. }
  309. return 0;
  310. }
  311.  
  312. datop
  313. 30 april
  314. //adadasdasd
  315. #include <bits/stdc++.h>
  316.  
  317. using namespace std;
  318. #define EPS 1e-7
  319. int n, m;
  320. vector<double> pc, power;
  321. double mid;
  322. bool areEqual(double a, double b){
  323. return (a - b) < EPS || (a < b);
  324. }
  325. short int dp[101][1 << 16];
  326. bool rek(int at, int pos, int visited, double passedTime){
  327. if(!areEqual((passedTime) / power[at], mid))return false;
  328.  
  329. if(pos == m){
  330. return true;
  331. }
  332.  
  333. if(dp[pos][visited] != -1){
  334. return dp[pos][visited;
  335. //neam memoizacija
  336. }
  337. bool ret = true;
  338. if(areEqual((passedTime + pc[pos]) / power[at], mid)){ //Tuka is? tuka vikam ako mozam da prodolzam so covekot na pozicija at
  339. return dp[pos][visited] = rek(at, pos + 1, visited, passedTime + pc[pos]);// da da ok, sfakjam. Epa mislam deka radi ova pagja. sekoj pat vikash rekurzija +1, a mozesh da skoknesh odma +max_kolku_shto_mozesh
  340. }
  341. for(int i = 0; i < n; i ++){
  342. if(!(visited & (1 << i))){
  343. int newMask = visited;
  344. newMask |= (1 << i);
  345. if(areEqual((pc[pos] / power[i]), mid))
  346. if(rek(i, pos + 1, newMask, pc[pos])){
  347. return dp[pos][visited] = true;
  348. }
  349. }
  350. }
  351. return false;
  352. }
  353. int main()
  354. {
  355. ios_base::sync_with_stdio(false);
  356.  
  357. cin >> m >> n;
  358. double tmp;
  359. for(int i = 0; i < m; i ++){
  360. cin >> tmp;
  361. pc.push_back(tmp);
  362. }
  363. for(int i = 0; i < n; i ++){
  364. cin >> tmp;
  365. power.push_back(tmp);
  366. }
  367. double levo = 0.0;
  368. double desno = 200000.0;
  369. while(fabs(levo - desno) > EPS){
  370. mid = levo + (desno - levo) / 2;
  371. //if(mid < 0.0)break;
  372. bool da = false;
  373. memset(dp, -1, sizeof dp);
  374. for(int i =0; i < n;i ++){
  375. // memset(dp, -1, sizeof dp);
  376.  
  377. if(rek(i, 1, (1 << i), pc[0])){
  378. da = true;
  379. break;
  380. }
  381. }
  382. if(da){
  383. // printf("%.6f\n", mid);
  384. desno= mid ;
  385.  
  386. }
  387. else{
  388. levo = mid ;
  389. }
  390.  
  391. }
  392. printf("%.6f", levo);
  393. return 0;
  394. }
  395.  
  396. double time;
  397.  
  398. bool rek(int person, int pos, int visited, double passedRooms_per_person)
  399.  
  400. if(time <= passedRooms_per_person / power[at]) <<<
  401. rek(person, pos + 1, visited, passedRooms + pc[pos])
  402. else{
  403. return false;
  404. for(int i =0 ; i < n; i++){
  405. if(!(visited & (1 << i))
  406. if(pc[pos] / power[i] >= time)
  407. rek(i, pos + 1, visited | (1 << i), pc[pos])
  408.  
  409.  
  410.  
  411. bool rek(room_at, vis)
  412. if(room_at == end) return true;
  413. if(vis is all 1) return false;
  414.  
  415. for(int i=0;i<n;i++)
  416. {
  417. if(!(vis&(1<<i))
  418. {
  419. int tmp = rek(get_max_to_the_right[room_at][i], vis|(1<<i))
  420. if(tmp == 1)
  421. {
  422. return 1;
  423. }
  424. }
  425. }
  426. return 0;
  427.  
  428.  
  429.  
  430.  
  431. 16 april
  432.  
  433.  
  434. Asistent: http://mendo.mk/Task.do?id=379
  435.  
  436.  
  437. part: bop
  438.  
  439. palindrom: boppob
  440. verglanje: boppobboppob
  441.  
  442. i
  443. $_b_o_p_p_o_b_b_o_p_p_o_b_@
  444. ^ ^ ^ <<obelezuvanje
  445. L C R
  446. 0303031303032
  447. 3 5
  448. quarter = (R-L+3)/4 -> proveri tocno kako treba da e
  449. if(niz[quarter]*2 - 1 == niz[C]) = remember as possible solution
  450.  
  451.  
  452. 12 april
  453. Tifani od drzaven 2017
  454. http://mendo.mk/Task.do?id=714
  455.  
  456. dp[100001][4][4][4][4]
  457. dp[100001][2^3][2^3]
  458. s[at]
  459.  
  460.  
  461.  
  462. dp[at][l_1][l_2][r_1][r_2] = max(rek(at + 1, l_2, curr, r_1, r_2) + x, rek(at+1, l_1, l_2, r_2, curr)+cost)
  463.  
  464. dp[n][][][][] = dp[n-1][][][][] or
  465. dp[n][]][][] = dp[n+1][][][][] =>
  466.  
  467. 0 znaci deka at%2 = 1
  468. 1 znaci deke at%2 = 0
  469. init:
  470. (dp[0][0][0][0][0] = 0) dali ni treba? < ne ni treba za dp-to za tiffany[1] deka e vekje vkluceno vo dp-to za tiffany[0]
  471. a = next = tiffany[0]
  472. dp[1][0][a][0][0] = dp[0][0][0][0][0] + reward : stavi go a levo na prazno
  473. dp[1][0][0][0][a] = dp[0][0][0][0][0] + reward : stavi go a desno na prazno
  474. b = next = tiffany[1];
  475. dp[0][0][a][0][b] = dp[1][0][a][0][0] + reward : prvo a bilo levo, sme go postavile b desno
  476. dp[0][a][b][0][0] = dp[1][0][a][0][0] + reward : prvo a bilo levo, sme go postavile b levo
  477. dp[0][0][b][0][a] = dp[1][0][0][0][a] + reward : a bilo desno, stavi go b desno
  478. dp[0][0][0][a][b] = dp[1][0][0][0][a] + reward : a bilo desno stavi go b desno
  479. c = next = tiffany[2]
  480. dp[1][a][c][0][b] = dp[0][0][a][0][b] + reward
  481.  
  482.  
  483. dp[at%2][left_bot][left_top][right_bot][right_top]
  484.  
  485. MEM(dp, -inf)
  486. dp[0][0][0][0][0] = 0
  487. int ret = 0;
  488. for(int at = 0; at < n; at ++){
  489. for(int j = 0; j <= 3; j ++){
  490. for(int k = 0; k <=3 ; k++){
  491. for(int x = 0; x <= 3; x ++){
  492. for(int y = 0; y <= 3; y ++){
  493. int prev = at % 2;
  494. int now = 1 - prev;
  495. next = tiffany[at];
  496. ret = max(ret, dp[now][k][next][x][y] = max(dp[now][k][next][x][y], dp[prev][j][k][x][y] + reward(j, k, next)));
  497. ret = max(ret, dp[now][j][k][y][next] = max(dp[now][j][k][y][next], dp[prev][j][k][x][y] + reward(x, y, next)));
  498. }
  499. }
  500. }
  501. }
  502. }
  503.  
  504.  
  505. #include <iostream>
  506. #include <set>
  507. #include <algorithm>
  508. #include <map>
  509. #include <cstring>
  510. #include <fstream>
  511. using namespace std;
  512. int n;
  513. string s;
  514. struct node{
  515. int at, i1, i2, i3, i4;
  516. node(){}
  517. node(int &_at, int &_i1, int &_i2, int &_i3, int &_i4){
  518. at =_at;
  519. i1 = _i1;
  520. i2 = _i2;
  521. i3 = _i3;
  522. i4 = _i4;
  523. }
  524. bool operator < (const node &a)const{
  525. if(at == a.at){
  526. if(i1 == a.i1){
  527. if(i2 == a.i2){
  528. if(i3 == a.i3){
  529. return i4 < a.i4;
  530. }
  531. return i3 < a.i3;
  532. }
  533. return i2 < a.i2;
  534. }
  535. return i1 < a.i1;
  536. }
  537. return at < a.at;
  538. }
  539. };
  540. // R - 0
  541. // Y - 1
  542. // G - 2
  543. map<node, int> dp;
  544. bool vis[10];
  545. int rek(int &at, int &l1, int &l2, int &d1, int &d2){
  546. if(at == n){
  547. // cout << "DA BE"<<endl;
  548. return 0;
  549. }
  550. int tmp = dp[node(at, l1, l2, d1, d2)];
  551. if(tmp != 0)return tmp;
  552. int ret = 0;
  553. int curr;
  554. vis[1] = vis[2] = vis[3] = false;
  555. if(s[at] == 'R'){
  556. curr = 1;
  557. vis[curr] = true;
  558. }
  559. else if(s[at] == 'Y'){
  560. curr = 2;
  561. vis[curr] = true;
  562. }
  563. else{
  564. curr = 3;
  565. vis[curr] = true;
  566. }
  567. if(l1 != 0){
  568. vis[l1] = true;
  569. }
  570. if(l2 != 0){
  571. vis[l2] = true;
  572. }
  573. int sz = 0;
  574. if(vis[1])sz ++;
  575. if(vis[2])sz ++;
  576. if(vis[3])sz ++;
  577. int newAt = at + 1;
  578. if(sz== 3){
  579. ret = max(ret, rek(newAt, l2, curr, d1, d2) + 3);
  580. }
  581. else if(sz == 2){
  582. ret = max(ret, rek(newAt, l2, curr, d1, d2) + 2);
  583. }
  584. else{
  585. ret = max(ret, rek(newAt, l2, curr, d1, d2) + 1);
  586. }
  587. vis[1] = vis[2] = vis[3] = false;
  588. vis[curr] = true;
  589. if(d1 != 0){
  590. vis[d1] = true;
  591. }
  592. if(d2 != 0){
  593. vis[d2] = true;
  594. }
  595. sz = 0;
  596. if(vis[1])sz ++;
  597. if(vis[2])sz ++;
  598. if(vis[3])sz ++;
  599. if(sz == 3){
  600. ret = max(ret, rek(newAt, l1, l2, d2, curr) + 3);
  601. }
  602. else if(sz == 2){
  603. ret = max(ret, rek(newAt, l1, l2, d2, curr) + 2);
  604.  
  605. }
  606. else{
  607. ret = max(ret, rek(newAt, l1, l2, d2, curr) + 1);
  608. }
  609. return dp[(node(at, l1, l2, d1, d2))] = ret;
  610. }
  611. int main(int argc, const char * argv[]) {
  612. ios_base::sync_with_stdio(false);
  613.  
  614. // ifstream cin("in.txt");
  615. cin >> n >> s;
  616.  
  617. // reverse(s.begin(), s.end());
  618. int t = 0;
  619. cout << rek(t, t, t, t, t) <<endl;
  620. return 0;
  621. }
  622.  
  623. 10 april popladne
  624. #include <iostream>
  625. #include <vector>
  626. #include <queue>
  627. #include <cstring>
  628. #include <algorithm>
  629. #include <set>
  630. #include <cmath>
  631. #include <fstream>
  632. using namespace std;
  633.  
  634. long long n, m, k;
  635. const long long INF = 1e15;
  636. vector<pair<long long, long long> > graph[100001];
  637. long long cities[100001];
  638. long long dist[100001];
  639. bool visited[100001];
  640. long long path[100001];
  641. struct node{
  642. long long idx, cost;
  643. node(){}
  644. node(long long i, long long c){
  645. idx = i;
  646. cost = c;
  647. }
  648. bool operator < (const node &a)const{
  649. return cost > a.cost;
  650. }
  651. };
  652. long long ret;
  653. bool put[100001];
  654. bool imp[100001];
  655. pair<long long ,long long> shotestCity(){
  656. for(int i = 0; i < n; i ++){
  657. dist[i] = INF;
  658. visited[i] = false;
  659. }
  660. priority_queue<node> q;
  661. dist[0] = 0;
  662. q.push(node(0, 0));
  663. node tmp;
  664. long long nxtNode, weight;
  665. while(!q.empty()){
  666. tmp = q.top();
  667. q.pop();
  668. if(visited[tmp.idx])continue;
  669. visited[tmp.idx] = true;
  670. for(long long i = 0; i < graph[tmp.idx].size(); i ++){
  671. nxtNode = graph[tmp.idx][i].first;
  672. weight = graph[tmp.idx][i].second;
  673. if(!visited[nxtNode] && tmp.cost + weight < dist[nxtNode]){
  674. dist[nxtNode] = tmp.cost + weight;
  675. q.push(node(nxtNode, tmp.cost + weight));
  676. }
  677. }
  678. }
  679. long long d = INF, id = -1;
  680. for(long long i = 0; i < k; i ++){
  681. if(imp[cities[i]] and dist[cities[i]] < d){
  682. d = dist[cities[i]];
  683. id = cities[i];
  684. }
  685. }
  686. return make_pair(d, id);
  687.  
  688. }
  689. void dijkstra(long long A){
  690. for(int i = 0; i < n;i ++){
  691. visited[i] = false;
  692. path[i] = -1;
  693. dist[i] = INF;
  694. }
  695. dist[A] = 0;
  696. priority_queue<node> q;
  697. q.push(node(A, 0));
  698. node tmp;
  699. long long nxtNode, weight;
  700. while(!q.empty()){
  701. tmp = q.top() ;
  702. q.pop();
  703. if(visited[tmp.idx])continue;
  704. visited[tmp.idx] = true;
  705. for(long long i =0 ; i < graph[tmp.idx].size(); i ++){
  706. nxtNode = graph[tmp.idx][i].first;
  707. weight = graph[tmp.idx][i].second;
  708. if(!visited[nxtNode] && tmp.cost + weight < dist[nxtNode]){
  709. dist[nxtNode] = tmp.cost + weight;
  710. q.push(node(nxtNode, dist[nxtNode]));
  711. path[nxtNode] = tmp.idx;
  712. }
  713. }
  714. }
  715. }
  716. //bool vis[100001], v[100001];
  717. long long sCity;
  718. vector<pair<long long, long long> > newGraph[100001];
  719. long long bfs(long long A){
  720. memset(visited, false, sizeof visited);
  721. queue<long long> q;
  722. q.push(A);
  723. visited[sCity]= true;
  724. long long res = 0;
  725. while(!q.empty()){
  726. long long curr = q.front();
  727. q.pop();
  728. for(long long i =0 ; i < newGraph[curr].size(); i ++){
  729. long long nxtNode = newGraph[curr][i].first;
  730. long long weight = newGraph[curr][i].second;
  731. res = max(res, weight);
  732. if(!visited[nxtNode]){
  733. visited[nxtNode] = true;
  734. q.push(nxtNode);
  735. }
  736. }
  737. }
  738. return res;
  739. }
  740. bool vis[100001];
  741. int main() {
  742. ios_base::sync_with_stdio(false);
  743. ifstream cin("in.txt");
  744. cin >> n >> m;
  745. long long a, b, c;
  746. for(long long i = 0; i < m; i ++){
  747. cin >> a >> b >> c;
  748. graph[a].push_back(make_pair(b, c));
  749. graph[b].push_back(make_pair(a, c));
  750. }
  751.  
  752. cin >> k;
  753. memset(imp, false, sizeof imp);
  754. for(long long i = 0; i < k; i ++){
  755. cin >> cities[i];
  756. imp[cities[i]] = true;
  757. }
  758. pair<long long, long long> shortestCity = shotestCity();
  759. dijkstra(shortestCity.second);
  760. sCity = shortestCity.second;
  761. for(long long i = 0; i < k; i ++){
  762. long long A = sCity;
  763. long long B = cities[i];
  764. if(A != B){
  765. vector<long long> v;
  766. bool da = true;
  767. while(B != A){
  768. if(B == -1){
  769. da = false;
  770. break;
  771. }
  772. v.push_back(B);
  773. B = path[B];
  774. }
  775. v.push_back(A);
  776. if(da){
  777. reverse(v.begin(), v.end());
  778. // cout << cities[i] << endl;
  779. for(long long j = 0; j < v.size(); j ++){
  780. if(j < v.size() - 1){
  781. newGraph[v[j]].push_back(make_pair(v[j + 1], dist[v[j + 1]]));
  782. newGraph[v[j + 1]].push_back(make_pair(v[j], dist[v[j + 1]]));
  783. }
  784. }
  785. }
  786. // cout<<endl;
  787. }
  788. }
  789. ret = 0;
  790. memset(vis, false, sizeof vis);
  791. for(long long i = 0; i < newGraph[sCity].size(); i ++){
  792. if(vis[newGraph[sCity][i].first])continue;
  793. vis[newGraph[sCity][i].first] = true;
  794. ret += bfs(newGraph[sCity][i].first);
  795. }
  796. cout << ret + shortestCity.first<< endl;
  797.  
  798. return 0;
  799. }
  800. Test case:
  801.  
  802.  
  803. Explanation from fb morning:
  804. SAT 10:06PM
  805. Ok
  806. Btw ke ti se resetira visited
  807. T.e ke treba da presmetash koi novodi se poblisku koga ke napravish reset na counterot
  808.  
  809. malce nejasno
  810.  
  811. znaci koga sme na node kaj koj treba da stavime stab
  812. samo ja stavame tezinata na nodot
  813.  
  814. a, b, c, d se gradovi. Treba da stavish shtabovi na a, c i d. Na primer ima pat od a=0 do b do c. Ima pat c - b - d kade shto. Ako dist(abd-cbd) > 0 => treba da go zemesh total_dist+=cdb. Odnosno treba nekoi nodovi da gi posetish dvapati.
  815. Doobjasnuvanje: treba da stignesh do c i d za da stavish shtabovi
  816. E sega treba da najdesh min(visit_in_order(c, d), visit in order (d, c)). E sega da vidime shto e visit_in_order(c, d): pocnuvash od 0 i odish do c pa do d => odnosno odish ili dist (a=0, b, c) + dist (0, b, d) ili dist (a=0, b, c, b, d)
  817.  
  818. a->b = a=0 b->cel pat do drugata strana
  819. b->c
  820. b->d
  821. total lenght = min({cost(a->b->c) + min(cost(a->b->d), cost(c->b->d))},
  822. {cost(a->b->d) + min(cost(d->b->c), cost(a->b->c)})
  823.  
  824. mhmm
  825. Ima smisla?
  826. Vidi kako ja manipulirash visited nizata
  827.  
  828. pa ne bas
  829. Koga stavash stigash do nekoj shtab i go resetirash dist counterot
  830. *Koga stigash do nekoj shtab go resetirash dist counterot taka
  831. Epa sega ako se vratish 1 node nazad od kade shto si doshol do toj shtab, togash dist do toj node stanuva dist(nodot od kaj doshol shtabot, nodot na shtabot), a predhodnata distanca za nodot od kaj shto si doshol do shtabot bila (0, nodot od kaj shto si doshol do shtabot). Eba sega imenuvaj go nodot od kaj shto si doshol do shtabot so imeto b. I napishi mi ja transformacinata shto ja objasnav pred dve recenici
  832.  
  833. dist[nxtNode] = dist[currNode]
  834. dist[b] = dist[currNode]
  835.  
  836. 6 7
  837. 2 3 135
  838. 0 3 898
  839. 0 4 480
  840. 3 5 295
  841. 2 4 262
  842. 0 1 216
  843. 2 5 682
  844. 2
  845. 2 1
  846.  
  847.  
  848. Josif's code for
  849. http://mendo.mk/Task.do?id=381
  850. #include <iostream>
  851. #include <vector>
  852. #include <queue>
  853. #include <cstring>
  854. #include <algorithm>
  855. #include <set>
  856. #include <cmath>
  857. using namespace std;
  858.  
  859. int n, m, k;
  860. vector<pair<int, int> > graph[100001];
  861. int cities[100001];
  862. int dist[100001];
  863. bool visited[100001];
  864. int path[100001];
  865. struct node{
  866. int idx, cost;
  867. node(){}
  868. node(int i, int c){
  869. idx = i;
  870. cost = c;
  871. }
  872. bool operator < (const node &a)const{
  873. return cost > a.cost;
  874. }
  875. };
  876. long long ret;
  877. bool imp[100001];
  878. void dijkstra(){
  879. memset(visited, false, sizeof visited);
  880. memset(dist, 63, sizeof dist);
  881. memset(path, -1, sizeof path);
  882. priority_queue<node> q;
  883. dist[0] = 0;
  884. q.push(node(0, 0));
  885. int nxtNode, weight;
  886. node tmp;
  887. bool is_void = true;
  888. while(!q.empty()){
  889. tmp = q.top();
  890. q.pop();
  891. if(visited[tmp.idx])continue;
  892. visited[tmp.idx] = true;
  893. if(imp[tmp.idx]){
  894. //zoshto ovde da ne stavime
  895. //memset(dist, 127, sizeof dist);<=
  896. ret += tmp.cost;
  897. tmp.cost = 0;
  898. if(is_void)
  899. {
  900. memset(dist, 127, sizeof dist);
  901. is_void = false;
  902. }
  903. }
  904. for(int i =0; i < graph[tmp.idx].size(); i ++){
  905. nxtNode = graph[tmp.idx][i].first;
  906. weight = graph[tmp.idx][i].second;
  907. if(imp[tmp.idx]){
  908. if( dist[nxtNode] > weight){
  909. dist[nxtNode] = weight;
  910. q.push(node(nxtNode, weight));
  911. }
  912. }
  913. else{
  914. if(dist[nxtNode] > weight + tmp.cost){
  915. dist[nxtNode] = weight + tmp.cost;
  916. q.push(node(nxtNode, weight + tmp.cost));
  917. }
  918. }
  919. }
  920. }
  921.  
  922. }
  923. bool vis[100001], v[100001];
  924. vector<pair<int, int> > newGraph[100001];
  925.  
  926. int main(int argc, const char * argv[]) {
  927. ios_base::sync_with_stdio(false);
  928. cin >> n >> m;
  929. int a, b, c;
  930. for(int i = 0; i < m; i ++){
  931. cin >> a >> b >> c;
  932. graph[a].push_back(make_pair(b, c));
  933. graph[b].push_back(make_pair(a, c));
  934. }
  935.  
  936. cin >> k;
  937. memset(imp, false, sizeof imp);
  938. for(int i = 0; i < k; i ++){
  939. cin >> cities[i];
  940. imp[cities[i]] = true;
  941. }
  942. ret = 0;
  943. dijkstra();
  944. cout << ret << endl;
  945.  
  946. return 0;
  947. }
  948.  
  949.  
  950. 9 april sabajle
  951. http://mendo.mk/Task.do?id=381
  952.  
  953.  
  954. 0 1
  955. 1 2
  956. 0 3
  957.  
  958. 0 1 2 3
  959.  
  960. 0 - 1: 0 1
  961. 0 - 2: 0 1 2
  962. 0 ->3: 0 3
  963.  
  964.  
  965.  
  966.  
  967. 0: 1, 3
  968. 1 : 2
  969.  
  970. Nov graf: poseti 1 3 4
  971. 0 1 1
  972. 1 2 2
  973. 2 3 1
  974. 3 4 2
  975. 4 0 2
  976.  
  977. 0 1 1
  978. 0: 4 1
  979. 1 : 2
  980. 2 : 3
  981.  
  982. Visit: 0 5 8
  983. 0 1 5
  984. 0 2 1
  985. 2 3 1
  986. 3 4 1
  987. 4 5 1
  988. 5 6 3
  989. 6 7 3
  990. 7 8 3
  991. 1 8 5
  992.  
  993. po koj redosled gi posetuvame teminjata, rez = 0
  994. 0 Q.P(at = 0, d = 0)
  995. 6 Q.P(at = 1, d = 5)
  996. 1 Q.P(at = 2, d = 1)
  997. 2 Q.P(at = 3, d = 2)
  998. 3 Q.P(at = 4, d = 3)
  999. 4 Q.P(at = 5, d = 4) rez += 4
  1000. 5 Q.P(at = 6, d = 3)
  1001. 7 Q.P(at = 7, d = 6)
  1002. Q.P(at = 8, d = 10)
  1003. Q.P(at = 8, d = 9) rez+= 9
  1004. break.
  1005.  
  1006. #include <iostream>
  1007. #include <vector>
  1008. #include <queue>
  1009. #include <cstring>
  1010. #include <algorithm>
  1011. #include <set>
  1012. #include <cmath>
  1013. using namespace std;
  1014.  
  1015. int n, m, k;
  1016. vector<pair<int, int> > graph[100001];
  1017. int cities[100001];
  1018. int dist[100001];
  1019. bool visited[100001];
  1020. int path[100001];
  1021. struct node{
  1022. int idx, cost;
  1023. node(){}
  1024. node(int i, int c){
  1025. idx = i;
  1026. cost = c;
  1027. }
  1028. bool operator < (const node &a)const{
  1029. return cost > a.cost;
  1030. }
  1031. };
  1032. void dijkstra(){
  1033. memset(visited, false, sizeof visited);
  1034. memset(dist, 63, sizeof dist);
  1035. memset(path, -1, sizeof path);
  1036. dist[0] = 0;
  1037. int nxtNode, weight;
  1038. node tmp;
  1039. priority_queue<node> q;
  1040. q.push(node(0, 0));
  1041. while(!q.empty()){
  1042. tmp = q.top();
  1043. q.pop();
  1044. if(visited[tmp.idx])continue;
  1045. visited[tmp.idx] = true;
  1046. for(int i = 0; i < graph[tmp.idx].size(); i ++){
  1047. nxtNode = graph[tmp.idx][i].first;
  1048. weight = graph[tmp.idx][i].second;
  1049. if(!visited[nxtNode] && tmp.cost + weight < dist[nxtNode]){
  1050. dist[nxtNode] = tmp.cost + weight;
  1051. q.push(node(nxtNode, dist[nxtNode]));
  1052. path[nxtNode] = tmp.idx;
  1053. }
  1054. }
  1055. }
  1056. }
  1057. bool vis[100001], v[100001];
  1058. vector<pair<int, int> > newGraph[100001];
  1059. int bfs(int node){
  1060. queue<int> q;
  1061. int curr;
  1062. q.push(node);
  1063. memset(v, false, sizeof v);
  1064. v[node] = true;
  1065. v[0] = true;
  1066. int ret = 0;
  1067. if(newGraph[0].size() > 0)
  1068. ret = newGraph[0][node].second;
  1069. while(!q.empty()) {
  1070. curr = q.front();
  1071. q.pop();
  1072. for(int i =0; i < newGraph[curr].size(); i ++){
  1073. if(!v[newGraph[curr][i].first]){
  1074. v[newGraph[curr][i].first] = true;
  1075. q.push(newGraph[curr][i].first);
  1076. ret = max(ret, newGraph[curr][i].second);
  1077. }
  1078. }
  1079. }
  1080. return ret;
  1081. }
  1082. int main(int argc, const char * argv[]) {
  1083. ios_base::sync_with_stdio(false);
  1084. cin >> n >> m;
  1085. int a, b, c;
  1086. for(int i = 0; i < m; i ++){
  1087. cin >> a >> b >> c;
  1088. graph[a].push_back(make_pair(b, c));
  1089. graph[b].push_back(make_pair(a, c));
  1090. }
  1091. cin >> k;
  1092. for(int i = 0; i < k; i ++){
  1093. cin >> cities[i];
  1094. }
  1095. dijkstra();
  1096. int A, B;
  1097. for(int i = 0; i < k; i ++){
  1098. B = cities[i];
  1099. A = 0;
  1100. vector<int> v;
  1101. bool da = false;
  1102. while(B != A){
  1103. if(B == -1){
  1104. da = true;
  1105. break;
  1106. }
  1107. v.push_back(B);
  1108. B = path[B];
  1109. }
  1110. v.push_back(A);
  1111. reverse(v.begin(), v.end());
  1112. if(v.size() > 1 && !da){
  1113. for(int j = 0; j < v.size() - 1; j ++){
  1114. newGraph[v[j]].push_back(make_pair(v[j + 1], dist[v[j + 1]]));
  1115. // newGraph[v[j + 1]].push_back(make_pair(v[j], dist[v[j]]));
  1116.  
  1117. }
  1118. }
  1119. }
  1120. //cout << dist[1] << " " << dist[2] << endl;
  1121. vector<pair<int, int> >::iterator it;
  1122. memset(vis, false, sizeof vis);
  1123. vis[0] = true;
  1124. long long ret = 0;
  1125. for(int i =0; i <newGraph[0].size(); i ++){
  1126. int t = newGraph[0][i].first;
  1127. if(!vis[t]){
  1128. vis[t] = true;
  1129. ret += max(newGraph[0][i].second, bfs(t));
  1130. // cout << bfs(t) << endl;
  1131. }
  1132. }
  1133. // vis[0] = true;
  1134. cout << ret << endl;
  1135.  
  1136. return 0;
  1137. }
  1138.  
  1139.  
  1140.  
  1141.  
  1142. # classes is a list of tuples [(g_1, b_1), (g_2, b_2), ... , (g_{n-1}, b_{n-1})] (see handout for definitions).
  1143. # T is some positive number.
  1144. def inefficient_allocate_time(classes, T):
  1145. time_allocated = 0
  1146. total_benefit = 0
  1147.  
  1148. while time_allocated < T:
  1149. # Find which remaining class would be best to allocate our time to.
  1150. best_ratio = -float('inf')
  1151. best_i = -1
  1152. for i, (goal, benefit) in enumerate(classes): # O(n)
  1153. if benefit/goal > best_ratio:
  1154. best_ratio = benefit/goal
  1155. best_i = i
  1156.  
  1157. if best_i == -1:
  1158. # If we run out of classes, return.
  1159. return total_benefit
  1160.  
  1161. # Allocate as much time as we can to the best class found.
  1162. goal, benefit = classes[best_i]
  1163. # We can't go over our limit T or over the goal limit for this class.
  1164. time_to_allocate = min(T - time_allocated, goal)
  1165. time_allocated += time_to_allocate
  1166. total_benefit += benefit/goal * time_to_allocate
  1167.  
  1168. # We can't allocate any more time to this class, so delete it.
  1169. del classes[best_i] # O(n)
  1170. return total_benefit
  1171.  
  1172. def allocate_time(classes, T):
  1173. return inefficient_allocate_time(classes, T)
  1174. Mart 28mi, nedelata pred drzaven
  1175.  
  1176. Tuka si?
  1177. da
  1178. Josif?
  1179.  
  1180. dada
  1181. tuka sum
  1182.  
  1183.  
  1184. Top, epa sledi sea
  1185.  
  1186. vo kodov ovde
  1187. add zavisi od tmpMask i at
  1188. se drugo e konstantno
  1189. taka da moze da se zapishe short int add_memo[_neshto_][_neshto_], kade shto ke zapisheme stvari od precompute-ot
  1190.  
  1191. Josif:
  1192. aham znaci cim se drugo e konstanto
  1193. add_memo[at][bitmask]
  1194.  
  1195. Kliment: Check :D xD
  1196.  
  1197. Kliment:
  1198. Oh, Ova e top, ke moze da pishuvame rekurentnti muabeti
  1199. ke mozam da ti posocuvam vo koja linija imam objasnato nekoj koncept
  1200. i posle ke moze da gi upotrebime muabetive da napisham kniga za zadaci za natprevari po matematika
  1201. xD
  1202. Ova ke e top :D
  1203. Josif:
  1204. ahahahahahaahha dada
  1205. Kliment:
  1206. Ok, se vrakjame na rabota.
  1207. goto: "Code to precompute"
  1208. sledam
  1209. Sledi:
  1210. "Code to precompute"
  1211. As global variable:
  1212. short int add[21][1<<20];
  1213. uu ama dali ke iame dovolno memorija
  1214. poso dpto ke ni bide 40mb
  1215.  
  1216. Kliment: neznam
  1217. moment da vidam
  1218. napraj mi ubedliv argument zoshto ke padne
  1219. Josif:
  1220. aham sea
  1221. 20 * (2^20) * sizeof(short int) / 1024 / 1024
  1222. 20 * (2^20) * 2 / 1024 / 1024 = 40mb
  1223.  
  1224.  
  1225. Kliment:
  1226. Okej, fer, znaci ke treba da najdeme nacin kako da koristeme memmorija na rolling basis.
  1227. Kao, da ne ja cuvame celata
  1228. msm deka nema potreba da praime precompute na add_cost, dovolno e na maskite samo
  1229. ili pa nesto kako knapsack od kraj koga pustame
  1230. samo dp[at] bez bitmaskata ili samo dp[bitmask]
  1231. aha fer vidi go ova: edinstveni opcii za bitmaski ni se tie so 1 bit aktiven, ili tie so n aktivni bitovi na edna grupa na objekti so ist label.
  1232. na primer: 1000 GOTO "CONTINUE BITCOUNT"
  1233.  
  1234. 0100
  1235. 0010
  1236. 0001
  1237. "CONTINUE BITCOUNT"
  1238. na primer ako imame grad so zgradi 1233323 izbor ni se
  1239. moze da cuvame mapa
  1240. dp da ni e mapa
  1241.  
  1242. Kliment: Aha, pa da, ke treba toa da go imame, ali pak togash ke imame
  1243. O(log(2^20)*2^20)) = O(20*2^20). I O(log(2^20)) = O(20),
  1244. shto ke ni e potrebno vo sekoja rekurzija O(20) pati. Thus
  1245. , pak imash O(2^n*n^3) vreme.
  1246. ama samo ednas ke bide taa 20ka
  1247. znaci ke bide n^2 sam
  1248.  
  1249. Kliment: ama vikam deka za da izvadish element od mapata, treba da upotrebish operacija find() vo mapa so 2^20 elementi.
  1250. taa e log2
  1251. aa dadada
  1252. jasno
  1253. ama pak ke bide 20*20
  1254. epa sekoja reurzija ke ima
  1255.  
  1256. da i Log2(2^20) = 20. toa e deficinijata na log2.
  1257. i imash O(log2(2^20)) = O(20) operacii sekoj pat koga sakash da pristapish do add_memmo (taka ke ni se vika dpto).
  1258. , a sakash da pristapish vo add_memmo 20 pati vo sekoja rekurzija, a imash 20*2^20 rekurzii, taka da broish O(2^20*20^3) :D :D :D
  1259. kako zvuci toa?
  1260. aham jasno , ja mislev samo dpto da ni bide mapa.
  1261. Kliment: Pa istiot problem ke go imash.
  1262. dada
  1263. jasno jasno
  1264. a kako ke go sredime ova bez mapa
  1265. ako koristish mapa, koristish log faktor taka da ke imash nesshto O(neshto*log(2^20)) deka 2^20 ti se moznite bitovi.
  1266. , a toa e O(neshto_podobreno*20)
  1267. A tvoeto neshto_podobreno e O(20*20*\
  1268.  
  1269. inc moeto ne pagase na vreme
  1270. 2^20), a se vika neshto_podobreno deka e podobruvanje od 20*20*20*2^20. Odnosno so cel da go napravish podobruvanjeto ti samo izrazuvash drug nacin kako da ja imash istata kompleksnost. :D :D :D Kako zvuci toa?
  1271.  
  1272. City: 12232334444
  1273. 1______
  1274. ama ne mi padna na vreme
  1275. za pogresen rezultat dava
  1276. poso ne mi e dobra formulata
  1277. inc mn ginc mn e sporo codeshare ____
  1278.  
  1279. short int f(1__________) = 10000000:
  1280. se zaglavi codeshare ne sledev
  1281. sto se desava sea
  1282. klimetnt?
  1283. short int f(_______1000) = 00000000:
  1284. short int f(_______0100) = 00000000:
  1285. short int f(_______0010) = 00000000:
  1286. short int f(_______0001) = 00000000:
  1287. short int f(_______1111) = 00000000:
  1288. short int f(_______0011) = 00000000:
  1289. short int f(_______0101) = 00000000:
  1290. short int f(_______1010) = 00000000:
  1291. short int f(_______1010) = 00000000:
  1292. short int f(_______1100) = 00000000:
  1293. short int f(_10_0______)
  1294. short int f(_01_0______)
  1295. short int f(_00_1______)
  1296. short int f(_11_1______)
  1297. similar for ___3_33____
  1298.  
  1299.  
  1300.  
  1301. short int add = val[at];
  1302. short int exp = 0;
  1303. tmpMask |= bitmask;
  1304. short int newnew = tmpMask;
  1305.  
  1306. while(newnew){
  1307. if(newnew % 2 == 1){
  1308. add -= cost[exp][at];
  1309. }
  1310. newnew /= 2;
  1311. exp ++;
  1312. }
  1313. ret = min(ret, rek(at + 1, tmpMask) + add);
  1314. if(i == n - 1){
  1315. ret = min(ret, rek(at + 1, tmpMask) + add);
  1316. }
  1317.  
  1318. #include <cstring>
  1319. #include <iostream>
  1320. #include <vector>
  1321. #include <algorithm>
  1322. #include <queue>
  1323. #include <fstream>
  1324. #include <assert.h>
  1325. #define MAX 1<<15
  1326. #define MAXN 20
  1327. using namespace std;
  1328. short int n, m;
  1329. short int type[MAXN+1][MAXN+1];
  1330. short int cost[MAXN+1][MAXN+1];
  1331. short int dp[MAXN+1][1<<MAXN];
  1332. short int all_of_type_make_unique[MAXN+1][MAXN+1];
  1333. int all_of_one_type[MAXN+1][MAXN+1];
  1334. short int bp[1<<MAXN];
  1335.  
  1336. int min(int a, int b)
  1337. {
  1338. if(a<b)
  1339. {
  1340. return a;
  1341. }
  1342. return b;
  1343. }
  1344.  
  1345. bool check_bit(const int bit, const short int at)
  1346. {
  1347. return ((bit&(1<<at))!=0);
  1348. }
  1349. short int rek(const short int at, const int bitmask){
  1350. if(bp[bitmask] == n){
  1351. return 0;
  1352. }
  1353. if(at == m){
  1354. return MAX;
  1355. }
  1356.  
  1357. if(dp[at][bitmask]!= -1){
  1358. return dp[at][bitmask];
  1359. }
  1360. short int ret = MAX;
  1361. for(short int i = 0; i < n; i ++){
  1362. if(!check_bit(bitmask, i))
  1363. {
  1364. ret = min(ret, rek(at, bitmask|(1<<i))+cost[i][at]);
  1365. ret = min(ret, rek(at, bitmask|all_of_one_type[i][at])+all_of_type_make_unique[i][at]);
  1366. }
  1367. }
  1368. ret = min(ret, rek(at+1, bitmask));
  1369.  
  1370. return dp[at][bitmask] = ret;
  1371. }
  1372. int main(int argc, const char * argv[]) {
  1373. ios_base::sync_with_stdio(false);
  1374. cin >> n >> m;
  1375. for(short int i = 0; i < n; i ++){
  1376. for(short int j = 0; j < m; j ++){
  1377. cin >> type[i][j];
  1378. }
  1379. }
  1380. for(short int i = 0; i < n; i ++){
  1381. for(short int j = 0; j < m; j ++){
  1382. cin >> cost[i][j];
  1383. }
  1384. }
  1385. for(short int at=0;at<m;at++)
  1386. {
  1387. short int vis = 0;
  1388. for(short int i=0;i<n;i++)
  1389. {
  1390. if(check_bit(vis, i))
  1391. {
  1392. continue;
  1393. }
  1394. int tmp_all_of_one_type = 0;
  1395. short int sum = 0;
  1396. short int max_price = 0;
  1397. for(short int j = 0; j < n; j ++){
  1398. if(type[i][at] == type[j][at]){
  1399. vis|=(1<<j);
  1400. tmp_all_of_one_type |= (1 << j);
  1401. sum+=cost[j][at];
  1402. max_price = max(max_price, cost[j][at]);
  1403. }
  1404. }
  1405. for(short int j = 0; j < n; j++)
  1406. {
  1407. if(type[i][at] == type[j][at])
  1408. {
  1409. assert(tmp_all_of_one_type != 0);
  1410. all_of_one_type[j][at] = tmp_all_of_one_type;
  1411. all_of_type_make_unique[j][at] = sum-max_price;
  1412. }
  1413. }
  1414. }
  1415. }
  1416. for(int i=0;i<(1<<MAXN);i++)
  1417. {
  1418. bp[i] = __builtin_popcount(i);
  1419. }
  1420. memset(dp, -1, sizeof dp);
  1421. cout << rek(0, 0) << endl;
  1422. return 0;
  1423. }
  1424. /*
  1425. 4 3
  1426. 1 2 1
  1427. 3 2 2
  1428. 3 1 2
  1429. 1 1 1
  1430. 50 30 60
  1431. 20 40 50
  1432. 30 30 30
  1433. 40 40 30
  1434.  
  1435. 5 1
  1436. 7
  1437. 2
  1438. 7
  1439. 7
  1440. 30
  1441. 61
  1442. 61
  1443. 61
  1444. 61
  1445. 61
  1446. */
  1447.  
  1448.  
  1449.  
  1450.  
  1451. 26ti mart nedela pred drzaven
  1452.  
  1453. guides: 0 1 2 3 4 5... 100
  1454. participants: 0 1 2 ... 14
  1455.  
  1456. guide bitmask of participants
  1457. 0
  1458. 1
  1459. 2
  1460. 3
  1461. 4
  1462. 5
  1463.  
  1464. #guides: 3, #countries: 2
  1465.  
  1466.  
  1467.  
  1468. rez = sum_for_all_i(column_i) - sum_for_each_i_choose_one_j(a_i_j)
  1469.  
  1470. minimize rez => maximize sum_for_each_i_choose_one_j(a_i_j)
  1471. i -> country
  1472. j -> guide
  1473.  
  1474. int dp[100][1<<15];
  1475. int sum[]
  1476. for(i -> n)
  1477. for(j -> m)
  1478. sum[j] += mat[i][j]
  1479. for(i)
  1480. for(j)
  1481. cost[i][j] = sum[j] - mat[i][j];
  1482.  
  1483. dp[guide_j][bit] = rez;
  1484. ni pretstavuva koi drzavi vo bit se zemeni od site guides pomegju 0 <=guides<= j;
  1485. rek(at, bitmask)
  1486. tmp = bitmask
  1487. while(tmp)
  1488. if(tmp % 2 == 0)
  1489. for_each_bit_which_is_zero_in_the_bitmask
  1490. rek(at,bitmask) = min(rek(at + 1, bitmask + (1 << bit) + sum_for_all[at][bit])
  1491.  
  1492. for(int i=0;i< num_countries;i++)
  1493. {
  1494. if((bit&(1<<i))==0)
  1495. {
  1496. int newBit = bit+(1<<i);
  1497. int cost = sum[guide_at];
  1498. cost -= input_mat[guide_at][i];
  1499. ret = min(ret, rek(at+1, newBit)+cost);
  1500. }
  1501. }
  1502.  
  1503.  
  1504.  
  1505. country_i
  1506. guide_j a_ij
  1507.  
  1508.  
  1509.  
  1510.  
  1511. 4 <- sum(column) - 4
  1512. 5
  1513. 6
  1514. 1
  1515. 2
  1516.  
  1517.  
  1518.  
  1519.  
  1520. 0 1
  1521. 0 : 0 16
  1522. 1 : 0 0
  1523. 2 : 0 0
  1524.  
  1525. 4 + 1 = 5
  1526.  
  1527. /* Code written by Kliment Serafimov */
  1528.  
  1529. #include <fstream>
  1530. #include <iomanip>
  1531. #include <iostream>
  1532.  
  1533. #include <map>
  1534. #include <set>
  1535. #include <cmath>
  1536. #include <queue>
  1537. #include <stack>
  1538. #include <math.h>
  1539. #include <time.h>
  1540. #include <string>
  1541. #include <vector>
  1542. #include <cstring>
  1543. #include <cstdlib>
  1544. #include <cassert>
  1545. #include <algorithm>
  1546.  
  1547. #define P push
  1548. #define f first
  1549. #define s second
  1550. #define pb push_back
  1551. #define mp make_pair
  1552. #define DEC 0.00000001
  1553. #define MAX 2139062143
  1554. #define MAX_63 1061109567
  1555. #define MAXll 9187201950435737471
  1556. #define bp(a) __builtin_popcount(a)
  1557. #define rand(a, b) ((rand()%(b-a+1))+a)
  1558. #define MEM(a, b) memset(a, b, sizeof(a))
  1559. #define sort_v(a) sort(a.begin(), a.end())
  1560. #define rev_v(a) reverse(a.begin(), a.end())
  1561.  
  1562. //#define fin cin
  1563. //#define fout cout
  1564. using namespace std;
  1565. //ifstream fin(".in");
  1566. //ofstream fout(".out");
  1567.  
  1568. #define set_bit(A,bit) (A|=(1<< (bit)))
  1569. #define clear_bit(A,bit) ((A&=~(1 << (bit))))
  1570. #define test_bit(A,bit) ((A&(1<<bit))!=0)
  1571. #define print_bits(A,n) for(int BIT=0;BIT<n;BIT++)cout<<test_bit(A,BIT);
  1572. #define print_bits_endl(A,n) for(int BIT=0;BIT<n;BIT++)cout<<test_bit(A,BIT);cout<<endl;
  1573. int ma[101][16];
  1574. int dp[101][1<<15];
  1575. int sum[15];
  1576. int n, m;
  1577. int rek(int at, int bit)
  1578. {
  1579. if(dp[at][bit]!=-1)
  1580. return dp[at][bit];
  1581. if(bp(bit)==m)
  1582. return 0;
  1583. if(at==n)
  1584. return MAX;
  1585. int ret = MAX;
  1586. for(int i=0;i<m;i++)
  1587. {
  1588. if(!test_bit(bit, i))
  1589. {
  1590. int newBit = bit;
  1591. set_bit(newBit, i);
  1592. int val = rek(at+1, newBit);
  1593. val+=sum[i]-ma[at][i];
  1594. ret = min(ret, val);
  1595. }
  1596. }
  1597. ret = min(ret, rek(at+1, bit));
  1598. dp[at][bit] = ret;
  1599. return ret;
  1600. }
  1601. int main()
  1602. {
  1603. cin >> n >> m;
  1604. MEM(sum, 0);
  1605. for(int i=0;i<n;i++){
  1606. for(int j=0;j<m;j++){
  1607. cin >> ma[i][j];
  1608. sum[j]+=ma[i][j];
  1609. }
  1610. }
  1611. MEM(dp, -1);
  1612. cout << rek(0, 0);
  1613. return 0;
  1614. }
  1615.  
  1616. 26 feb. 2017 nedelata pred regionalen (superstring + backtrack)
  1617.  
  1618. #include <iostream>
  1619. #include <vector>
  1620. #include <cstring>
  1621. #include <queue>
  1622. #include <fstream>
  1623. using namespace std;
  1624. int n;
  1625. int arr[10001];
  1626. vector<pair<int, int> > vals;
  1627. vector<pair<int, int >> c;
  1628. int mymerge(int a, int b){
  1629. return max(a, b);
  1630. }
  1631. class node{
  1632. public:
  1633. int val;
  1634. node *left, *right;
  1635. int leftBound, rightBound;
  1636. bool doPush = false;
  1637. node(int levo, int desno){
  1638. leftBound = levo;
  1639. rightBound = desno;
  1640. if(levo == desno){
  1641. val = arr[levo];
  1642. }
  1643. else{
  1644. int mid = (levo + desno) / 2;
  1645. left = new node(levo ,mid);
  1646. right = new node(mid + 1, desno);
  1647. val = mymerge(left -> val, right -> val);
  1648. }
  1649. }
  1650. int updateVal(int old, int newVal){
  1651. return newVal;
  1652. }
  1653. void setLazyMarker(int newVal){
  1654. val = updateVal(val, newVal);
  1655. if(leftBound != rightBound){
  1656. doPush = true;
  1657. }
  1658. }
  1659. void pushLazyMarker(){
  1660. if(doPush){
  1661. doPush = false;
  1662. left -> setLazyMarker(val);
  1663. right -> setLazyMarker(val);
  1664. }
  1665. }
  1666. void update(int i, int j, int newVal){
  1667. if(i <= leftBound && rightBound <= j){
  1668. setLazyMarker(newVal);
  1669. }
  1670. else if(j >= leftBound && rightBound >= i){
  1671. pushLazyMarker();
  1672. left -> update(i, j, newVal);
  1673. right -> update(i, j, newVal);
  1674. val = mymerge(left -> val, right -> val);
  1675. }
  1676.  
  1677.  
  1678. }
  1679. int query(int i, int j){
  1680. pushLazyMarker();
  1681. if(i <= leftBound && rightBound <= j){
  1682. return val;
  1683. }
  1684. if(rightBound < i)return 0;
  1685. if(j < leftBound)return 0;
  1686. return mymerge(left -> query(i, j), right -> query(i, j));
  1687. }
  1688.  
  1689. };
  1690. int main()
  1691. {
  1692. ios_base::sync_with_stdio(false);
  1693. cin >> n;
  1694. memset(arr, 0, sizeof arr);
  1695. node segmentTree(0, n - 1);
  1696. for(int i = 0; i < n; i ++){
  1697. cin >> arr[i];
  1698. vals.push_back(make_pair(arr[i], i));
  1699. }
  1700. sort(vals.begin(), vals.end());
  1701. for(int i = 0; i < n; i ++){
  1702. c.push_back(make_pair(vals[i].second, i));
  1703. }
  1704. sort(c.begin(), c.end());
  1705. int ret = 0;
  1706. int dptmp;
  1707. segmentTree.update(c[0].second, c[0].second, 1);
  1708. for(int i = 1; i < n; i ++){
  1709. dptmp = segmentTree.query(0, c[i].second - 1) + 1;
  1710. segmentTree.update(c[i].second, c[i].second, dptmp);
  1711. ret = max(dptmp, ret);
  1712. }
  1713. cout << ret << endl;
  1714. //10 22 9 33 21 50 41 60
  1715. return 0;
  1716. }
  1717.  
  1718.  
  1719. -----------------------------------
  1720. [ ]
  1721. at: 0 1 2 3
  1722. mcs: 1 2< 2
  1723. arr: 2 20 4 3 6 12 8 4 10
  1724.  
  1725. id : 0 1 2 3 4 5 6 7 8
  1726. v.f: 2 3 4 4 6 8 10 12 20
  1727. v.s: 0 3 2 7 4 6 8 5 1
  1728.  
  1729. c.f: (=v.s) 0 3 2 7 4 6 8 5 1
  1730. c.s: (= id) 0 1 2 3 4 5 6 7 8
  1731.  
  1732. sort(c)
  1733.  
  1734.  
  1735. [ ]
  1736. at: 0 1 2 3 4 5 6 7 8
  1737. mcs: 1
  1738.  
  1739. c.f: (=v.s) 0 1 2 3 4 5 6 7 8
  1740. c.s: (= id) 0 8 2 1 4 7 5 3 6
  1741.  
  1742. r.update(c[0], 1);
  1743. at: 0 1 2 3 4 5 6 7 8
  1744. mcs: 1
  1745. for(int at = 1; at<n; at++)
  1746. {
  1747. int dp_at = r.query(0, c[at].s-1)+1;
  1748.  
  1749. query(at=1) r.query(0, c[at].s-1) = 1
  1750. at: 0 1 2 3 4 5 6 7 8
  1751. mcs: [1 ]
  1752.  
  1753. query(at=2) r.query(0, c[at].s-1) = 1
  1754. at: 0 1 2 3 4 5 6 7 8
  1755. mcs: [1 ] 2
  1756.  
  1757. query(at=3) r.query(0, c[at].s-1) = 1
  1758. at: 0 1 2 3 4 5 6 7 8
  1759. mcs: [1]2 2
  1760.  
  1761. query(at = 4) r.query(0, c[at].s-1) = 2
  1762. at: 0 1 2 3 4 5 6 7 8
  1763. mcs: [1 2 ] 2
  1764.  
  1765. r.update(c[at].s, dp_at); // update na pozicija c[at].s stavi vrednost ret
  1766.  
  1767. update(at=1) r.update(c[at].s, dp_at)
  1768. at: 0 1 2 3 4 5 6 7 8
  1769. mcs update(at=1) 1 2
  1770.  
  1771. update(at=2) r.update(c[at].s, dp_at)
  1772. at: 0 1 2 3 4 5 6 7 8
  1773. mcs update(at=1) 1 2 2
  1774.  
  1775. update(at=3) r.update(c[at].s, dp_at)
  1776. at: 0 1 2 3 4 5 6 7 8
  1777. mcs update(at=1) 1 2 2 2
  1778.  
  1779. update(at=4) r.update(c[at].s, dp_at)
  1780. at: 0 1 2 3 4 5 6 7 8
  1781. mcs update(at=4) 1 2 2 3 2
  1782.  
  1783. ret = max(ret, dpedit.com/sh8r
  1784.  
  1785.  
  1786. 19th March, lenght: 1:43
  1787. Longest altrnating subsequence
  1788. id: 0 1 2 3 4 5
  1789. segmenttree1: 0 0 0 1 0 0
  1790. segmenttree2: 0 0 0 1 0 0
  1791. Arr 3 5 4 2 0
  1792. st1 : arr[i] = 3 : segmenttree1.update(arr[i], segmenttree2.query(0, (array[i]-1 = 2)) + 1)
  1793. st2 : arr[i] -> segmenttree2.update(arr[i], segmenttree1.query(arr[i]+1 = 4, 5) + 1
  1794. arr[i] = 5
  1795.  
  1796. LAS(a, b) = LAS(0, b) - LAS(0, a-1);
  1797. [ ]
  1798. 0 1 2 3 4 5
  1799. 3 3 5 4 7 1
  1800.  
  1801. 1 2 3 4 5 6 7 8 9
  1802.  
  1803. [ ]
  1804. update at
  1805. position = 5
  1806. update(5, x):
  1807. case 1: x <= arr[4]; x = 0 delta = 0
  1808. case 2: x >= arr[6]; x = 8 delta = 2
  1809. case 3: arr[4] < x < arr[6] delta = 0
  1810.  
  1811. / \ / \ / \
  1812. U
  1813. 0 1 2 3 4 5 6 Ta7 8 9 10 111213
  1814.  
  1815. [ ] [ ] [ ] [ ] -> continuous increasing subsequences
  1816. 3 4 5 2 1 8 7 8 6 9 10 4 3 2
  1817. [ ] [ ] [ ] [ ]-> continuous decreasing subsequences
  1818.  
  1819. *
  1820. 0 1 2 3 4 5 6 7 8 9 10 11 12 13
  1821. * * * * * * * *
  1822. ]: 2 2 4 4 4 5 7
  1823. 3 4 5 2 1 8 7 8 6 9 10 4 3 2
  1824. [: 0 0 0 2 2 4 6
  1825. pre - upadte
  1826. LAS(0, 13) = {3, 5, 1, 8, 6, 10, 2}
  1827.  
  1828. post update:
  1829. LAS(0, 13) = {3, 5, 1, 8, 7, 8, 6, 10, 2}
  1830.  
  1831. if(arr[at] == 7 && prev == 'small' ) next = "on right of 8"
  1832.  
  1833. if(arr[at] == 7 && prev == 'big' ) next = "on left or equal to 8"
  1834.  
  1835. 1 2 3 4 5
  1836. [ o l x r ][o][ o o o o ]
  1837.  
  1838. 1 2 1 4 5
  1839. [ o [l][xhhbg] r ][o][ o o o o ] if(x<l)
  1840.  
  1841. 1 2 5 4 5
  1842. [o l [x] [r] [o] o o o o ] if(x>r)
  1843.  
  1844.  
  1845. [ o o o l [x] r o o o ] if(x> max(l, r))
  1846.  
  1847. [ o o o [l] [x] [r] o o o ] if(x< max(l, r))
  1848.  
  1849. count_*(0, a) runs in O(log n)
  1850.  
  1851. LAS(a, b) = count_*(0, b) - count_*(0, a-1) + c
  1852. c = (a != * + b != *)
  1853. [ [] [] [][] ]
  1854. a b
  1855. [ [] [] [][] [] [] ]
  1856.  
  1857. #include <bits/stdc++.h>
  1858.  
  1859. using namespace std;
  1860. int n, q;
  1861. int arr[200001];
  1862. int a, b;
  1863. class element
  1864. {
  1865. public:
  1866. int val;
  1867. bool isLeftInc, isRightInc;
  1868. int left_mono_size, right_mono_size; //mono - monoton increasing/decreasing
  1869. int size;
  1870. int leftestElement;
  1871. int rightestElement;
  1872. element(int e)
  1873. {
  1874. val = 0;
  1875. isLeftInc = isRightInc = true;
  1876. left_mono_size = right_mono_size = 1;
  1877. size = 1;
  1878. leftestElement = e;
  1879. rightestElement = e;
  1880. }
  1881. element(element *x, element *y)
  1882. {
  1883. val = x->val+y->val;
  1884. size = x->size+y->size;
  1885. leftestElement = x->leftestElement;
  1886. rightestElement = y->rightestElement;
  1887. // x = 2, y = 1;
  1888. if(x->size == x->left_mono_size) // all of x is monoton
  1889. {
  1890. assert(x->isRightInc);
  1891. assert(x->right_mono_size == x->size)
  1892. if(y->size == y->left_mono_size) // all of y is monoton
  1893. {
  1894. assert(y->isRightInc);
  1895. assert(y->right_mono_size == y->size);
  1896. if(x->isLeftInc == y.isLeftInc) // if x and y are monoton in the same way x = 123 y = 234
  1897. {
  1898. if(x->isLeftInc && x->rightestElement<y->leftestElement)// x = 123, y = 456
  1899. {
  1900. isLeftInc = isRightInc = x->isLeftInc;
  1901. left_mono_size = right_mono_size = size;
  1902. }
  1903. else if(!x->isLeftInc && x->rightestElement>y->leftestElement)// x = 654 y = 321
  1904. {
  1905. isLeftInc = isRightInc = x->leftInc;
  1906. left_mono_size = right_mono_size = size;
  1907. }
  1908. else // x = 123 y = 234 OR x = 654 y = 543
  1909. {
  1910. //current node : xy; left part of curr node = x, right part is y
  1911. isLeftInc = x->isLeftInc; // because we know that x->isLeftInc = x->isRightInc because x->size == x->left_mono_size == x->right_mono_size
  1912. isRightInc = y->isRightInc;
  1913. left_mono_size = x->size; // x->size = x->left_mono_size;
  1914. right_mono_size = y->size; // y->size = y->right_mono_size;
  1915. val =
  1916. }
  1917.  
  1918. }
  1919. else // if x and y are monoton in different ways;
  1920. {
  1921. isLeftInc = x->isLeftInc;
  1922. left_mono_size = x->size;
  1923. isRightInc = y->isRightInc;
  1924. right_mono_size = y->size;
  1925. }
  1926. }
  1927. }
  1928.  
  1929. }
  1930. bool b1, b2;
  1931. class node{
  1932. public:
  1933. int leftBound, rightBound;
  1934. node *left, *right;
  1935. element val;
  1936. node(int levo, int desno){
  1937. leftBound = levo;
  1938. rightBound = desno;
  1939. if(levo == desno){
  1940. val = element(arr[levo]);
  1941. return;
  1942. }
  1943. else{
  1944. int mid = (levo + desno) / 2;
  1945. left = new node(levo, mid);
  1946. right = new node(mid + 1, desno);
  1947. val = element(&(left -> val), &(right -> val));
  1948. }
  1949. }
  1950. void update(int _node, int newVal){
  1951. if(leftBound == rightBound){
  1952. val = newVal;
  1953. return;
  1954. }
  1955. int mid = (leftBound + rightBound) / 2;
  1956. if(_node >= right -> leftBound){
  1957. right -> update(_node, newVal);
  1958. }
  1959. else if(_node <= left->rightBound){
  1960. left -> update(_node, newVal);
  1961. }
  1962. val = mymerge(left -> val, right -> val);
  1963. }
  1964. int query(int i, int j){
  1965. if(i <= leftBound && rightBound <= j){
  1966. return val;
  1967. }
  1968. if(rightBound < i)return 0;
  1969. if(j < leftBound)return 0;
  1970. return mymerge(left->query(i, j), right->query(i, j));
  1971. }
  1972. };
  1973. struct interval{
  1974. int first, second;
  1975. interval(){}
  1976. interval(int f, int s){
  1977. first = f;
  1978. second = s;
  1979. }
  1980. };
  1981. bool star[200001];
  1982. int main()
  1983. {
  1984. ios_base::sync_with_stdio(false);
  1985. // ifstream cin("in.txt");
  1986.  
  1987. cin >> n >> q;
  1988. //cin >> q;
  1989. int mxx = 0;
  1990. vector<interval> v;
  1991. for(int i = 0; i < n; i ++){
  1992. cin >> arr[i];
  1993.  
  1994. }
  1995. int it1 = 0, it2 = 0;
  1996. bool inc = false, dec = false;
  1997. if(arr[1] > arr[0])inc = true;
  1998. else dec = true;
  1999. arr[n] = arr[n - 1];
  2000. memset(star, false, sizeof star);
  2001. for(int i = 1; i <= n; i ++){
  2002. if(inc){
  2003. if(arr[i] > arr[i - 1]){
  2004. it2 = i;
  2005. }
  2006. else{
  2007. // it2 = i - 1;
  2008. star[i - 1] = true;
  2009. v.push_back(interval(it1, i - 1, false));
  2010. it1 = i-1 ;
  2011. inc = false;
  2012. dec = true;
  2013. }
  2014. }
  2015. else{
  2016. if(arr[i] < arr[i - 1]){
  2017. it2 = i;
  2018. }
  2019. else{
  2020. //it2 = i;
  2021.  
  2022. star[i - 1] = true;
  2023. v.push_back(interval(it1, i - 1));
  2024. it1 = i -1;
  2025. inc = true;
  2026. dec = false;
  2027. }
  2028. }
  2029. }
  2030.  
  2031. cout << endl;
  2032. star[n - 1] = false;
  2033. node segmentTree(0, n - 1);
  2034. for(int i = 0; i < n; i ++){
  2035. if(star[i]){
  2036. // cout << i << " " ;
  2037. segmentTree.update(i, 1);
  2038. continue;
  2039. }
  2040. }
  2041. // cout << endl;
  2042. // cout << segmentTree.query(0, 0) << endl;
  2043. // cout << "INPUT NUMBER OF QUERIES: ";
  2044.  
  2045. string tmp;
  2046.  
  2047. for(int i =0; i < q ; i++){
  2048. cin >> tmp;
  2049. cin >> a >> b;
  2050. if(tmp == "COUNT"){
  2051. a --;
  2052. b --;
  2053. cout << (b - a + 1) - ((!star[a] + !star[b]) + (segmentTree.query(0,b)-segmentTree.query(0,a-1))) << endl;
  2054. }
  2055. else{
  2056. a --;
  2057. arr[a] = b;
  2058.  
  2059.  
  2060. }
  2061.  
  2062. }
  2063. return 0;
  2064. }
  2065. /**/
  2066.  
  2067.  
  2068. intv: [ ]
  2069. root: --------------------------
  2070. r.l: ----------12
  2071. r.r: 343-----------
  2072. r.r.l 343-----
  2073. r.r.r ------
  2074.  
  2075. --------
  2076.  
  2077. class node
  2078. {
  2079. public:
  2080. int lb, rb;
  2081. node* leftchild, rightchild;
  2082. bool is_left_inc, is_right_inc;
  2083. int val;
  2084. node(int levo, int desno)
  2085. {
  2086. lb = levo;
  2087. rb = desno;
  2088. if(levo == desno){
  2089.  
  2090. }
  2091.  
  2092. }
  2093. }
  2094.  
  2095. 1 2 3
  2096.  
  2097. +1 +1
  2098. [ [ ] ]
  2099. 1 2 3 2 1
  2100. [+1 +1] [-1 -1]
  2101.  
  2102. 5 4 5 4
  2103. -1 +1 -1
  2104.  
  2105. take: 2 2 2 2 222
  2106. ++++----+++++++-----+-+
  2107. 2 +1 +1 +1 +1+1+1 =
  2108.  
  2109.  
  2110. /* Code written by Kliment Serafimov */
  2111.  
  2112. #include <fstream>
  2113. #include <iomanip>
  2114. #include <iostream>
  2115.  
  2116. #include <map>
  2117. #include <set>
  2118. #include <cmath>
  2119. #include <queue>
  2120. #include <stack>
  2121. #include <math.h>
  2122. #include <time.h>
  2123. #include <string>
  2124. #include <vector>
  2125. #include <cstring>
  2126. #include <cstdlib>
  2127. #include <cassert>
  2128. #include <algorithm>
  2129.  
  2130. #define P push
  2131. #define f first
  2132. #define s second
  2133. #define pb push_back
  2134. #define mp make_pair
  2135. #define DEC 0.00000001
  2136. #define MAX 2139062143
  2137. #define MAX_63 1061109567
  2138. #define MAXll 9187201950435737471
  2139. #define bp(a) __builtin_popcount(a)
  2140. #define rand(a, b) ((rand()%(b-a+1))+a)
  2141. #define MEM(a, b) memset(a, b, sizeof(a))
  2142. #define sort_v(a) sort(a.begin(), a.end())
  2143. #define rev_v(a) reverse(a.begin(), a.end())
  2144.  
  2145. //#define fin cin
  2146. //#define fout cout
  2147. using namespace std;
  2148. //ifstream fin(".in");
  2149. //ofstream fout(".out");
  2150.  
  2151. #define set_bit(A,bit) (A|=(1<< (bit)))
  2152. #define clear_bit(A,bit) ((A&=~(1 << (bit))))
  2153. #define test_bit(A,bit) ((A&(1<<(bit)))!=0)
  2154.  
  2155. vector<int> arr;
  2156. class element
  2157. {
  2158. public:
  2159. int val;
  2160. int is_monoton;
  2161. int left_inc;
  2162. int right_inc;
  2163. element(int l, int r)
  2164. {
  2165. val = 0;
  2166. is_monoton = true;
  2167. left_inc = right_inc = l<r;
  2168. }
  2169. element(string s)
  2170. {
  2171. assert(s == "empty");
  2172. val = -1;
  2173. }
  2174. element(element *x, element *y)
  2175. {
  2176. if(x->val == -1 && y->val == -1)
  2177. {
  2178. assert(0);
  2179. }
  2180. if(x->val == -1)
  2181. {
  2182. val = y->val;
  2183. is_monoton = y->is_monoton;
  2184. left_inc = y->left_inc;
  2185. right_inc = y->right_inc;
  2186. }
  2187. else if(y->val == -1)
  2188. {
  2189. val = x->val;
  2190. is_monoton = x->is_monoton;
  2191. left_inc = x->left_inc;
  2192. right_inc = x->right_inc;
  2193. }
  2194. else if(x->is_monoton && y->is_monoton) //x = 123, y = 345 oR x = 123, y = 321
  2195. {
  2196. if(x->left_inc == y->left_inc)
  2197. {
  2198. is_monoton = true;
  2199. left_inc = right_inc = x->left_inc;
  2200. val = 0;
  2201. }
  2202. else
  2203. {
  2204. is_monoton = false;
  2205. left_inc = x->left_inc;
  2206. right_inc = y->left_inc; // y->left_inc = y->right_inc
  2207. val = 1;
  2208. }
  2209. }
  2210. else
  2211. {
  2212. is_monoton = false;
  2213. left_inc = x->left_inc;
  2214. right_inc = y->right_inc;
  2215. val = x->val+y->val+(x->right_inc!=y->left_inc);
  2216. }
  2217. }
  2218. element()
  2219. {
  2220.  
  2221. }
  2222. };
  2223.  
  2224. class node
  2225. {
  2226. public:
  2227. int lb, hb;
  2228. node *leftChild, *rightChild;
  2229. element val;
  2230. node(int left, int right)
  2231. {
  2232. lb = left;
  2233. hb = right;
  2234. if(lb == hb)
  2235. {
  2236. val = element(arr[lb], arr[lb+1]);
  2237. }
  2238. else
  2239. {
  2240. int mid = (lb+hb)/2;
  2241. leftChild = new node(lb, mid);
  2242. rightChild = new node(mid+1, hb);
  2243. val = element(&(leftChild->val), &(rightChild->val));
  2244. }
  2245. }
  2246. void update(int idx)
  2247. {
  2248. if(lb == hb)
  2249. {
  2250. val = element(arr[idx], arr[idx+1]);
  2251. return;
  2252. }
  2253. if(idx >= rightChild->lb)
  2254. {
  2255. rightChild->update(idx);
  2256. }
  2257. else
  2258. {
  2259. leftChild -> update(idx);
  2260. }
  2261. val = element(&(leftChild -> val), &(rightChild -> val));
  2262.  
  2263. }
  2264. element *query(int l, int r)
  2265. {
  2266. if(l<=lb && hb <= r)
  2267. {
  2268. return &val;
  2269. }
  2270. else if(hb<l || r<lb)
  2271. {
  2272. return new element("empty");
  2273. }
  2274. else
  2275. {
  2276. return new element((leftChild->query(l, r)), (rightChild->query(l, r)));
  2277. }
  2278. }
  2279. node(){}
  2280. }root;
  2281.  
  2282.  
  2283. int main()
  2284. {
  2285. int n;
  2286. int q;
  2287. cin >> n >> q;
  2288.  
  2289. for(int i=0; i<n; i++)
  2290. {
  2291. int a;
  2292. cin >> a;
  2293. arr.pb(a);
  2294. }
  2295. cout << endl;
  2296. root = node(0, n-2);
  2297.  
  2298. for(int i; i<q; i++)
  2299. {
  2300. string type;
  2301. cin >> type;
  2302. if(type == "REPLACE")
  2303. {
  2304. int at, e;
  2305. cin >> at >> e;
  2306. at--;
  2307. arr[at] = e;
  2308. if(at!=0)
  2309. root.update(at-1);
  2310. root.update(at);
  2311. }
  2312. else if (type == "COUNT")
  2313. {
  2314. int l, r;
  2315. cin >> l >> r;
  2316. l--, r--;
  2317. cout << (r-l+1)-(root.query(l, r-1)->val+2) <<endl;
  2318. }
  2319. else
  2320. {
  2321. assert(0);
  2322. }
  2323. }
  2324. return 0;
  2325. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement