POJ 2420
唔...似乎用G++提交,运行比C++快
![](https://i-blog.csdnimg.cn/blog_migrate/8f900a89c6347c561fdf2122f13be562.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/961ddebeb323a10fe0623af514929fc1.gif)
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 }
HDU 5183
用set做(参考自杜瑜皓)
![](https://i-blog.csdnimg.cn/blog_migrate/8f900a89c6347c561fdf2122f13be562.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/961ddebeb323a10fe0623af514929fc1.gif)
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 }
使用哈希表能快一点,内存也小一点:
![](https://i-blog.csdnimg.cn/blog_migrate/8f900a89c6347c561fdf2122f13be562.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/961ddebeb323a10fe0623af514929fc1.gif)
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 }
HDU 5233
二分解决
![](https://i-blog.csdnimg.cn/blog_migrate/8f900a89c6347c561fdf2122f13be562.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/961ddebeb323a10fe0623af514929fc1.gif)
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 }
今天补了一道15浙江理工12月校赛的基础题
DFS
![](https://i-blog.csdnimg.cn/blog_migrate/8f900a89c6347c561fdf2122f13be562.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/961ddebeb323a10fe0623af514929fc1.gif)
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 }
HDU 3478
比较巧妙地使用vis来表示是否来到过这个地方。
同时用%2来规避了过大的二维数组
![](https://i-blog.csdnimg.cn/blog_migrate/8f900a89c6347c561fdf2122f13be562.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/961ddebeb323a10fe0623af514929fc1.gif)
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 }
POJ 3037
矩阵快速幂练手
![](https://i-blog.csdnimg.cn/blog_migrate/8f900a89c6347c561fdf2122f13be562.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/961ddebeb323a10fe0623af514929fc1.gif)
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 }