最近复习题

POJ 2420

http://poj.org/problem?id=2420

唔...似乎用G++提交,运行比C++快

 1 #include <cstdio>
 2 #include <cstring>
 3 #include <iostream>
 4 #include <algorithm>
 5 #include <vector>
 6 #include <queue>
 7 #include <set>
 8 #include <map>
 9 #include <cmath>
10 #include <cstdlib>
11 
12 #define rep(i,a,n) for(int i = a;i <= n;i++)
13 #define per(i,n,a) for(int i = n;i >= a;i--)
14 #define pb push_back
15 #define VI vector<int>
16 #define QI queue<int>
17 #define logM(N) log10(N)/log10(M)
18 #define eps 1e-8
19 #define INF 0x3f3f3f3f
20 
21 typedef long long ll;
22 typedef double dd;
23 
24 using namespace std;
25 
26 const int M = 110;
27 int T;
28 dd minx,maxx,miny,maxy;
29 
30 struct node{
31     int x;
32     int y;
33 }edge[M];
34 
35 double cal(dd x,dd y){
36     dd res = 0.0;
37     rep(i,1,T){
38         res += sqrt(pow(x - edge[i].x,2)+pow(y - edge[i].y,2));     
39     }
40     return res;
41 }
42 
43 double solve(dd x){
44     miny = -INF;
45     maxy = INF;
46     while(miny < maxy - eps){
47         dd midy1 = miny + (maxy - miny)/2;
48         dd midy2 = midy1 + (maxy - midy1)/2;
49         if(cal(x,midy1) < cal(x,midy2)){
50             maxy = midy2;
51         }
52         else{
53             miny = midy1;
54         }
55     }
56     return cal(x,miny);
57 }
58 
59 int main()
60 {
61     //freopen("in.txt","r",stdin);
62     //freopen("out.txt","w",stdout);
63     while(~scanf("%d",&T)){
64         rep(i,1,T){
65             int m,n;
66             scanf("%d%d",&m,&n);
67             edge[i].x = m;
68             edge[i].y = n;      
69         }
70         minx = -INF;
71         maxx = INF;
72         
73         while(minx < maxx - eps){
74             dd midx1 = minx + (maxx - minx)/2;
75             dd midx2 = midx1 + (maxx - midx1)/2;
76             if(solve(midx1) < solve(midx2)){
77                 maxx = midx2;
78             } 
79             else{
80                 minx = midx1;
81             }
82         }
83         printf("%.f\n",solve(minx));
84     }    
85     return 0;
86 }
View Code

 HDU 5183 

http://acm.hdu.edu.cn/showproblem.php?pid=5183

用set做(参考自杜瑜皓)

 1 #include <cstdio>
 2 #include <cstring>
 3 #include <iostream>
 4 #include <algorithm>
 5 #include <vector>
 6 #include <queue>
 7 #include <set>
 8 #include <map>
 9 #include <cmath>
