lab – Telegram
213 subscribers
367 photos
354 videos
21 files
324 links
ما اینجا میم میزاریم بینش پست آموزشی
Download Telegram
سال ۲۰۱۱، icpc world final تو آمریکا برگزار شده بوده و این تیم دانشگاه شریفه و جالبه که یک زن داخل تیمه.
شریف ۶ تا سوال حل میکنه و ۱۳هم میشه که خیلی رتبه خفنیه.
خانمه اسمش سپیده مهابادیه که گویا الان تو شرکت ماکروسافت مشغول به کاره.
🔥8🤣1
lab
This picture shows how many problems I have solved in my life.
آپدیت:
بعد از حدوده پنج ماه شروع کردن CP و حل کردن ۲۸۴ تا مسئله الان به نظر خودم توانایی پیاده سازیم تو زبان پایتون بطور چشمگیری بهتر شده و کلی هم سی پلاس پلاس یادگرفتم. الان باید بیشتر هدفم رو بزارم رو یادگیری مباحثی مثل:‌dp, graph, number theory
🔥7
lab
How many soldiers are there in Han Xin's army? – If you let them parade in rows of 3 soldiers, two soldiers will be left. If you let them parade in rows of 5, 3 will be left, and in rows of 7, 2 will be left. این مسئله معروفه به قضیه باقی مانده چینی درواقع…
یک مسئله اینجا داریم:
یک عدد به ما میده که ما میتونیم اعداد اون عدد رو جابجا کنیم و بعد از ما میخواد بهش بگیم که ایا با باز آرایی کردن این عدد میتونیم کاری کنیم که به ۶۰ تقسیم پذیر بشه یا خیر.
در واقع این یک شکلی از قضیه باقی مانده چینی به حساب میاد واضحه که اگه بخوایم تمام جایگشت های اون عدد رو یکی یکی تست کنیم ببینیم به ۶۰ تقسیم پذیر هستن یا نه یکم دیر به جواب میرسیم و واقعن هم نیازی نیست. درواقع یک عدد وقتی به ۶۰ بخش پذیر هست که جمع اعدادش به ۳ بخش پذیر باشن و حداقل یک صفر و همچنین حداقل یک عدد زوج داخلش باشه. البته این برا زمانیه که بتونیم اعداد رو بازآرایی کنیم

لینک مسئله:
https://codeforces.com/problemset/problem/1266/A
👌2
lab
یک مسئله اینجا داریم: یک عدد به ما میده که ما میتونیم اعداد اون عدد رو جابجا کنیم و بعد از ما میخواد بهش بگیم که ایا با باز آرایی کردن این عدد میتونیم کاری کنیم که به ۶۰ تقسیم پذیر بشه یا خیر. در واقع این یک شکلی از قضیه باقی مانده چینی به حساب میاد واضحه…
از ما خواستن که یک آرایه بسازیم که p[p[i]] = i and p[i] ≠ i باشه. ظاهرش یکم نامفهومه ولی در اصل دنبال یک همچین ترتیبیه:
2 1 4 3
داشتم فکر میکردم چجوری میشه همچین چیزی رو ساخت که دیدم خیلی کد سی پلاس پلاسش بامزه شد.
#include <bits/stdc++.h>


using namespace std;
int main(){
int n;
cin >> n;
if (n % 2 == 1){
cout << -1 << "\n";
} else{
for (int i = 1; i <= n; i += 2){
cout << i+1 << " " << i << " ";
}
}
}


من دقت کردم توی سی پلاس پلاس کد زدن هر کسی استایل خودش رو داره و این خیلی بامزه ترش میکنه.

لینک مسئله:
https://codeforces.com/problemset/problem/233/A
👍2🔥1
دوتا کد اینجا داریم یکی به پایتون یکی به سی پلاس پلاس

for _ in range(int(input())):
n, m, k = map(int, input().split())
b = list(map(int, input().split()))
c = list(map(int, input().split()))
ans = 0
for i in b:
for j in c:
if i + j <= k:
ans += 1
print(ans)

و همین کد به سی پلاس پلاس:

#include <bits/stdc++.h>
using namespace std;


int main(){
ios::sync_with_stdio(0);
cin.tie(0);
int t;
cin >> t;
while(t--){
int n, m, k, ans = 0;
cin >> n >> m >> k;
int b[n], c[m];
for (int i = 0; i < n; i++){
cin >> b[i];
}
for (int i = 0; i < m; i++){
cin >> c[i];
}
for (int i = 0; i < n; i++){
for (int j = 0; j < m; j++){
if (b[i] + c[j] <= k){
ans++;
}
}
}
cout << ans << '\n';
}
}


لینک مسئله:
https://codeforces.com/problemset/problem/1941/A
اگه بخوایم بخش پذیری عددی رو به یک عدد که توان دو هستش مثل (۲، ۴، ۸، ۱۶،...) چک کنیم. میتونیم با توان اون عدد توان دویی اندش (&) کنیم.
چرا کار میده؟ چون اعداد توان دو (توان برابر k) حداقل k بیت پایانیشون صفره.
پس بنابراین اگه اون عدد هم K بیت پایانیش صفر باشه به عدد ما بخش پذیره.
فرض کنیم میخوایم زوج و فرد بودن n رو چک کنیم به سادگی میتونیم با کد پایین فقط با چک کردن یک بیت این کارو انجام بدیم:
if (n & 1)
cout << "Odd";
else
cout << "Even";

