没有合适的资源?快使用搜索试试~ 我知道了~
1. #include<iostream> 3. using namespace std 9. {
资源详情
资源评论
资源推荐
2017 年华中科技大学 ACM 程序设计竞赛
暨武汉地区高校邀请赛(初赛)
网络赛题解
B - East Ninth Road
SOLUTION
用线段树维护区间最大子段,包含左端点的最大子段,
包含最右端的最大子段即可
STDCODE
1. #include<iostream>
2. #include<cstdio>
3. using namespace std;
4. struct data1{
5. int lm,rm,mx;
6. int sum;
7. int l,r;
8. }tree[2000001];
9. int n,m;
10. int a[500001];
11. void update(int k)
12. {
13. tree[k].sum=tree[k<<1].sum+tree[k<<1|1].sum;
14. tree[k].lm=max(tree[k<<1].lm,tree[k<<1].sum+tree[k<<1|1].lm);
15. tree[k].rm=max(tree[k<<1|1].rm,tree[k<<1].rm+tree[k<<1|1].sum);
16. tree[k].mx=max(max(tree[k<<1].mx,tree[k<<1|1].mx),tree[k<<1].rm+tree[k<
<1|1].lm);
17. }
18. void build(int k,int s,int t)
19. {
20. tree[k].l=s;tree[k].r=t;
21. if(s==t){tree[k].sum=tree[k].lm=tree[k].rm=tree[k].mx=a[s];return;}
22. int mid=(s+t)>>1;
23. build(k<<1,s,mid);
24. build(k<<1|1,mid+1,t);
25. update(k);
26. }
27. data1 ask(int k,int p,int q)
28. {
29. data1 g,h,a;
30. int l=tree[k].l,r=tree[k].r;
31. if(l==p&&q==r)return tree[k];
32. int mid=(l+r)>>1;
33. if(q<=mid) return ask(k<<1,p,q);
34. else if(p>mid) return ask(k<<1|1,p,q);
35. else{
36. g=ask(k<<1,p,mid);
37. h=ask(k<<1|1,mid+1,q);
38. a.mx=max(max(g.mx,h.mx),g.rm+h.lm);
39. a.rm=max(h.sum+g.rm,h.rm);
40. a.lm=max(g.lm,g.sum+h.lm);
41. return a;
42. }
43. }
44. void change(int k,int x,int y)
45. {
46. int l=tree[k].l,r=tree[k].r;
47. if(l==r){tree[k].sum=tree[k].lm=tree[k].rm=tree[k].mx=y;return;}
48. int mid=(l+r)>>1;
49. if(x<=mid)change(k<<1,x,y);
50. else if(x>mid)change(k<<1|1,x,y);
51. update(k);
52. }
53. int main()
54. {
55. freopen("input.in","r",stdin);
56. freopen("output.txt","w",stdout);
57. while(scanf("%d%d",&n,&m)==2){
58. for(int i=1;i<=n;i++)
59. scanf("%d",&a[i]);
60. build(1,1,n);
61. for(int i=1;i<=m;i++)
62. {
63. int t,x,y;
64. scanf("%d%d%d",&t,&x,&y);
65. if(t==1)
66. {
67. if(x>y)swap(x,y);
68. printf("%d\n",ask(1,x,y).mx);
69. }
70. if(t==2) change(1,x,y);
71. }
72. }
73.
74. return 0;
75. }
C - Rubik
SOLUTION
模拟题,写出 12 种旋转变换函数,注意细节即可。详见代
码。
STDCODE
1. #include <stdio.h>
2. #include <string.h>
3.
4. char str[1000];
5. char res[30];
6. int msk[30];
7.
8. void ClockRotate(int n, int *arr)
9. {
10. int i, t = res[arr[n - 1]];
11. for (i = n - 2; i >= 0; i--)
12. res[arr[i + 1]] = res[arr[i]];
13. res[arr[0]] = t;
14. }
15.
16. void U()
17. {
18. int i;
19. msk[0] = 1; msk[1] = 2;
20. msk[2] = 4; msk[3] = 3;
21. ClockRotate(4, msk);
22. msk[0] = 5; msk[1] = 13;
23. msk[2] = 9; msk[3] = 17;
24. ClockRotate(4, msk);
25. msk[0] = 6; msk[1] = 14;
26. msk[2] = 10; msk[3] = 18;
27. ClockRotate(4, msk);
28. }
29.
30. void F()
31. {
32. int i;
33. msk[0] = 5; msk[1] = 6;
34. msk[2] = 8; msk[3] = 7;
35. ClockRotate(4, msk);
36. msk[0] = 3; msk[1] = 17;
37. msk[2] = 22; msk[3] = 16;
38. ClockRotate(4, msk);
39. msk[0] = 4; msk[1] = 19;
40. msk[2] = 21; msk[3] = 14;
41. ClockRotate(4, msk);
42. }
43.
44. void B()
45. {
46. int i;
47. msk[0] = 9; msk[1] = 10;
48. msk[2] = 12; msk[3] = 11;
49. ClockRotate(4, msk);
50. msk[0] = 1; msk[1] = 15;
51. msk[2] = 24; msk[3] = 18;
52. ClockRotate(4, msk);
53. msk[0] = 2; msk[1] = 13;
54. msk[2] = 23; msk[3] = 20;
55. ClockRotate(4, msk);
56. }
57.
58. void L()
59. {
60. int i;
61. msk[0] = 13; msk[1] = 14;
62. msk[2] = 16; msk[3] = 15;
63. ClockRotate(4, msk);
64. msk[0] = 1; msk[1] = 5;
65. msk[2] = 21; msk[3] = 12;
66. ClockRotate(4, msk);
67. msk[0] = 3; msk[1] = 7;
68. msk[2] = 23; msk[3] = 10;
69. ClockRotate(4, msk);
70. }
71.
72. void R()
73. {
74. int i;
75. msk[0] = 17; msk[1] = 18;
76. msk[2] = 20; msk[3] = 19;
77. ClockRotate(4, msk);
78. msk[0] = 6; msk[1] = 2;
剩余33页未读,继续阅读
史努比狗狗
- 粉丝: 25
- 资源: 318
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功
评论0