10 #include <cstdlib>
11 
12 #define rep(i,a,n) for(int i = a;i <= n;i++)
13 #define per(i,n,a) for(int i = n;i>=a;i--)
14 #define pb push_back
15 #define VI vector<int>
16 #define QI queue<int>
17 #define logM(N) log10(N)/log10(M)
18 #define eps 1e-8
19 
20 typedef long long ll;
21 
22 using namespace std;
23 
24 const int N = 1e6 + 10;
25 int n;
26 ll ai,k;
27 ll a[N] = {};
28 ll s[N] = {};
29 set<ll> hs;
30 
31 bool check(){
32     hs.clear();
33     per(i,n,1){
34         hs.insert(s[i]);
35         ll v = k;
36         if(i%2==0){
37             v *= -1;
38         }
39         v += s[i-1];
40         if(hs.count(v)){
41             return true;
42         }
43     }        
44     return false;
45 }
46 
47 int main()
48 {
49     //freopen("in.txt","r",stdin);
50     //freopen("out.txt","w",stdout);
51     int T,_;
52     scanf("%d",&T);
53     _ = 0;
54     while(T--){
55         memset(a,0,sizeof(a));
56         memset(s,0,sizeof(s));
57         scanf("%d%I64d",&n,&k);
58         rep(i,1,n){
59             scanf("%I64d",&a[i]);
60             if(i&1){
61                 s[i] = s[i-1] + a[i];
62             }
63             else{
64                 s[i] = s[i-1] - a[i];
65             }
66         }   
67         printf("Case #%d: ",++_);
68         if(check()){
69             puts("Yes.");
70         } 
71         else{
72             puts("No.");
73         }
74     } 
75     return 0;
76 }
View Code

 使用哈希表能快一点,内存也小一点:

  1 #include <cstdio>
  2 #include <cstring>
  3 #include <iostream>
  4 #include <algorithm>
  5 #include <vector>
  6 #include <queue>
  7 #include <set>
  8 #include <map>
  9 #include <cmath>
 10 #include <cstdlib>
 11 
 12 #define rep(i,a,n) for(int i = a;i <= n;i++)
 13 #define per(i,n,a) for(int i = n;i>=a;i--)
 14 #define pb push_back
 15 #define VI vector<int>
 16 #define QI queue<int>
 17 #define logM(N) log10(N)/log10(M)
 18 #define eps 1e-8
 19 
 20 typedef long long ll;
 21 
 22 using namespace std;
 23 
 24 const int MOD = 1e6 + 10;
 25 int n,side;
 26 ll k,sum;
 27 ll a[MOD] = {};
 28 ll head[MOD] = {};
 29 
 30 struct node{
 31     ll s;
 32     ll nxt;
 33 }edge[MOD];
 34 
 35 void init(){
 36     side = 0;
 37     sum = 0;
 38     memset(head,-1,sizeof(head));
 39     memset(a,0,sizeof(a));
 40 }
 41 
 42 void insert(ll n){
 43     int _n = n % MOD;
 44     if(_n < 0){
 45         _n += MOD;
 46     }
 47     edge[side] = {n,head[_n]};
 48     head[_n] = side++;
 49 }
 50 
 51 bool find(ll n){
 52     int _n = n % MOD;
 53     if(_n < 0){
 54         _n += MOD;
 55     }
 56     for(int i = head[_n]; ~i ; i = edge[i].nxt){
 57         if(edge[i].s == n){
 58             return true;
 59         }
 60     }
 61     return false;
 62 }
 63 
 64 bool check(){
 65     per(i,n,1){
 66         if(i&1){
 67             sum -= a[i];
 68         }
 69         else{
 70             sum += a[i];
 71         }
 72         if(i&1){
 73             if(find(sum+k)){
 74                 return true;
 75             }
 76         }
 77         else{
 78             if(find(sum-k)){
 79                 return true;
 80             }
 81         }
 82         insert(sum);
 83     }
 84     return false;
 85 }
 86 
 87 int main()
 88 {
 89     //freopen("in.txt","r",stdin);
 90     //freopen("out.txt","w",stdout);
 91     int T,_;
 92     scanf("%d",&T);
 93     _ = 0;
 94     while(T--){
 95         init();
 96         scanf("%d%I64d",&n,&k);
 97         rep(i,1,n){
 98             scanf("%I64d",&a[i]);
 99         } 
100         insert(0);
101         printf("Case #%d: ",++_);       
102         if(check()){
103             puts("Yes.");
104         }
105         else{
106             puts("No.");
107         }
108     } 
109     return 0;
110 }
View Code

 HDU 5233

http://acm.hdu.edu.cn/showproblem.php?pid=5233

二分解决

 1 #include <cstdio>
 2 #include <cstring>
 3 #include <iostream>
 4 #include <algorithm>
 5 #include <vector>
 6 #include <queue>
 7 #include <set>
 8 #include <map>
 9 #include <cmath>
