A:直接贴过来装换
解题代码
1 // File Name: a.cpp 2 // Author: darkdream 3 // Created Time: 2014年10月06日 星期一 23时28分57秒 4 5 #include<vector> 6 #include<list> 7 #include<map> 8 #include<set> 9 #include<deque> 10 #include<stack> 11 #include<bitset> 12 #include<algorithm> 13 #include<functional> 14 #include<numeric> 15 #include<utility> 16 #include<sstream> 17 #include<iostream> 18 #include<iomanip> 19 #include<cstdio> 20 #include<cmath> 21 #include<cstdlib> 22 #include<cstring> 23 #include<ctime> 24 #define LL long long 25 26 using namespace std; 27 char str[102]; 28 char tp[4][100] = {"qwertyuiop", 29 "asdfghjkl;", 30 "zxcvbnm,./", 31 }; 32 int main(){ 33 scanf("%s",str); 34 if(str[0] == 'L') 35 { 36 scanf("%s",str); 37 for(int i = 0;i < strlen(str);i ++) 38 { 39 for(int j = 0;j <= 2;j ++) 40 { 41 if(strchr(tp[j],str[i])) 42 { 43 printf("%c",tp[j][strchr(tp[j],str[i]) - tp[j] +1]); 44 } 45 } 46 } 47 } 48 else{ 49 scanf("%s",str); 50 for(int i = 0;i < strlen(str);i ++) 51 { 52 for(int j = 0;j <= 2;j ++) 53 { 54 if(strchr(tp[j],str[i])) 55 { 56 printf("%c",tp[j][strchr(tp[j],str[i]) - tp[j] - 1]); 57 } 58 } 59 60 } 61 } 62 return 0; 63 }
B:一个标记或者二分就行,最大1e6的复杂度
1 // File Name: b.cpp 2 // Author: darkdream 3 // Created Time: 2014年10月06日 星期一 23时39分31秒 4 5 #include<vector> 6 #include<list> 7 #include<map> 8 #include<set> 9 #include<deque> 10 #include<stack> 11 #include<bitset> 12 #include<algorithm> 13 #include<functional> 14 #include<numeric> 15 #include<utility> 16 #include<sstream> 17 #include<iostream> 18 #include<iomanip> 19 #include<cstdio> 20 #include<cmath> 21 #include<cstdlib> 22 #include<cstring> 23 #include<ctime> 24 #define LL long long 25 26 using namespace std; 27 int a[100005]; 28 int b[100005]; 29 int n , m ; 30 int find(int x) 31 { 32 int l = 1; 33 int r = n; 34 while(l <= r) 35 { 36 int mid = (l + r)/2; 37 if(a[mid] < x) 38 { 39 l = mid + 1; 40 }else { 41 r = mid - 1; 42 } 43 } 44 return l; 45 } 46 int main(){ 47 scanf("%d",&n); 48 for(int i =1 ;i <= n;i ++) 49 { scanf("%d",&a[i]); 50 a[i] = a[i-1] + a[i]; 51 } 52 scanf("%d",&m); 53 for(int i =1 ;i <= m;i ++) 54 { 55 scanf("%d",&b[i]); 56 printf("%d ",find(b[i])); 57 } 58 return 0; 59 }
C:知道转换公式以后就是一个手速题
1 // File Name: c.cpp 2 // Author: darkdream 3 // Created Time: 2014年10月07日 星期二 00时41分28秒 4 5 #include<vector> 6 #include<list> 7 #include<map> 8 #include<set> 9 #include<deque> 10 #include<stack> 11 #include<bitset> 12 #include<algorithm> 13 #include<functional> 14 #include<numeric> 15 #include<utility> 16 #include<sstream> 17 #include<iostream> 18 #include<iomanip> 19 #include<cstdio> 20 #include<cmath> 21 #include<cstdlib> 22 #include<cstring> 23 #include<ctime> 24 #define LL long long 25 #define eps 1e-8 26 using namespace std; 27 struct node{ 28 double x,y,a,b; 29 }; 30 node a[5][5]; 31 node change(node tp) 32 { 33 node ans; 34 ans.a = tp.a; 35 ans.b = tp.b; 36 ans.x = tp.a - (tp.y - tp.b); 37 ans.y = tp.b + (tp.x - tp.a); 38 return ans; 39 } 40 int ans[0]; 41 double dis[5][5]; 42 double thedis(double x1, double y1, double x2,double y2) 43 { 44 return sqrt((x1-x2)*(x1-x2) + (y1-y2)*(y1-y2)) ; 45 } 46 int mi; 47 bool ok() 48 { 49 node tt[5]; 50 for(int i = 1;i <= 4;i ++) 51 { 52 tt[i] = a[i][ans[i]]; 53 } 54 for(int i = 1;i <= 4;i ++) 55 { 56 for(int j= 1;j <= 4 ; j ++) 57 { 58 dis[i][j] = thedis(tt[i].x,tt[i].y,tt[j].x,tt[j].y); 59 } 60 sort(dis[i] + 1,dis[i] + 1 + 4); 61 } 62 for(int i = 2;i <= 4;i ++) 63 for(int j = 1;j <= 4; j ++) 64 { 65 if(fabs(dis[i][j] - dis[i-1][j]) > eps) 66 return 0 ; 67 } 68 if(fabs(dis[1][4]-0 ) <eps) 69 return 0 ; 70 if(fabs(dis[1][3] - dis[1][2]) > eps) 71 return 0 ; 72 if(fabs(dis[1][3] * sqrt(2) - dis[1][4]) > eps) 73 return 0 ; 74 if(fabs(dis[1][3] - 0 ) < eps) 75 return 0 ; 76 if(fabs(dis[1][2] - 0 ) < eps) 77 return 0 ; 78 /*for(int i = 1;i <= 4;i ++) 79 { 80 for(int j = 1;j <= 4; j ++) 81 printf("%lf ",dis[i][j]); 82 printf(" "); 83 } 84 for(int i = 1;i<= 4;i ++) 85 printf("%lf %lf ",tt[i].x,tt[i].y); 86 87 */ 88 return 1; 89 } 90 void dfs(int k) 91 { 92 if(k == 5) 93 { 94 if(ok()) 95 { 96 if(ans[1] + ans[2] + ans[3] + ans[4] - 4< mi) 97 mi = ans[1] + ans[2] + ans[3] + ans[4] -4; 98 //printf("%d %d %d %d ",ans[1],ans[2],ans[3],ans[4]); 99 } 100 return; 101 } 102 for(int i = 1;i <= 4;i ++) 103 { 104 ans[k] = i ; 105 dfs(k+1); 106 } 107 } 108 int main(){ 109 int n; 110 scanf("%d",&n); 111 while(n--) 112 { 113 for(int i= 1;i <= 4;i ++) 114 scanf("%lf %lf %lf %lf",&a[i][1].x,&a[i][1].y,&a[i][1].a,&a[i][1].b); 115 for(int i = 1;i<= 4;i ++ ) 116 { 117 for(int j = 2;j <= 4;j ++) 118 a[i][j] = change(a[i][j-1]); 119 } 120 /* for(int i = 1;i<= 4;i ++ ) 121 { 122 for(int j = 1;j <= 4;j ++) 123 printf("%lf %lf ** ",a[i][j].x,a[i][j].y); 124 printf(" "); 125 }*/ 126 mi = 1000; 127 dfs(1); 128 if(mi == 1000) 129 printf("-1 "); 130 else printf("%d ",mi); 131 } 132 return 0; 133 }
D: dp,考虑最后这一位是R还是W即可
1 // File Name: d.cpp 2 // Author: darkdream 3 // Created Time: 2014年10月07日 星期二 00时21分01秒 4 5 #include<vector> 6 #include<list> 7 #include<map> 8 #include<set> 9 #include<deque> 10 #include<stack> 11 #include<bitset> 12 #include<algorithm> 13 #include<functional> 14 #include<numeric> 15 #include<utility> 16 #include<sstream> 17 #include<iostream> 18 #include<iomanip> 19 #include<cstdio> 20 #include<cmath> 21 #include<cstdlib> 22 #include<cstring> 23 #include<ctime> 24 #define LL long long 25 #define maxn 100004 26 #define M 1000000007 27 using namespace std; 28 int t, k ; 29 30 LL ans[maxn][2]; 31 LL sum[maxn]; 32 int main(){ 33 while(scanf("%d %d",&t,&k) != EOF) 34 { 35 ans[1][1] = 1; 36 ans[0][2] = 1; 37 38 if(k == 1 ) 39 ans[1][2] = 1; 40 else ans[1][2] = 0 ; 41 sum[0] = 0 ; 42 sum[1] = ans[1][1] + ans[1][2]; 43 for(int i = 2; i <= 100000;i ++) 44 { 45 ans[i][1] = (ans[i-1][1] + ans[i-1][2])%M ; 46 if(i >= k ) 47 ans[i][2] = (ans[i-k][1] + ans[i-k][2])%M; 48 else{ 49 ans[i][2] = 0 ; 50 } 51 sum[i] = (sum[i-1] + ans[i][1] + ans[i][2])%M; 52 // printf("%I64d ",sum[i]); 53 } 54 int a, b; 55 for(int i =1 ;i <= t;i ++) 56 { 57 scanf("%d %d",&a,&b); 58 printf("%I64d ",((sum[b] - sum[a-1])+ M)%M ); 59 } 60 61 } 62 return 0; 63 }
E:离散化,二分找端点值,线段树查找最大值
1 // File Name: e.cpp 2 // Author: darkdream 3 // Created Time: 2014年10月07日 星期二 01时29分07秒 4 5 #include<vector> 6 #include<list> 7 #include<map> 8 #include<set> 9 #include<deque> 10 #include<stack> 11 #include<bitset> 12 #include<algorithm> 13 #include<functional> 14 #include<numeric> 15 #include<utility> 16 #include<sstream> 17 #include<iostream> 18 #include<iomanip> 19 #include<cstdio> 20 #include<cmath> 21 #include<cstdlib> 22 #include<cstring> 23 #include<ctime> 24 #define LL long long 25 #define maxn 100005 26 using namespace std; 27 LL a[maxn]; 28 LL b[maxn]; 29 int la[maxn]; 30 int dp[maxn]; 31 map <LL,int> mp; 32 struct node{ 33 int l ,r; 34 int mx; 35 int site;; 36 }tree[maxn << 2]; 37 int L(int x) 38 { 39 return 2 * x; 40 } 41 int R(int x) 42 { 43 return 2 * x + 1 ; 44 } 45 void build(int c, int l , int r) 46 { 47 tree[c].l = l ; 48 tree[c].r = r; 49 tree[c].mx = 0 ; 50 tree[c].site = 0 ; 51 if(l == r) 52 { 53 return ; 54 } 55 build(L(c),l,(l+r)/2); 56 build(R(c),(l+r)/2+1,r); 57 } 58 void pushup(int c) 59 { 60 if(tree[L(c)].mx > tree[R(c)].mx) 61 { 62 tree[c].mx = tree[L(c)].mx; 63 tree[c].site = tree[L(c)].site; 64 }else { 65 tree[c].mx = tree[R(c)].mx; 66 tree[c].site = tree[R(c)].site; 67 } 68 } 69 void update(int c, int k,int st,int v ) 70 { 71 if(tree[c].l == tree[c].r && tree[c].l == k ) 72 { 73 tree[c].mx = v ; 74 tree[c].site = st ; 75 return ; 76 } 77 if(k <= (tree[c].l + tree[c].r)/2) 78 { 79 update(L(c),k,st,v); 80 }else { 81 update(R(c),k,st,v); 82 } 83 pushup(c); 84 } 85 int mx ; 86 int site; 87 void query(int c, int l ,int r) 88 { 89 if(tree[c].l>= l && tree[c].r <= r) 90 { 91 if(tree[c].mx > mx ) 92 { 93 mx = tree[c].mx; 94 site = tree[c].site ; 95 } 96 return; 97 } 98 int m = (tree[c].l + tree[c].r) /2; 99 if(l <= m) 100 query(L(c),l,r); 101 if(r > m) 102 query(R(c),l,r); 103 } 104 int n , d; 105 int find(LL x) 106 { 107 int l = 1; 108 int r = n; 109 while(l <= r ) 110 { 111 int m = (l + r)/2; 112 if(b[m] <= x) 113 { 114 l = m + 1; 115 }else { 116 r = m - 1; 117 } 118 } 119 return l; 120 } 121 void solve(int k ) 122 { 123 if(k == 0 ) 124 return; 125 solve(la[k]); 126 printf("%d ",k); 127 } 128 int main(){ 129 scanf("%d %d",&n,&d); 130 for(int i =1 ;i <= n;i ++) 131 { 132 scanf("%I64d",&a[i]); 133 b[i] = a[i]; 134 } 135 sort(b+1,b+1+n); 136 mp.clear(); 137 b[0] = 0 ; 138 int num = 0 ; ; 139 for(int i = 1;i <= n;i ++) 140 { 141 if(b[i] != b[i-1]) 142 { 143 num ++ ; 144 mp[b[i]] = num; 145 } 146 } 147 build(1,1,num); 148 //printf("****%d ",num); 149 int p = 0 ; 150 int pmx =0; 151 for(int i =1;i <= n;i ++) 152 { 153 int t = mp[a[i]]; 154 int l = find(a[i] - d); 155 int r = find(a[i] + d - 1); 156 157 mx = 0; 158 site = 0 ; 159 if(l != 1) 160 { 161 //printf("mp[b[l-1]] = %d ",mp[b[l-1]]); 162 query(1,1,mp[b[l-1]]); 163 } 164 if(r != n + 1) 165 { 166 //printf("mp[b[r]] = %d %d ",mp[b[r]],r); 167 query(1,mp[b[r]],num); 168 } 169 la[i] = site; 170 //if(mx != 0 || i == 1) 171 mx ++ ; 172 173 dp[i] = mx; 174 if(mx > pmx) 175 { 176 pmx = mx ; 177 p = i ; 178 } 179 //printf("%d %d %d ",t,i,mx); 180 update(1,t,i,mx); 181 // printf("%d %d %d %d ",t,mx,site,tree[1].mx); 182 } 183 184 printf("%d ",pmx); 185 solve(p); 186 /*printf(" "); 187 for(int i = 1;i <= n;i ++) 188 printf("%d ",la[i]); 189 190 */ 191 return 0; 192 }
F:用线段树统计 区间 gcd ,新建一个结构体 储存 值和下标, 找到gcd 以后 用两次二分 找到 区间内 gcd 值的个数即可
1 // File Name: f.cpp 2 // Author: darkdream 3 // Created Time: 2014年10月07日 星期二 21时25分35秒 4 5 #include<vector> 6 #include<list> 7 #include<map> 8 #include<set> 9 #include<deque> 10 #include<stack> 11 #include<bitset> 12 #include<algorithm> 13 #include<functional> 14 #include<numeric> 15 #include<utility> 16 #include<sstream> 17 #include<iostream> 18 #include<iomanip> 19 #include<cstdio> 20 #include<cmath> 21 #include<cstdlib> 22 #include<cstring> 23 #include<ctime> 24 #define LL long long 25 #define maxn 100005 26 using namespace std; 27 struct node{ 28 int l , r ; 29 int gcd; 30 }tree[maxn << 2]; 31 int a[maxn]; 32 struct node1{ 33 int v,p; 34 }b[maxn]; 35 int gcd(int x, int y ) 36 { 37 return y == 0 ? x:gcd(y,x%y); 38 } 39 int L(int x) 40 { 41 return 2 * x ; 42 } 43 int R(int x) 44 { 45 return 2 * x + 1 ; 46 } 47 void pushup(int c) 48 { 49 tree[c].gcd = gcd(tree[L(c)].gcd,tree[R(c)].gcd); 50 } 51 void build(int c, int l , int r) 52 { 53 tree[c].l = l ; 54 tree[c].r = r; 55 //printf("%d %d %d ",c,l,r); 56 if(l == r) 57 { 58 tree[c].gcd = a[l]; 59 return ; 60 } 61 int m = (l + r)/2; 62 build(L(c),l,m); 63 build(R(c),m+1,r); 64 pushup(c); 65 } 66 int cmp(node1 a, node1 b) 67 { 68 if(a.v == b.v) 69 { 70 return a.p < b.p ; 71 } 72 return a.v < b.v ; 73 } 74 int ans = 0 ; 75 76 void query(int c, int l, int r) 77 { 78 //printf("%d %d %d %d %d ",c,l,r,tree[c].l ,tree[c].r); 79 if(tree[c].l >= l && tree[c].r <= r) 80 { 81 ans = gcd(ans,tree[c].gcd); 82 return ; 83 } 84 int m = (tree[c].l + tree[c].r)/2; 85 if(l <= m) 86 query(L(c),l,r); 87 if(r > m ) 88 query(R(c),l,r); 89 } 90 int n ; 91 int find(int x) 92 { 93 int l = 1; 94 int r = n ; 95 while(l <= r) 96 { 97 int m = (l +r )/2; 98 if(b[m].v <= x) 99 { 100 l = m + 1; ; 101 }else { 102 r = m - 1; 103 } 104 } 105 return l ; 106 } 107 int ll, rr ; 108 int find1(int x) 109 { 110 int l = ll ; 111 int r = rr ; 112 while(l <= r) 113 { 114 int m = (l +r )/2; 115 if(b[m].p <= x) 116 { 117 l = m + 1; ; 118 }else { 119 r = m - 1; 120 } 121 } 122 return l ; 123 } 124 int main(){ 125 scanf("%d",&n); 126 for(int i =1;i <= n;i ++) 127 { 128 scanf("%d",&a[i]); 129 b[i].v = a[i]; 130 b[i].p = i; 131 } 132 build(1,1,n); 133 sort(b+1,b+n+1,cmp); 134 //for(int i =1 ;i <= n;i ++) 135 // printf("%d %d ",b[i].v,b[i].p); 136 int m ; 137 scanf("%d",&m); 138 for(int i = 1;i <= m;i ++) 139 { 140 int l , r ; 141 scanf("%d %d",&l,&r); 142 ans = a[l]; 143 query(1,l,r); 144 //printf("%d ",ans); 145 ll = find(ans-1); 146 if(b[ll].v != ans) 147 { 148 printf("%d ",r-l+1); 149 continue; 150 }else{ 151 rr = find(ans); 152 rr --; 153 int x, y ; 154 x = find1(l-1); 155 if(b[x].p > r) 156 { 157 printf("%d ",r-l+1); 158 continue; 159 }else{ 160 y = find1(r); 161 y -- ; 162 printf("%d ",r-l+1 - (y-x+1)); 163 } 164 } 165 166 } 167 return 0; 168 }