Codeforces Round #174 DIV2

收获了8个hack,本来排名50+,结果C题没有用long long ,错过了一次绝佳的变紫机会...

 

A题:简单题。快速幂水过。

View Code

B题:简单题。没看清题目WA了一次。

View Code
 1 /*
 2 Author:Zhaofa Fang
 3 Lang:C++
 4 */
 5 #include <cstdio>
 6 #include <cstdlib>
 7 #include <sstream>
 8 #include <iostream>
 9 #include <cmath>
10 #include <cstring>
11 #include <algorithm>
12 #include <string>
13 #include <utility>
14 #include <vector>
15 #include <queue>
16 #include <stack>
17 #include <map>
18 #include <set>
19 using namespace std;
20 
21 typedef long long ll;
22 #define DEBUG(x) cout<< #x << ':' << x << endl
23 #define REP(i,n) for(int i=0;i < (n);i++)
24 #define REPD(i,n) for(int i=(n-1);i >= 0;i--)
25 #define FOR(i,s,t) for(int i = (s);i <= (t);i++)
26 #define FORD(i,s,t) for(int i = (s);i >= (t);i--)
27 #define PII pair<int,int>
28 #define PB push_back
29 #define MP make_pair
30 #define ft first
31 #define sd second
32 #define lowbit(x) (x&(-x))
33 #define INF (1<<30)
34 
35 
36 char str[200005];
37 int main(){
38     //freopen("in","r",stdin);
39     //freopen("out","w",stdout);
40     int n;
41     while(~scanf("%d",&n)){
42         scanf("%s",str);
43         int len = strlen(str);
44         int cnt = 0;
45         REP(i,len){
46             if(str[i] == 'I'){
47                 cnt++;
48             }
49         }
50         int ans = 0;
51         if(!cnt)
52         REP(i,len){
53             if(str[i] == 'A')ans++;
54 
55         }
56         else if(cnt == 1)ans = 1;
57         printf("%d\n",ans);
58     }
59     return 0;
60 }

C题:其实不难,但是long long 和操作1的成段更新卡死了一堆人,用了一个大数据收获8hack。我做法是用线段树来维护,但不用这么复杂也能做。

线段树
  1 /*
  2 Author:Zhaofa Fang
  3 Lang:C++
  4 */
  5 #include <cstdio>
  6 #include <cstdlib>
  7 #include <sstream>
  8 #include <iostream>
  9 #include <cmath>
 10 #include <cstring>
 11 #include <algorithm>
 12 #include <string>
 13 #include <utility>
 14 #include <vector>
 15 #include <queue>
 16 #include <stack>
 17 #include <map>
 18 #include <set>
 19 using namespace std;
 20 
 21 typedef long long ll;
 22 #define DEBUG(x) cout<< #x << ':' << x << endl
 23 #define REP(i,n) for(int i=0;i < (n);i++)
 24 #define REPD(i,n) for(int i=(n-1);i >= 0;i--)
 25 #define FOR(i,s,t) for(int i = (s);i <= (t);i++)
 26 #define FORD(i,s,t) for(int i = (s);i >= (t);i--)
 27 #define PII pair<int,int>
 28 #define PB push_back
 29 #define MP make_pair
 30 #define ft first
 31 #define sd second
 32 #define lowbit(x) (x&(-x))
 33 #define INF (1<<30)
 34 
 35 #define lson l , m , rt << 1
 36 #define rson m + 1 , r , rt << 1 | 1
 37 
 38 const int maxn = 200011;
 39 ll sum[maxn<<2];
 40 ll add[maxn<<2];
 41 
 42 void PushUp(int rt)
 43 {
 44     sum[rt] = sum[rt<<1] + sum[rt<<1|1];
 45 }
 46 void PushDown(int rt,int m)
 47 {
 48     if(add[rt])
 49     {
 50         add[rt<<1] += add[rt];
 51         add[rt<<1|1] += add[rt];
 52         sum[rt<<1] += add[rt]*(m - (m >> 1));
 53         sum[rt<<1|1] += add[rt]*(m >> 1);
 54         add[rt] = 0;
 55     }
 56 }
 57 
 58 void update(int L,int R,int val,int l,int r,int rt)
 59 {
 60     if(L <= l && r <= R)
 61     {
 62         add[rt] +=val;
 63         sum[rt] += val*(r - l + 1);
 64         return;
 65     }
 66     PushDown(rt , r - l + 1);
 67     int m =(l+r) >> 1;
 68     if(L <= m)update(L,R,val,lson);
 69     if(m < R)update(L,R,val,rson);
 70     PushUp(rt);
 71 }
 72 ll query(int L,int R,int l,int r,int rt)
 73 {
 74     if(L <= l && r <= R)
 75     {
 76         return sum[rt];
 77     }
 78     if(l == r)return 0;
 79     PushDown(rt , r - l + 1);
 80     int m = (l + r) >> 1;
 81     ll ret = 0;
 82     if(L <= m)ret += query(L,R,lson);
 83     if(m<R)ret += query(L,R,rson);
 84     return ret;
 85 }
 86 int main(){
 87     //freopen("in","r",stdin);
 88     //freopen("out","w",stdout);
 89     int n;
 90     stack<int>Q;
 91     scanf("%d",&n);
 92     memset(sum,0,sizeof(sum));
 93     memset(add,0,sizeof(add));
 94     int op,k,a,x;
 95     int len = 1;
 96     ll sum = 0;
 97     REP(i,n){
 98         scanf("%d",&op);
 99         double ans;
100         if(op == 1){
101             scanf("%d%d",&a,&x);
102             update(1,min(a,len),x,1,n,1);
103         }else if(op == 2){
104             scanf("%d",&k);
105             Q.push(k);
106             len ++;//DEBUG(sum);
107             sum+=k;
108         }else {
109             if(len>=2){
110                 int tmp = query(len,len,1,n,1);
111                 update(len,len,-tmp,1,n,1);
112                 sum -= Q.top();
113                 Q.pop();len--;
114             }
115         }
116         ans = 1.0*(query(1,len,1,n,1)+sum)/len;
117         printf("%.6f\n",ans);
118     }
119     return 0;
120 }

 D题:只是a1未知,设状态dp[i][0]为从step2开始的dp值,dp[i][1]则为step3,则有

   dp[i][0] = dp[i+ai][1] + ai;

   dp[i][1] = dp[i-ai][0] + ai;

  记忆化搜素一下,存在环则无解,当a1 = i;答案为dp[i+1][1]+i;