حالا چرا یک؟ چون 2¹ میشه 2 و در اصل k اینجا 1 هستش. یعنی یک بیت پایانی 0 هست.
به همین ترتیب اگه بخوایم بخش پذیری رو به 4 چک کنیم عدد رو به 3 اند میکنیم. چون 2 بیت پایانی 0 هست.
تو مسئله هایی که تعداد زیادی چک کردن بخش پذیری لازمه این روش کمک کنندس برای کم کردن زمان اجرا.
👍3🔥3
به یک مسئله برخوردم خیلی ساده از ما میخاد که یک آرایه از اعداد ۲ به توان n رو به دو قسمت مساوی تقسیم کنیم به شکلی که کمترین اختلاف ارزشی رو این دو قسمت داشته باشن. حالا از ما مینیموم اختلاف رو میخاد. اول با این ایده پیش رفتم که هر بار بزرگترین عدد و کوچکترین عدد رو بزاریم تو یکی از قسمت ها تا اعدادمون تموم بشه ولی خب کار نداد.
در نهایت به این نتیجه رسیدم که اگه بزرگترین عدد رو بزاریم تو یک قسمت و (n/2 -1) عدد کوچک رو بزاریم تو همون قسمت و باقی اعداد رو بزاریم تو قسمت بعدی همیشه به کمترین اختلاف میرسیم. بعد داشتم به پیاده سازیش فکر میکردم که یه نکته عجیب تر دیدم و اون اینکه اگه فقط جمع اعداد این آرایه رو تا n/2 حساب کنیم مینیموم اختلاف رو بهمون میده. همچین چیزی:
#include <bits/stdc++.h>
#include <cmath>
using namespace std;

typedef long long ll;

// Solve function
void solve(){
ll n;
cin >> n;
ll ans = 0;
for (int i = 1; i <= n / 2; i++){
ans += pow(2, i);
}
cout << ans << "\n";
}

// Main function
int main() {
ios::sync_with_stdio(0);
cin.tie(0);
int t = 1;
cin >> t;
while(t--){
solve();
}
return 0;
}

لینک مسئله:
https://codeforces.com/problemset/problem/1348/A
قبول دارم مسئله هایی که مطرح میکنم خیلی ساده ان ولی هرکدوم یه نکته قشنگی دارن.
👍4👏1
شکل کد رو ببین چه بامزه شد:

for _ in range(int(input())):
s = input()
if len(s) >= 3:
if int(s[0]) == 1 and int(s[1]) == 0 and int(s[2]) != 0:
if int(s[2]) == 1:
if len(s) >= 4:
print("YES")
continue
else:
print("NO")
continue
print("YES")
continue
print("NO")


مربوط به مسئله:
https://codeforces.com/problemset/problem/2000/A

منو یاد اون پروژه انداخت که طرف امده بود یک کدی نوشته بود که یک دونات رو با استفاده از یکسری کاراکتر جنریت میکرد.

             i,j,k,x,y,o,N;
main(){float z[1760],a
#define R(t,x,y) f=x;x-=t*y\
;y+=t*f;f=(3-x*x-y*y)/2;x*=f;y*=f;
=0,e=1,c=1,d=0,f,g,h,G,H,A,t,D;char
b[1760];for(;;){memset(b,32,1760);g=0,
h=1;memset(z,0,7040);for(j=0;j<90;j++){
G=0,H=1;for(i=0;i<314;i++){A=h+2,D=1/(G*
A*a+g*e+5);t=G*A *e-g*a;x=40+30*D
*(H*A*d-t*c);y= 12+15*D*(H*A*c+
t*d);o=x+80*y;N =8*((g*a-G*h*e)
*d-G*h*a-g*e-H*h *c);if(22>y&&y>
0&&x>0&&80>x&&D>z[o]){z[o]=D;b[o]=(N>0
?N:0)[".,-~:;=!*#$@"];}R(.02,H,G);}R(
.07,h,g);}for(k=0;1761>k;k++)putchar
(k%80?b[k]:10);R(.04,e,a);R(.02,d,
c);usleep(15000);printf('\n'+(
" donut.c! \x1b[23A"));}}
/*no math lib needed
.@a1k0n 2021.*/


اینجا میتونید بیشتر راجبش بخونید:
https://www.a1k0n.net/2011/07/20/donut-math.html
برا اینکه میخواسته خلاصه نویسی کنه موقع کامپایل باید یسری فلگ استفاده کنید که به کامپایلر بفهمونید از اخطار ها صرف نظر کنه.

ظاهر عادی کد همچین چیزی میشه:
#include <stdint.h>
#include <stdio.h>
#include <string.h>
#include <unistd.h>

#define R(mul,shift,x,y) \
_=x; \
x -= mul*y>>shift; \
y += mul*_>>shift; \
_ = 3145728-x*x-y*y>>11; \
x = x*_>>10; \
y = y*_>>10;