10 #include <cstdlib>
11 
12 #define rep(i,a,n) for(int i = a;i <= n;i++)
13 #define per(i,n,a) for(int i = n;i>=a;i--)
14 #define pb push_back
15 #define VI vector<int>
16 #define QI queue<int>
17 #define logM(N) log10(N)/log10(M)
18 #define eps 1e-8
19 
20 typedef long long ll;
21 
22 using namespace std;
23 
24 const int N = 1e7 + 10;
25 int n,m;
26 
27 struct node{
28     ll h;
29     int p;
30     bool is;
31 }edge[N];
32 
33 
34 bool cmp(node x,node y){
35     if(x.h < y.h){
36         return true;
37     }
38     if(x.h > y.h){
39         return false;
40     }
41     return x.p < y.p;
42 }
43 
44 int find(ll x){
45     ll low = 1;
46     ll high = n;
47     ll mid;
48     while(low < high ){
49         mid = (low + high)>>1;
50         if(edge[mid].h > x){
51             high = mid;
52         }
53         else if(edge[mid].h < x){
54             low = mid+1;
55         }
56         else if(edge[mid].is){
57             high = mid;
58         }
59         else{
60             low = mid+1;
61         }
62     }
63     if(edge[low].is && edge[low].h == x){
64         edge[low].is = false;
65         return edge[low].p;
66     }
67     else{
68         return -1;
69     }
70 }
71 
72 int main()
73 {
74     //freopen("in.txt","r",stdin);
75     //freopen("out.txt","w",stdout);
76     while(~scanf("%d%d",&n,&m)){
77         rep(i,1,n){
78             scanf("%I64d",&edge[i].h);
79             edge[i].p = i;
80             edge[i].is = true;            
81         }       
82         sort(edge+1,edge+n+1,cmp);
83         ll q;
84         rep(i,1,m){
85             scanf("%I64d",&q);
86             printf("%d\n",find(q));
87         }
88     }
89     return 0;
90 }
View Code

今天补了一道15浙江理工12月校赛的基础题

DFS

http://oj.acm.zstu.edu.cn/JudgeOnline/problem.php?id=4210

 1 #include <cstdio>
 2 #include <cstring>
 3 #include <iostream>
 4 #include <algorithm>
 5 #include <vector>
 6 #include <queue>
 7 #include <set>
 8 #include <map>
 9 #include <cmath>
10 #include <cstdlib>
11  
12 #define rep(i,a,n) for(int i = a;i <= n;i++)
13 #define per(i,n,a) for(int i = n;i>=a;i--)
14 #define pb push_back
15 #define VI vector<int>
16 #define QI queue<int>
17 #define logM(N) log10(N)/log10(M)
18 #define eps 1e-8
19  
20 typedef long long ll;
21  
22 using namespace std;
23  
24 int n,m;
25  
26 int dfs(int x,int y,int num){
27     if(x == 0 && y == 0 && num ==0){
28         return 1;
29     }
30     if(x == -1|| y == -1 || num == 0){
31         return 0;
32     }
33     return dfs(x-1,y,num<<1) + dfs(x,y-1,num-1);
34 }
35  
36 int main()
37 {
38     //freopen("in.txt","r",stdin);
39     //freopen("out.txt","w",stdout);
40     while(~scanf("%d%d",&n,&m)){
41         printf("%d\n",dfs(n,m,2));        
42     }
43     return 0;
44 }
View Code

 HDU 3478

http://acm.hdu.edu.cn/showproblem.php?pid=3478

比较巧妙地使用vis来表示是否来到过这个地方。

同时用%2来规避了过大的二维数组

 1 #include <cstdio>
 2 #include <cstring>
 3 #include <iostream>
 4 #include <algorithm>
 5 #include <vector>
 6 #include <queue>
 7 #include <set>
 8 #include <map>
 9 #include <cmath>
