Training 2013.12

0.Codechef 
Strange Matrix 
http://www.codechef.com/problems/RRMATRIX
題意:求縱向分佈,橫向分佈重合數字個數
思路:設重合的座標爲i,j,那麼
(i-1)*m+j=(j-1)*n+i
(i-1)*m+(j-1)=(j-1)*n+(i-1)
(i-1)*(m-1)=(j-1)*(n-1)
i=(j-1)*(n-1)/(m-1)+1
特殊情況,m=1時答案爲n,n=1時答案爲m
然後直接看,枚舉j-1從0到m-1的話,i的範圍從1到n
那麼滿足的就是(n-1)和(m-1)約掉後剩下枚舉j-1看能整除多少次。
求g=gcd(n-1,m-1),那麼約分後的分母爲(m-1)/g,那麼枚舉j-1能整除的次數爲 (m-1)/((m-1)/g)+1
也就是 g+1.
Code: Strange Matrix.cpp



1.Codechef 
Chef and Segments
http://www.codechef.com/problems/CHMOD
題意:輸入n個數字(n<=10w,num<=100),求區間積對某值取餘
思路:100以內25個素數,設dp[maxn][25]分別記錄每個數字質因數分解之後的冪
然後掃一遍,累加起來,查詢的時候用快速冪取模ans*=Pow(prime[i],dp[r][i]-dp[l-1][i])%mod
當然其他的做法也有,可以用樹狀數組建25棵樹,但是沒什麼必要吧.
Code: Chef and Segments.cpp



2.Codechef
Matchsticks 
http://www.codechef.com/problems/MSTICK
題意:給出一列數表示火柴燃盡的時間,查詢表示點某一段區間的火柴,問全部燃盡要多久
思路:對於查詢區間先求最小值,然後求其餘區間的最大值,他們的和就是答案;
當然還要考慮的一種情況是,查詢區間的最大值和最小值的平均數也影響答案.
Code: Matchsticks.cpp



3.CSU 
Last digit
http://acm.csu.edu.cn/OnlineJudge/problem.php?id=1347
題意: 求f(n,k)=(1^k+2^k+...+n^k)%10 n,k<=10^9
思路: 對於k,直接取 k=k%euler(10)+euler(10)=k%4+4就ok,不解釋
對於n, 可以取 10 個一組,f(n,k)=(n/10)*f(10,k)+f(n%10,k)

(加強版:hdu 3369)

Code: csu1347.cpp




4.Codechef
Rectangular Queries
http://www.codechef.com/problems/RECTQUER
題意:給出矩陣的所有值(<=10),查詢某矩形範圍內出現不同數字的個數
思路:由於範圍比較小,用dp[i][j][k]表示數字i,從(1,1)到(j,k)之間出現的次數;
查詢矩形左上角(x1,y1)到右下角(x2,y2)間不同的數字個數
ans+=(dp[k][x2][y2]-(dp[k][x2][y1-1]+dp[k][x1-1][y2]-2*dp[k][x1-1][y1-1])-dp[k][x1-1][y1-1]>0)?1:0;
Code: Rectangular Queries.cpp



5.Codechef
Pairwise AND sum
http://www.codechef.com/problems/AND
題意:輸入n個數字,求sum+=a[i]&a[j] (i<j) n<10^5 a[i]<=10^6
思路:轉化成二進制,分別求第i位上累計有cnt個1,sum+=(cnt-1)*cnt/2*pow(2,i);
Code: Pairwise AND sum.cpp



6.Codechef
Chef and Gift
http://www.codechef.com/problems/CHGIFT1
題意:給出n個數字,現在往裏面添加‘+’ ‘-’ ‘*’忽略優先級,求答案的最小值
思路:這題數據有好幾種,做法是dp,用兩個值記錄當前的最大和最小值,掃一遍就ok
Code: Chef and Gift.cpp



7.Codechef 
Online Shopping
http://www.codechef.com/problems/COUPON/
題意:n個要買的物品,在m家有不同的價格,在第j家店買了第i件物品時,第i+1件物品可以享受一定的折扣
問買這n個物品的最少花費
思路:用index和mi分別表示當前買的最後一件物品在第index家店,總的花費最小爲mi
用滾動數組可以省內存,if(j==index) dp[0][j]=dp[1][j]+max(0,a[i][j]-b[i-1][j]);
else  dp[0][j]=min(dp[1][index]+a[i][j],dp[1][j]+max(0,a[i][j]-b[i-1][j]));
Code: Online Shopping.cpp



8.Codechef
Matrix
http://www.codechef.com/problems/MATRIX2/
題意:輸入一個n*m的01矩陣,計算這樣的三元組的個數(i,j,h),對於所有的二元組(x,y)屬於[1,h],if(y>=x)都要有a[i+x-1][j+y-1]等於1(貌似就是在說a[i+1][j]可以不必等於1)
思路:dp[i][j]用來表示當前處三元組中的h值
if(a[i][j]) dp[i][j]=min(dp[i-1][j-1],dp[i-1][j]);
else  dp[i][j]=0;
Code: Matrix.cpp



9.Codechef
Chef and Pie
http://www.codechef.com/problems/CHXORR
題意:從給定的n個數裏選出3個數,求這3個數異或的最大值(n<=2000)
思路:建一個二進制字典樹,(n^2)*lg(30)的複雜度找到異或的最大值。
建樹的過程看別人的代碼的,不過還是很好奇爲什麼小數據竟然很容易掛。

Code: Chef and Pie.cpp




10.Codechef
The Number Of Solutions
http://www.codechef.com/problems/CNTSOLS
題意:已知upper,d,m,N,求滿足 x1^d+x2^d+x3^d≡m(mod N)的三元組(x1,x2,x3)的個數
思路:對於模N的情況下,找到x有解的可能=upper/N+(upper%N>=x)?1:0;

然後用O(N^3)跑一遍就ok (n<=40)

Code: The Number Of Solutions.cpp

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章