int8_t b[1760], z[1760];

void main() {
int sA=1024,cA=0,sB=1024,cB=0,_;
for (;;) {
memset(b, 32, 1760); // text buffer
memset(z, 127, 1760); // z buffer
int sj=0, cj=1024;
for (int j = 0; j < 90; j++) {
int si = 0, ci = 1024; // sine and cosine of angle i
for (int i = 0; i < 324; i++) {
int R1 = 1, R2 = 2048, K2 = 5120*1024;

int x0 = R1*cj + R2,
x1 = ci*x0 >> 10,
x2 = cA*sj >> 10,
x3 = si*x0 >> 10,
x4 = R1*x2 - (sA*x3 >> 10),
x5 = sA*sj >> 10,
x6 = K2 + R1*1024*x5 + cA*x3,
x7 = cj*si >> 10,
x = 40 + 30*(cB*x1 - sB*x4)/x6,
y = 12 + 15*(cB*x4 + sB*x1)/x6,
N = (-cA*x7 - cB*((-sA*x7>>10) + x2) - ci*(cj*sB >> 10) >> 10) - x5 >> 7;

int o = x + 80 * y;
int8_t zz = (x6-K2)>>15;
if (22 > y && y > 0 && x > 0 && 80 > x && zz < z[o]) {
z[o] = zz;
b[o] = ".,-~:;=!*#$@"[N > 0 ? N : 0];
}
R(5, 8, ci, si) // rotate i
}
R(9, 7, cj, sj) // rotate j
}
for (int k = 0; 1761 > k; k++)
putchar(k % 80 ? b[k] : 10);
R(5, 7, cA, sA);
R(5, 8, cB, sB);
usleep(15000);
printf("\x1b[23A");
}
}
👌1
امروز داشتم میرور استریم مسابقه icpc world final 2022 رو میدیدم.
چونکه از سنشوت گذشته نمیتونن رسمی داخل مسابقه شرکت کنن ولی چون خفنن هرسال دعوت میشن که سوالات رو حل کنن. یکیشون Gennady Korotkevich ملقب به tourist نفر اول جهان تو کدفورسز و یکی دیگشون هم Petr Mitrichev که روسیه و الان ۴۰ سالشه و اونم آدم خفنیه و الان تو گوگل مشغوله اون سومی هم آدم خفنیه ولی اسمش زیاد مهم نیست.
خیلی سوتی های باحالی میدن مثل سابمیت کردن یک سوال رو یک سوال دیگه. یا یجایی توریست یه تغییری تو کدش میده و باز سابمیت میکنه و هم تیمیش میگه سیو نکرده بودیا. بعد سیو می‌کنه و دوباره سابمیت می‌کنه و بازم اکسپت نمیگیره. اگه شرکت کرده باشین اینجور مسابقات این اتفاقات براتون آشناست.

لینک استریم:
https://youtu.be/yhp1WLp02nE?si=Gz852wznFBMR-B-K
👍3
مثل دروغ ۱۳ ما، خارجی ها هم April fool's day دارن.
روز اول ماه آوریل به دروغ و شوخی همدیگه رو دست میندازن.
بعد این باحاله که تو کدفورسز یک مسابقه ای این روز هرساله برگزار میشه که شکل سوال هاش بدونه توضیحن و باید خارج از منطق روشون فکر کنید.

تو مسئله بالایی نکته اینه که از بالا سمت چپ کاراکتر هایی رو که چراغ راهنمایی دارن کنار هم بزاریم و میشه print safety و در اصل سوال ازمون میخاد که کلمه safety رو چاپ کنیم
🔥2
lab
مثل دروغ ۱۳ ما، خارجی ها هم April fool's day دارن. روز اول ماه آوریل به دروغ و شوخی همدیگه رو دست میندازن. بعد این باحاله که تو کدفورسز یک مسابقه ای این روز هرساله برگزار میشه که شکل سوال هاش بدونه توضیحن و باید خارج از منطق روشون فکر کنید. تو مسئله بالایی…
از مسئله های مسابقه امروز این رویداد بود.
از این بازی شانسی هاست که یدونه توپ میندازی و باید از سوراخ های پایین رد بشه و برسه به منطقه سبز رنگ. حالا ازمون میخاد که ۱۰ بار پشت سر هم بازی رو ببریم.
تو هرکدوم از خونه های 0 تا 16 اگه بندازیم توپمون رو شانس این که هر ده بار بتونیم ببریم خیلی کمه.
ولی نکته مسئله اینجاست که منطقه سبز رنگ محدود نیست یعنی هر عددی بجز 0 تا 16 میتونه مارو برنده کنه.

مثال بارز خارج چارچوب فکر کردن.
🔥2👍1
lab
https://youtu.be/whaSGginU7g?si=jsH8usQPH1oQ7BDW
خیلی رندوم عکسامون رو تو لینکدین پیدا کردم. همچنان بهترین تجربه
سمت راست تصویر تیمی که دوم شد نشسته و سمت چپ تصویر تیم سوم
🥰6🔥1