Advertisement
Guest User

cautare binara`

a guest
Jan 20th, 2020
140
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 13.43 KB | None | 0 0
  1. ----------------- PB 3163-----------------
  2. #include <fstream>
  3.  
  4. using namespace std;
  5.  
  6. ifstream f("secvmaxval.in");
  7. ofstream g("secvmaxval.out");
  8.  
  9. int cautare(long long v[], int n, int i, long long x)
  10. {
  11. int s=i, d=n, m;
  12. while(s<=d)
  13. {
  14. m=(s+d)/2;
  15. if(v[m]-v[i-1]>x) d=m-1;
  16. else s=m+1;
  17. }
  18. return d;
  19. }
  20. int main()
  21. {
  22. int n, i, j, maxx=0;
  23. long long v[200001], val;
  24. f>>n>>val;
  25. v[0]=0;
  26. for(i=1; i<=n; i++)
  27. {
  28. f>>v[i];
  29. v[i]=v[i]+v[i-1];
  30. }
  31. for(i=1; i<=n; i++)
  32. {
  33. j=cautare(v, n, i, val);
  34. if(j-i+1>maxx) maxx=j-i+1;
  35. }
  36. g<<maxx;
  37. }
  38. ----------------- PB 2455-----------------
  39.  
  40. #include <bits/stdc++.h>
  41. using namespace std;
  42. ifstream f("plaja2.in");
  43. ofstream g("plaja2.out");
  44. struct zile{
  45. long long nr,res;
  46. }x[100005];
  47. int main()
  48. {
  49. long long n,k,dif,i,maxx=0,a,b,z;
  50. f>>n>>k>>dif;
  51. for(i=1;i<=k;i++)
  52. f>>x[i].nr>>x[i].res;
  53. if(maxx<x[1].res+dif*x[i].nr-dif)
  54. maxx=x[1].res+dif*x[i].nr-dif;
  55. if(maxx<x[k].res+(n-x[k].nr)*dif)
  56. maxx=x[k].res+(n-x[k].nr)*dif;
  57. for(i=1;i<k;i++){
  58. z=x[i+1].nr-x[i].nr-1;
  59. a=x[i].res;
  60. b=x[i+1].res;
  61. if(a>b) swap(a,b);
  62. while(z){
  63. z--;
  64. if(a<=b)
  65. a+=dif;
  66. else
  67. b+=dif;
  68. }
  69. if(maxx<max(a,b))
  70. maxx=max(a,b);
  71. }
  72. g<<maxx;
  73. return 0;
  74. }
  75.  
  76. ----------------- PB 2454-----------------
  77.  
  78. #include <bits/stdc++.h>
  79. using namespace std;
  80. ifstream f("bsrec.in");
  81. ofstream g("bsrec.out");
  82. int minn[1005],maxx[1005],sol[1005];
  83. int main()
  84. {
  85. int T,Q,n,IT,val,left,right,l,r,i;
  86. f>>T;
  87. for(int t=1;t<=T;t++){
  88. f>>n>>Q;
  89. memset(minn,0,1001);
  90. for(i=1;i<=1000;i++){
  91. maxx[i]=1000000001;
  92. minn[i]=0;
  93. sol[i]=0;
  94. }
  95.  
  96. for(int q=1;q<=Q;q++){
  97. f>>val>>IT;
  98. f>>left>>right;
  99. for(int it=2;it<=IT;it++){
  100. f>>l>>r;
  101. if(l==left)
  102. if(minn[(left+right)/2]<val)
  103. minn[(left+right)/2]=val;
  104. if(r==right)
  105. if(maxx[(left+right)/2]>=val)
  106. maxx[(left+right)/2]=val-1;
  107. left=l; right=r;
  108. }
  109. }
  110. // for(i=1;i<=n;i++)
  111. // g<<minn[i]<<" ";
  112. // g<<"\n";
  113. // for(i=1;i<=n;i++)
  114. // g<<maxx[i]<<" ";
  115. // g<<"\n\n";
  116. for(i=1;i<=n;i++){
  117. sol[i]=max(sol[i-1]+1,minn[i]);
  118. if(maxx[i]<sol[i]){
  119. g<<"-1";
  120. break;
  121. }
  122. }
  123. if(i==n+1)
  124. for(i=1;i<=n;i++)
  125. g<<sol[i]<<" ";
  126.  
  127.  
  128. g<<"\n";
  129.  
  130. }
  131. return 0;
  132. }
  133.  
  134. ----------------- PB 2453-----------------
  135.  
  136. #include <fstream>
  137. #include <iostream>
  138.  
  139. using namespace std;
  140. int n,m,c[1001],fv[1000000];
  141.  
  142. int main()
  143. {
  144. ifstream f("rosii_mici.in");
  145. ofstream g ("rosii_mici.out");
  146. int i,j,Q,x,maxx,a[1001],maxim=0,k;
  147. f>>n>>m>>Q;
  148. for(i=1;i<=n;i++)
  149. {
  150. for(j=1;j<=m;j++)
  151. {
  152. f>>x;
  153. k=j-1;
  154. while(k>0 and c[k]>x)
  155. {
  156. c[k+1]=c[k];
  157. k--;
  158. }
  159. c[k+1]=x;
  160. }
  161. for(j=1;j<=m;j++)
  162. {
  163. if(fv[c[j]]<i*j)
  164. maxim=i*j;
  165. else maxim=fv[c[j]];
  166. fv[c[j]]=maxim;
  167. }
  168. }
  169. for(i=1;i<=1000000;i++)
  170. {
  171. if(fv[i]<fv[i-1])
  172. maxim=fv[i-1];
  173. else
  174. maxim=fv[i];
  175. fv[i]=maxim;
  176. }
  177.  
  178. for(i=1;i<=Q;i++)
  179. {
  180. f>>x;
  181. g<<fv[x]<<"\n";
  182. }
  183.  
  184. return 0;
  185. }
  186.  
  187. ----------------- PB 2252-----------------
  188.  
  189. #include <iostream>
  190. #include <fstream>
  191. using namespace std;
  192. ifstream fin("profu.in");
  193. ofstream fout("profu.out");
  194. int n, k, i, maxx=0;
  195. int v[500001];
  196. int verif(long long X)
  197. {
  198. int r=0, i, nr=0;
  199. for(i=1; i<=n; i++)
  200. {
  201. r=r+v[i];
  202. if(r>X)
  203. {
  204. nr++;
  205. r=v[i];
  206. }
  207. }
  208. nr++;
  209. if(nr<=k) return 1;
  210. else return 0;
  211. }
  212. int main()
  213. {
  214. fin >> n >> k;
  215. for(i=1; i<=n; i++)
  216. {
  217. fin >> v[i];
  218. if(v[i]>maxx) maxx=v[i];
  219. }
  220. long long st, dr, mij, SOLUTIE;
  221. st=maxx;
  222. dr=500000000000;
  223. while(st<=dr)
  224. {
  225. mij=(st+dr)/2;
  226. if(verif(mij))
  227. {
  228. SOLUTIE=mij;
  229. dr=mij-1;
  230. }
  231. else st=mij+1;
  232. }
  233. fout << SOLUTIE;
  234. return 0;
  235. }
  236.  
  237. ----------------- PB 2621-----------------
  238.  
  239. #include <iostream>
  240. #include <fstream>
  241. #include <algorithm>
  242. using namespace std;
  243. ifstream fin("spower2.in");
  244. ofstream fout("spower2.out");
  245. long long p[35], v[1001];
  246. int main()
  247. {
  248. long long aux=1;
  249. long long n, i, st, dr, mij, nr=0, a, numar, j, ok;
  250. //generez toate puterile lui 2 pana la 2^31
  251. while(nr<=31)
  252. {
  253. nr++;
  254. p[nr]=aux;
  255. if(nr<=31) aux=aux*2;
  256. }
  257. //memorez toate combinatiile posibile de doua puteri ale lui 2
  258. nr=0;
  259. for(i=1; i<=31; i++)
  260. for(j=i+1; j<=31; j++)
  261. {
  262. nr++;
  263. v[nr]=p[i]+p[j];
  264. }
  265. fin >> n;
  266. sort(v+1, v+nr+1);
  267. for(i=1; i<=n; i++)
  268. {
  269. fin >> a;
  270. //caut binar cel mai apropiat numar >= a in vectorul v
  271. //daca am gasit pe a in vectorul v, vom afisa v[mij], altfel
  272. //vom avea cazul st>dr si vom afisa v[st]
  273. st=1;
  274. dr=nr;
  275. while(st<=dr)
  276. {
  277. mij=(st+dr)/2;
  278. if(a==v[mij]) dr=-2;
  279. else
  280. if(a>v[mij]) st=mij+1;
  281. else
  282. if(a<v[mij]) dr=mij-1;
  283. }
  284. if(dr==-2) st=mij;
  285. fout << v[st] << " ";
  286. }
  287. return 0;
  288. }
  289.  
  290. ----------------- PB 536-----------------
  291.  
  292. #include <bits/stdc++.h>
  293.  
  294. using namespace std;
  295.  
  296. int v[1001],simulare[1001];
  297. int s;
  298. int n,m;
  299.  
  300. int suma(int x)
  301. {
  302. s=0;
  303. for(int i=1;i<=n;i++)
  304. s+=(x/v[i]);
  305. return s;
  306. }
  307.  
  308. int cautbin(int st, int dr)
  309. {
  310. int mij;
  311. // mij=(st+dr)/2;
  312. ///int sum=suma(mij);
  313. int sum;
  314. //sum/=2;
  315. while(st<=dr)
  316. {
  317. mij=(st+dr)/2;
  318. sum=suma(mij);
  319. if(sum<m)
  320. st=mij+1;
  321. else if(sum>m)
  322. dr=mij-1;
  323. else if(sum==m)
  324. return mij;
  325. }
  326. return st;
  327. }
  328.  
  329. int main()
  330. {
  331. cin>>n>>m;
  332. for(int i=1;i<=n;i++)
  333. cin>>v[i];
  334. int i=1;
  335. int poz=cautbin(1,m);
  336. /*while(s<m)
  337. {
  338. for(int j=1;j<=n;j++)
  339. if(i%v[j]==0)
  340. s++;
  341. i++;
  342. }
  343.  
  344. cout<<i-1;*/
  345. cout<<poz;
  346. return 0;
  347. }
  348.  
  349. ----------------- PB 1594-----------------
  350.  
  351. #include <bits/stdc++.h>
  352.  
  353. using namespace std;
  354.  
  355. ifstream f("maraton.in");
  356. ofstream g("maraton.out");
  357.  
  358. int v[100001];
  359.  
  360. int binsearch(int x,int st, int dr)
  361. {
  362. int m;
  363.  
  364. while(st<=dr)
  365. {
  366. m=(st+dr)/2;
  367. if(v[m]>x)
  368. dr=m-1;
  369. else
  370. st=m+1;
  371. }
  372. return dr;
  373. }
  374.  
  375. int main()
  376. {
  377. int n,x,y;
  378. f>>n;
  379. for(int i=1;i<=n;i++)
  380. {
  381. f>>x>>y;
  382. v[i]=x/y;
  383. if(x%y)
  384. v[i]++;
  385. }
  386. sort(v,v+n+1);
  387. int q;
  388. f>>q;
  389. for(int i=1;i<=q;i++)
  390. {
  391. f>>x;
  392. if(x<v[1]) g<<0<<"\n";
  393. else if(x>v[n]) g<<n<<"\n";
  394. else
  395. g<<binsearch(x,1,n)<<"\n";
  396. }
  397. return 0;
  398. }
  399.  
  400. ----------------- PB 2443-----------------
  401. #include <iostream>
  402. #define N 100001
  403. using namespace std;
  404. int sume[N],M[N],x,s;
  405.  
  406. int cautbin(int st,int dr)
  407. {
  408. if(st>dr)
  409. return dr;
  410. int mij=(st+dr)/2;
  411. if(sume[mij]>s||M[mij]>x)
  412. cautbin(st,mij-1);
  413. else
  414. cautbin(mij+1,dr);
  415. }
  416.  
  417. int main()
  418. {
  419. int n;
  420. cin>>n;
  421. int a,MAX=0;
  422. for(int i=1;i<=n;++i)
  423. {
  424. cin>>a;
  425. sume[i]=sume[i-1]+a;
  426. if(a>MAX)
  427. M[i]=MAX=a;
  428. else
  429. M[i]=MAX;
  430. }
  431. int q;
  432. cin>>q;
  433. while(q--)
  434. cin>>x>>s,cout<<cautbin(0,n)<<'\n';
  435. return 0;
  436. }
  437.  
  438. ----------------- PB 2273-----------------
  439.  
  440.  
  441. #include <bits/stdc++.h>
  442. #define nmax 200005
  443. #define oo 2000000001
  444. using namespace std;
  445.  
  446. int a[nmax], n;
  447.  
  448. int CautBin(int start)
  449. {
  450. int j, mid, s1, s2, st, dr, dif = oo;
  451. st = start; j = dr = n - 1;
  452. while (st <= dr)
  453. {
  454. mid = (st + dr) / 2;
  455. s1 = a[mid] - a[start - 1];
  456. s2 = a[n] - a[mid];
  457. if (s1 < s2)
  458. {
  459. if (dif > s2 - s1)
  460. {
  461. dif = s2 - s1;
  462. j = mid;
  463. }
  464. st = mid + 1;
  465. }
  466. else
  467. {
  468. if (dif > s1 - s2)
  469. {
  470. dif = s1 - s2;
  471. j = mid;
  472. }
  473. dr = mid - 1;
  474. }
  475. }
  476. return j;
  477. }
  478.  
  479. inline int Min(int x, int y, int z)
  480. {
  481. return min(min(x, y), z);
  482. }
  483.  
  484. inline int Max(int x, int y, int z)
  485. {
  486. return max(max(x, y), z);
  487. }
  488.  
  489. int main()
  490. {
  491. int i, j, difmin, P, Q, X, Y, Z, d;
  492. /// citire
  493. cin >> n;
  494. for (i = 1; i <= n; i++)
  495. cin >> a[i];
  496.  
  497. /// sume partiale
  498. for (i = 2; i <= n; i++)
  499. a[i] += a[i - 1];
  500.  
  501. /// pentru fiecare i=1..n-2 caut binar pozitia lui j
  502. P = 1; Q = 2;
  503. X = a[1]; Y = a[2] - a[1]; Z = a[n] - a[2];
  504. difmin = Max(X, Y, Z) - Min(X, Y, Z);
  505. for (i = 1; i <= n - 2; i++)
  506. {
  507. j = CautBin(i + 1);
  508. X = a[i];
  509. Y = a[j] - a[i];
  510. Z = a[n] - a[j];
  511. d = Max(X, Y, Z) - Min(X, Y, Z);
  512. if (d < difmin)
  513. {
  514. difmin = d;
  515. P = i; Q= j;
  516. }
  517. }
  518.  
  519. /// afisare
  520. cout << P << " " << Q << "\n";
  521.  
  522. return 0;
  523. }
  524.  
  525. ----------------- PB 661-----------------
  526.  
  527. #include <iostream>
  528. using namespace std;
  529.  
  530. int n, a[1005];
  531.  
  532. int main()
  533. {
  534. cin >> n;
  535. for(int i = 1 ; i <= n ; ++i)
  536. cin >> a[i];
  537.  
  538. int cnt = 0;
  539. for(int i = 1 ; i < n ; ++i)
  540. for(int j = i + 1 ; j <= n ; j ++)
  541. if(a[i] > a[j])
  542. {
  543. int aux = a[i];
  544. a[i] = a[j];
  545. a[j] = aux;
  546. }
  547.  
  548. for(int i = 1 ; i <= n - 2 ; ++i)
  549. for(int j = i + 1 ; j <= n - 1; j ++)
  550. {
  551. //caut cel mai din dreapta k astfel incat a[i] + a[j] > a[k]
  552. int st = j + 1, dr = n,k;
  553. while(st <= dr)
  554. {
  555. k = (st + dr) / 2;
  556. if(a[i] + a[j] > a[k])
  557. st = k + 1;
  558. else
  559. dr = k - 1;
  560. }
  561. cnt += dr - j;
  562. }
  563. cout << cnt << endl;
  564. return 0;
  565. }
  566.  
  567. ----------------- PB 2239-----------------
  568.  
  569. #include <iostream>
  570. #include <algorithm>
  571. using namespace std;
  572. int cautbin(int a[], int st, int dr, int x)
  573. {
  574. int m;
  575. while(st<=dr)
  576. {
  577. m=(st+dr)/2;
  578. if(a[m]==x)
  579. return m;
  580. else
  581. if(x<a[m])
  582. dr=m-1;
  583. else
  584. st=m+1;
  585. }
  586. return 0;
  587. }
  588.  
  589. int main()
  590. {
  591. int p[31],a[100001],n,i,j,nr=0,y,poz,k;
  592. cin>>n;
  593. for(i=1;i<=n;i++)
  594. cin>>a[i];
  595. sort(a+1,a+n+1);
  596. p[0]=1;
  597. for(i=1;i<=30;i++)
  598. p[i]=p[i-1]*2;
  599. for(i=1;i<n;i++)
  600. {
  601. for(j=1;j<=30;j++)
  602. {
  603. int s=p[j]-a[i];
  604. if(s>=a[i])
  605. {
  606. poz=cautbin(a,i+1,n,s);
  607. if(poz)
  608. {
  609. k=poz;
  610. while(a[k]==s&&k>i)
  611. {
  612. nr++;
  613.  
  614. k--;
  615. }
  616. k=poz+1;
  617. while(a[k]==s&&k<=n)
  618. {
  619. nr++;
  620.  
  621. k++;
  622. }
  623. }
  624. }
  625. }
  626. }
  627. cout<<nr;
  628. return 0;
  629. }
  630.  
  631. ----------------- PB 2276-----------------
  632.  
  633. /**
  634. Complexitate O(n log n + T log n)
  635. */
  636. #include <bits/stdc++.h>
  637. #define nmax 200003
  638. using namespace std;
  639.  
  640. int a[nmax], n;
  641.  
  642. /// cauta binar cea mai din stanga pozitie p
  643. /// cu proprietatea ca x <= a[p]
  644. int CautBin1(int x)
  645. {
  646. if (a[n] < x) return n + 1;
  647. if (x <= a[1]) return 1;
  648. int st, dr, m, p;
  649. st = 1; dr = n; p = 1;
  650. while (st <= dr)
  651. {
  652. m = (st + dr) / 2;
  653. if (x <= a[m])
  654. {
  655. p = m; dr = m - 1;
  656. }
  657. else st = m + 1;
  658. }
  659. return p;
  660. }
  661.  
  662. /// cauta binar cea mai din dreapta pozitie p
  663. /// cu proprietatea ca a[p] <= y
  664. int CautBin2(int y)
  665. {
  666. if (a[n] <= y) return n;
  667. if (a[1] > y) return 0;
  668. int st, dr, m, p;
  669. st = 1; dr = n; p = 1;
  670. while (st <= dr)
  671. {
  672. m = (st + dr) / 2;
  673. if (a[m] <= y)
  674. {
  675. p = m; st = m + 1;
  676. }
  677. else dr = m - 1;
  678. }
  679. return p;
  680. }
  681.  
  682. int main()
  683. {
  684. int i, p, q, T, x, y;
  685. cin >> n >> T;
  686. for (i = 1; i <= n; i++)
  687. cin >> a[i];
  688.  
  689. sort(a + 1, a + n + 1);
  690.  
  691. while (T--)
  692. {
  693. cin >> x >> y;
  694. p = CautBin1(x);
  695. q = CautBin2(y);
  696. cout << (q - p + 1) << "\n";
  697. }
  698.  
  699. return 0;
  700. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement