1. 程式人生 > >學大偉業 Day 1 培訓總結

學大偉業 Day 1 培訓總結

tricks 添加元素 需要 char 就是 關閉 struct %d IT

第一天培訓,講的基本算法,東西很多。還有些數論,圖論,數據結構and some small tricks

一.輸入輸出技巧

 1 //輸入輸出技巧
 2 /*
 3 scanf、printf:速度快,需要記憶不同數據類型的格式化字符串
 4 cin、cout:簡單,在某些情況下較慢
 5 getchar:讀入一個字符
 6 puts/gets:輸出/輸入一個字符串
 7 */ 
 8 #include<iostream>
 9 #include<cstdio>
10 #include<cstring>
11 #include<algorithm>
12 using
namespace std; 13 int main() 14 { int a,n,h,min; 15 char m[3]; 16 // 1.題目中不清楚輸入輸出的數據數量,可以用scanf的返回值解決。 17 while(scanf("%d",&a)!=EOF) 18 { 19 n++; 20 //..... 21 } 22 // 2.cin讀入字符串以空格、回車結束。scanf、getchar讀入字符串不會舍棄回車。gets讀入字符串以回車結束。 23 std::ios::sync_with_stdio(false
);//cin可以關閉同步加速。 24 25 // 3.scanf的妙用。舉個栗子。再輸入一個時間的時候,往往用字符串讀入再取出時間。但scanf可以直接取出時間。 26 scanf("%d:%d",&h,&min);//當在讀入時必須遇到‘:’才會繼續讀入,讀入的為兩個整數,就是時間。 27 }

二.數組的高級用法

 1 //基礎數據結構——數組
 2 /*
 3 數組很常見,同時也是很多高級數據結構的基礎
 4 數組也有很多妙用
 5 
 6 基本:儲存數據,做統計等
 7 擴展:部分和數組,差分數組
 8 */ 
 9 #include<iostream>
10
#include<cstdio> 11 #include<algorithm> 12 #include<cstring> 13 using namespace std; 14 int a[100]; 15 int sum[100];//部分和(前綴和)數組 sum[i]表示 a[i]+a[2]+...+a[i] 的值 16 int diff[100];//差分數組 17 int sumd[100];//差分數組diff的部分和數組 18 int main() 19 { 20 int n; 21 scanf("%d",&n); 22 for(int i=1;i<=n;i++) 23 scanf("%d",&a[i]); 24 25 //sum : 26 sum[1]=a[1]; 27 for(int i=2;i<=n;i++) 28 sum[i]=sum[i-1]+a[i]; 29 //用途:方便計算區間 L~R 的值num 30 int L,R; 31 scanf("%d%d",&L,&R); 32 int num=sum[R]-sum[L-1]; 33 34 //diff : 35 diff[1]=a[1]; 36 for(int i=2;i<=n;i++) 37 diff[i]=a[i]-a[i-1]; 38 //用途:差分數組適用於離線的區間修改問題 39 //常用結論:a[]的差分數組是diff[] 而diff[]的部分和數組是a[] 40 /*證明:sumd[i]=diff[1]+diff[2]+...+diff[i] 41 sumd[i]=a[1]+a[2]-a[1]+a[3]-a[2]+...+a[i]-a[i-1]=a[i]*/ 42 }

三.競賽樹

 1 //競賽樹
 2 /*
 3 針對添加元素的數量確定的情況
 4 使用多一倍的空間,換取代碼實現上的方便
 5 關鍵操作:上濾
 6 一種很奇怪的數據結構..也不算奇怪總之做題時會有用處的。
 7 數據都儲存在葉子節點,內部節點儲存子節點的較大值。 
 8 */ 
 9 #include<iostream>
10 using namespace std;
11 const int INF = 0x7fffffff/2;
12 const int MAXN = 5001;
13 struct tree{
14     int data[MAXN*2];
15     int n;
16     tree(int n)
17     {
18         this->n=n;
19         for(int i=1;i<=2*n-1;i++) data[i]=-INF;
20     }
21     void update(int pos, int value)
22     {
23         pos=pos+n-1;
24         data[pos]=value;
25         while(pos/=2) data[pos]=max(data[pos*2],data[pos*2+1]);
26     }
27     int top() { return data[1];}//返回最大值 
28     int toppos()//返回最大值的位置 
29     {
30         int pos=1;
31         while(pos<n)
32         {
33             if(data[pos]==data[pos*2]) pos=pos*2;
34             else pos=pos*2+1;
35         }
36         return pos-n+1;
37     } 
38 };
39 int main()
40 {
41     //.....
42 } 

四.快速冪

 1 //數論——快速冪
 2 /*
 3 計算 k^p%m 
 4 遞歸的版本(並不如位運算效率高),運算時采用乘法。
 5 其實可以改成加法,使用加法更不容易爆longlong.
 6 */ 
 7 #include<iostream> 
 8 #include<cstdio>
 9 using namespace std;
10 int pow1(int k,int p,int m)
11 {
12     if(p == 0) return 1;
13     long long ans = pow1(k,p/2,m);
14     return p%2==1?(ans*ans*k)%m:(ans*ans)%m;
15 }
16 long long pow2(long long k,long long p,long long m)
17 {
18     if(p==0) return 1;
19     long long ans=pow2(k,p/2,m);
20     return p%2==1?(ans+k)%m:(ans+ans)%m;
21 } 
22 int main()
23 {
24     long long k,p,m;
25     cin>>k>>p>>m;
26     cout<<k<<"^"<<p<<" mod "<<m<<"="<<pow2(k,p,m);
27     cout<<k<<"^"<<p<<" mod "<<m<<"="<<pow1(k,p,m);
28     return 0; 
29 }

學大偉業 Day 1 培訓總結