10 #include <cstdlib>
11 
12 #define rep(i,a,n) for(int i = a;i <= n;i++)
13 #define per(i,n,a) for(int i = n;i>=a;i--)
14 #define pb push_back
15 #define VI vector<int>
16 #define QI queue<int>
17 #define logM(N) log10(N)/log10(M)
18 #define eps 1e-8
19 
20 typedef long long ll;
21 
22 using namespace std;
23 
24 const int N = 1e6 + 10;
25 int n,m,s,u,v;
26 VI a[N];
27 bool vis[N][2] = {};
28 
29 struct node{
30     int p;
31     int step;
32 };
33 
34 void bfs(){
35     node now,nxt;
36     now.p = s;now.step = 0;
37     queue<node> que;
38     que.push(now);
39     while(!que.empty()){
40         now = que.front();
41         que.pop();
42         for(int i = 0;i < a[now.p].size();i++){
43             nxt.p = a[now.p][i];
44             nxt.step = now.step + 1;
45             if(!vis[nxt.p][nxt.step%2]){
46                 vis[nxt.p][nxt.step%2] = true;
47                 que.push(nxt);
48             }
49         }
50     }
51     int cnt1=0,cnt2=0;
52     rep(i,0,n-1){
53         if(vis[i][0]){
54             cnt1++;
55         }
56         if(vis[i][1]){
57             cnt2++;
58         }
59     }
60     if(cnt1 == n||cnt2 == n){
61         puts("YES");
62     }
63     else{
64         puts("NO");
65     }
66 }
67 
68 int main()
69 {
70     //freopen("in.txt","r",stdin);
71     //freopen("out.txt","w",stdout);
72     int T,_;
73     scanf("%d",&T);
74     _ = 0;
75     while(T--){
76         memset(vis,false,sizeof(vis));
77         scanf("%d%d%d",&n,&m,&s);
78         rep(i,0,n){
79             a[i].clear();
80         }        
81         rep(i,1,m){
82             scanf("%d%d",&u,&v);
83             a[u].pb(v);
84             a[v].pb(u);
85         }
86         printf("Case %d: ",++_);
87         bfs();
88     } 
89     return 0;
90 }
View Code

 POJ  3037

http://poj.org/problem?id=3037

矩阵快速幂练手

 1 #include <cstdio>
 2 #include <cstring>
 3 #include <iostream>
 4 #include <algorithm>
 5 #include <vector>
 6 #include <queue>
 7 #include <set>
 8 #include <map>
 9 #include <cmath>
10 #include <cstdlib>
11 
12 #define rep(i,a,n) for(int i = a;i <= n;i++)
13 #define per(i,n,a) for(int i = n;i>=a;i--)
14 #define pb push_back
15 #define VI vector<int>
16 #define QI queue<int>
17 #define logM(N) log10(N)/log10(M)
18 #define eps 1e-8
19 
20 typedef long long ll;
21 
22 using namespace std;
23 
24 const int MOD = 1e4;
25 int n;
26 ll sam[2][2] ={1,1,1,0};
27 
28 struct node{
29     ll mat[2][2];
30     node operator * (node r) const {
31         node ret;
32         memset(ret.mat,0,sizeof(ret.mat));
33         ret.mat[0][0] = mat[0][0] * r.mat[0][0] + mat[0][1] * r.mat[1][0];
34         ret.mat[0][1] = mat[0][0] * r.mat[0][1] + mat[0][1] * r.mat[1][1];
35         ret.mat[1][0] = mat[1][0] * r.mat[0][0] + mat[1][1] * r.mat[1][0];
36         ret.mat[1][1] = mat[1][0] * r.mat[0][1] + mat[1][1] * r.mat[1][1];
37         rep(i,0,1){
38             rep(j,0,1){
39                 ret.mat[i][j] %= MOD;
40             }
41         }
42         return ret;
43     }
44 };
45 
46 ll pow_mod(int n){
47     node a,b;
48     a.mat[0][0] = 1;a.mat[0][1] = 1;a.mat[1][0] = 1;a.mat[1][1] = 0;
49     b.mat[0][0] = 1;b.mat[0][1] = 1;b.mat[1][0] = 1;b.mat[1][1] = 0;
50     while(n!=0){
51         if(n&1) a = a * b;
52         b = b * b;
53         n >>= 1;
54     }
55     return a.mat[0][1];
56 }
57 
58 int main()
59 {
60 #ifndef ONLINE_JUDGE
61     freopen("in.txt","r",stdin);
62     //freopen("out.txt","w",stdout);
63 #endif
64     while(~scanf("%d",&n),n!=-1){
65         if(n){
66             printf("%I64d\n",pow_mod(n-1));
67         }
68         else{
69             puts("0");
70         }
71     }
72     return 0;
73 }
View Code

 

posted @ 2016-02-25 18:10  syuritsu  阅读(139)  评论(0编辑  收藏  举报