View Code
 1 /*
 2 Author:Zhaofa Fang
 3 Lang:C++
 4 */
 5 #include <cstdio>
 6 #include <cstdlib>
 7 #include <sstream>
 8 #include <iostream>
 9 #include <cmath>
10 #include <cstring>
11 #include <algorithm>
12 #include <string>
13 #include <utility>
14 #include <vector>
15 #include <queue>
16 #include <stack>
17 #include <map>
18 #include <set>
19 using namespace std;
20 
21 typedef long long ll;
22 #define DEBUG(x) cout<< #x << ':' << x << endl
23 #define REP(i,n) for(int i=0;i < (n);i++)
24 #define REPD(i,n) for(int i=(n-1);i >= 0;i--)
25 #define FOR(i,s,t) for(int i = (s);i <= (t);i++)
26 #define FORD(i,s,t) for(int i = (s);i >= (t);i--)
27 #define PII pair<int,int>
28 #define PB push_back
29 #define MP make_pair
30 #define ft first
31 #define sd second
32 #define lowbit(x) (x&(-x))
33 #define INF (1<<30)
34 
35 #define lson l , m , rt << 1
36 #define rson m + 1 , r , rt << 1 | 1
37 
38 const int maxn = 200011;
39 ll dp[maxn][2],a[maxn];
40 int n;
41 bool vist[maxn][2];
42 ll dfs(int p,int q){
43     if(p<=0 || p>n)return 0;
44     if(p == 1)return -1;
45     if(vist[p][q])return dp[p][q];
46     vist[p][q] = 1;
47     int tmp1;
48     if(!q)tmp1 = p + a[p];
49     else tmp1 = p - a[p];
50     ll tmp2 = dfs(tmp1,q^1);
51     if(tmp2 == -1)dp[p][q] = -1;
52     else dp[p][q] = tmp2 + a[p];
53     return dp[p][q];
54 }
55 
56 int main(){
57     //freopen("in","r",stdin);
58     //freopen("out","w",stdout);
59     memset(dp,-1,sizeof(dp));
60     scanf("%d",&n);
61     FOR(i,2,n)scanf("%I64d",a+i);
62     FOR(i,2,n){
63         if(!vist[i][0])dfs(i,0);
64         if(!vist[i][1])dfs(i,1);
65     }
66     FOR(i,1,n-1)
67         if(dp[i+1][1] == -1)puts("-1");
68         else printf("%I64d\n",dp[i+1][1]+i);
69     return 0;
70 }

 

posted @ 2013-03-18 10:55  發_  阅读(269)  评论(3编辑  收藏  举报