---------10.21
生活终于恢复正常了---
经过这一次---
真的该反思下--
读题不够准确
dp太弱
代码能力太弱
思维太差
在接下来的时间里,
真的是要好好加油-----
然后
不说了,,,
最后----
还是惯例地加油 ---------
gooooooooo
---------10.22
cf 385 c
http://codeforces.com/contest/385/problem/C
在筛素数的过程里面求和,再求一下前缀和
#include<cstdio> #include<cstring> #include<iostream> #include<algorithm> #include<vector> using namespace std; //wei ziji +u >_< const int maxn = 1e7+5; int vis[maxn],a[maxn],x[maxn],sum[maxn]; int n,m; void solve(){ for(int i = 2;i < maxn;i++){ if(vis[i]) continue; for(int j = i;j < maxn;j += i){ sum[i] += a[j]; vis[j] = 1; } } for(int i = 2;i < maxn;i++) sum[i] += sum[i-1]; // for(int i = 1;i <= 20;i++) printf("a[%d] = %d\n",i,a[i]); // for(int i = 1;i <= 20;i++) printf("sum[%d] = %d\n",i,sum[i]); } int main(){ while(scanf("%d",&n) != EOF){ memset(vis,0,sizeof(vis)); memset(a,0,sizeof(a)); memset(x,0,sizeof(x)); memset(sum,0,sizeof(sum)); for(int i = 1;i <= n;i++){ scanf("%d",&x[i]); a[x[i]]++; } solve(); scanf("%d",&m); for(int i = 1;i <= m;i++){ int l,r; scanf("%d %d",&l,&r); if(r > maxn-1) r = maxn-1; if(l > maxn-1) l = maxn-2; printf("%d\n",sum[r]-sum[l-1]); } } return 0; }
---------10.23
cf 242 c
http://codeforces.com/problemset/problem/242/C
一直在想怎么建图,,然后再跑最短路---还在想怎么去缩图---
sb了---
直接用map,bfs
#include<cstdio> #include<cstring> #include<iostream> #include<algorithm> #include<map> #include<queue> using namespace std; //wei ziji +u >_< typedef long long LL; int sx,sy,ex,ey; int n; int dir[8][2] = {1,0,1,1,0,1,-1,1,-1,0,-1,-1,0,-1,1,-1}; struct node{ int x,y,step; }; map<LL,int> g; LL f(int x,int y){ return 1LL*(x-1)*1e9 + 1LL*y; } void bfs(){ queue<node> q; q.push(node{sx,sy,0}); while(!q.empty()){ node u = q.front();q.pop(); // printf("u.x = %d u.y = %d\n",u.x,u.y); if(u.x == ex && u.y == ey){ printf("%d\n",u.step); return; } for(int i = 0;i < 8;i++){ int xx = u.x + dir[i][0]; int yy = u.y + dir[i][1]; if(g[f(xx,yy)] != 1) continue; if(g[f(xx,yy)] == -1) continue; g[f(xx,yy)] = -1; q.push(node{xx,yy,u.step+1}); } } puts("-1"); } int main(){ while(scanf("%d %d %d %d",&sx,&sy,&ex,&ey) != EOF){ g.clear(); scanf("%d",&n); g[f(sx,sy)] = g[f(ex,ey)] = 1; for(int i = 1;i <= n;i++){ int r,a,b; scanf("%d %d %d",&r,&a,&b); for(int j = a;j <= b;j++) g[f(r,j)] = 1; } bfs(); } return 0; }
---------10.24
做树形dp,,不会,,
搜题解----发现是分组背包----
发现分组背包还不会-----可以滚了---
hdu 1172
裸的分组背包吧--
1 #include<cstdio> 2 #include<cstring> 3 #include<iostream> 4 #include<algorithm> 5 using namespace std; 6 7 //wei ziji +u >_< 8 9 const int maxn = 105; 10 int dp[maxn],a[maxn][maxn]; 11 int n,m; 12 13 void solve(){ 14 for(int k = 1;k <= n;k++){ 15 for(int j = m;j >= 1;j--){ 16 for(int i = 1;i <= m;i++){ 17 if(j-i < 0) continue; 18 dp[j] = max(dp[j],dp[j-i]+a[k][i]); 19 // printf("dp[%d] = %d\n",j,dp[j]); 20 } 21 } 22 } 23 printf("%d\n",dp[m]); 24 } 25 26 int main(){ 27 while(scanf("%d %d",&n,&m) != EOF){ 28 if(n == 0 && m == 0) break; 29 memset(dp,0,sizeof(dp)); 30 memset(a,0,sizeof(a)); 31 for(int i = 1;i <= n;i++) 32 for(int j = 1;j <= m;j++) scanf("%d",&a[i][j]); 33 34 solve(); 35 36 } 37 return 0; 38 }
cf 276 d
http://codeforces.com/problemset/problem/276/D
给出一个区间,选出两个数使得它们的异或和最大
直接贪
1 #include<cstdio> 2 #include<cstring> 3 #include<algorithm> 4 using namespace std; 5 6 int main(){ 7 long long l,r; 8 scanf("%I64d%I64d",&l,&r); 9 if(l==r){ 10 puts("0"); 11 return 0; 12 } 13 bool flag=0; 14 int k; 15 long long ans=0LL; 16 for(int i=60;i>=0;i--){ 17 if(flag) { 18 ans|=1LL<<i; 19 continue; 20 } 21 if( (r& (1LL<<i)) == (l &(1LL<<i)) ) { 22 continue; 23 }else 24 flag=1,ans|=1LL<<i; 25 } 26 printf("%I64d",ans); 27 return 0; 28 }
cf 429 b
http://codeforces.com/problemset/problem/429/B
枚举相遇的格子,然后另外的就是像题目里面说的那样去转移
1 #include<cstdio> 2 #include<cstring> 3 #include<iostream> 4 #include<algorithm> 5 #include<vector> 6 using namespace std; 7 8 const int maxn = 1005; 9 int n,m; 10 int dp1[maxn][maxn],dp2[maxn][maxn]; 11 int f1[maxn][maxn],f2[maxn][maxn],a[maxn][maxn]; 12 13 void solve(){ 14 memset(dp1,0,sizeof(dp1)); memset(dp2,0,sizeof(dp2)); 15 memset(f1,0,sizeof(f1)); memset(f2,0,sizeof(f2)); 16 17 for(int i = 1;i <= n;i++){ 18 for(int j = 1;j <= m;j++){ 19 dp1[i][j] = max(dp1[i][j-1],dp1[i-1][j]) + a[i][j]; 20 // printf("dp1[%d][%d] = %d\n",i,j,dp1[i][j]); 21 } 22 } 23 24 for(int i = n;i >= 1;i--){ 25 for(int j = m;j >= 1;j--){ 26 dp2[i][j] = max(dp2[i+1][j],dp2[i][j+1]) + a[i][j]; 27 // printf("dp2[%d][%d] = %d\n",i,j,dp2[i][j]); 28 } 29 } 30 31 for(int i = n;i >= 1;i--){ 32 for(int j = 1;j <= m;j++){ 33 f1[i][j] = max(f1[i][j-1],f1[i+1][j]) + a[i][j]; 34 // printf("f1[%d][%d] = %d\n",i,j,f1[i][j]); 35 } 36 } 37 38 for(int i = 1;i <= n;i++){ 39 for(int j = m;j >= 1;j--){ 40 f2[i][j] = max(f2[i-1][j],f2[i][j+1]) + a[i][j]; 41 // printf("f2[%d][%d] = %d\n",i,j,f2[i][j]); 42 } 43 } 44 45 int res = 0; 46 for(int i = 2;i < n;i++){ 47 for(int j = 2;j < m;j++){ 48 // if((i-1) <= 1 || (i+1) >= n || (j-1) <= 1 || (j+1) >= m) continue; 49 int l = dp1[i-1][j] + dp2[i+1][j] + f1[i][j-1] + f2[i][j+1]; 50 int r = dp1[i][j-1] + dp2[i][j+1] + f1[i+1][j] + f2[i-1][j]; 51 res = max(res,max(l,r)); 52 } 53 } 54 printf("%d\n",res); 55 } 56 57 int main(){ 58 while(scanf("%d %d",&n,&m) != EOF){ 59 memset(a,0,sizeof(a)); 60 for(int i = 1;i <= n;i++) 61 for(int j = 1;j <= m;j++) scanf("%d",&a[i][j]); 62 63 solve(); 64 65 } 66 return 0; 67 }