zoukankan      html  css  js  c++  java
  • Codeforces Round #267 (Div. 2)

    A.George and Accommodation

    题意:给定数组a,b,问b-a>=2有多少个

    思路:直接模拟。。

    B.Fedor and New Game

    题意:给定m+1个n位以内的二进制数,求前m个有多少个跟第m+1的二进制下不同位数不超过k的个数

    思路:直接模拟

    C.George and Job

    题意:给定n个数,求k个的段,每段有m个连续得数,使得和最大

    思路:直接dp,注意long long不会超内存

     1 /*
     2  * Author:  Yzcstc
     3  * Created Time:  2014/9/18 23:24:07
     4  * File Name: a.cpp
     5  */
     6 #include<cstdio>
     7 #include<iostream>
     8 #include<cstring>
     9 #include<cstdlib>
    10 #include<cmath>
    11 #include<algorithm>
    12 #include<string>
    13 #include<map>
    14 #include<set>
    15 #include<vector>
    16 #include<queue>
    17 #include<stack>
    18 #include<ctime>
    19 #define repf(i, a, b) for (int i = (a); i <= (b); ++i)
    20 #define repd(i, a, b) for (int i = (a); i >= (b); --i)
    21 #define M0(x)  memset(x, 0, sizeof(x))
    22 #define Inf  0x7fffffff
    23 #define MP make_pair
    24 #define PB push_back
    25 #define eps 1e-8
    26 #define pi acos(-1.0)
    27 typedef long long LL;
    28 using namespace std;
    29 long long dp[5001][5001], sum[10000];
    30 int a[10000], n, m, k;
    31 int main(){
    32     freopen("a.in", "r", stdin);
    33     freopen("a.out", "w", stdout);
    34     int n;
    35     while (scanf("%d%d%d", &n, &m, &k) != EOF){
    36          //  M0(sum), M0(dp);
    37            for (int i = 1; i <= n; ++i)
    38                 scanf("%d", &a[i]), sum[i] =  sum[i-1] + a[i];
    39            for (int i = 1; i <= k; ++i){
    40                 for (int j = 1; j <= n; ++j)
    41                      if (j >= m) dp[i][j] = dp[i-1][j-m] + sum[j] - sum[j-m];
    42                 for (int j = 1; j <= n; ++j)
    43                      dp[i][j] = max(dp[i][j], dp[i][j-1]);    
    44            }
    45            long long ans = dp[k][n];
    46            cout << ans << endl;
    47             
    48     }
    49     return 0;
    50 }
    View Code

    D.Fedor and Essay

    题意:给定m个单词组成的一段话,并给出n组单词的变换,问替换后这段话的’r‘字符最少是多少,如果相同,总长度最短更优。。输出r字符及长度

    思路:很无聊的一道题,把变换看成有向边,单词看成点,那么就是一个图上的dp。。而且题目中还会出现环,还得缩点后才能dp。。略麻烦。。具体看代码吧。注意答案还是可能会超int。。然后比赛的时候莫名其妙的MlE了,赛后才发现是vector中用v.size()前没加int,以后要注意

      1 /*
      2  * Author:  Yzcstc
      3  * Created Time:  2014/9/19 0:08:06
      4  * File Name: d.cpp
      5  */
      6 #include<cstdio>
      7 #include<iostream>
      8 #include<cstring>
      9 #include<cstdlib>
     10 #include<cmath>
     11 #include<algorithm>
     12 #include<string>
     13 #include<map>
     14 #include<set>
     15 #include<vector>
     16 #include<queue>
     17 #include<stack>
     18 #include<ctime>
     19 #define repf(i, a, b) for (int i = (a); i <= (b); ++i)
     20 #define repd(i, a, b) for (int i = (a); i >= (b); --i)
     21 #define M0(x)  memset(x, 0, sizeof(x))
     22 #define Inf  0x7fffffff
     23 #define MP make_pair
     24 #define PB push_back
     25 #define eps 1e-8
     26 #define pi acos(-1.0)
     27 #define M 1000007
     28 typedef long long LL;
     29 #define MXN 201010
     30 using namespace std;
     31 int hash[MXN], have[MXN], len[MXN];
     32 int ha[MXN], hlen[MXN];
     33 int n, m, tot;
     34 char str[501010];
     35 map<int, int> mp;
     36 vector<int> e[220000];
     37 
     38 void init(){
     39      scanf("%d", &n);
     40      int sz;
     41      mp.clear();
     42      for (int i = 1; i <= n; ++i){
     43            scanf("%s", &str);
     44            sz = len[i] = strlen(str);
     45            have[i] = hash[i] = 0;
     46            for (int j = 0; j < sz; ++j){
     47                   if (str[j] <= 'Z') str[j] += 32;
     48                   have[i] += (str[j] == 'r');
     49                   hash[i] = hash[i] * M + str[j];
     50            }
     51      }
     52      scanf("%d", &m);
     53      tot = 0;
     54      for (int i = 0; i < m; ++i){
     55            scanf("%s", str);
     56            sz = strlen(str);
     57            int tmp = 0, o = 0;
     58            for (int j = 0; j < sz; ++j){
     59                   if (str[j] <= 'Z') str[j] += 32;
     60                   o  += (str[j] == 'r');
     61                   tmp = tmp * M + str[j];
     62            }
     63            if (mp.find(tmp) == mp.end()){ mp[tmp] = ++tot; ha[tot] = o; hlen[tot] = sz; e[tot].clear(); }
     64            int u = mp[tmp];
     65            scanf("%s", str);
     66            tmp = 0, o = 0;
     67            sz = strlen(str);
     68            for (int j = 0; j < sz; ++j){
     69                   if (str[j] <= 'Z') str[j] += 32;
     70                   o  += (str[j] == 'r');
     71                   tmp = tmp * M + str[j];
     72            }
     73            if (mp.find(tmp) == mp.end()){ mp[tmp] = ++tot;  ha[tot] = o; hlen[tot] = sz;  e[tot].clear(); }
     74            int v = mp[tmp];
     75            e[u].push_back(v);
     76      }
     77 }
     78 
     79 int dp[MXN][2];
     80 int Index;
     81 stack<int> sta;
     82 int  dfn[MXN], low[MXN], col[MXN], color;
     83 bool insta[MXN];
     84 void tarjan(int u){
     85     insta[u] = true;
     86     dfn[u] = low[u] = ++Index;
     87     sta.push(u);
     88     for (int i = 0; i < (int)e[u].size(); ++i){
     89         int v = e[u][i];
     90         if (!dfn[v]){
     91              tarjan(v);
     92              low[u] = min(low[u], low[v]);
     93         } 
     94         else if (insta[v])
     95                   low[u] = min(low[u], dfn[v]);
     96     }
     97     if (dfn[u] == low[u]){
     98        ++color;
     99        while (1){
    100              int v = sta.top();
    101              insta[v] = false, col[v] = color;
    102              sta.pop();
    103              if (u == v) break;
    104        } 
    105     }
    106 }
    107 
    108 vector<int> E[220000];
    109 int haa[220000], hl[220000];
    110 void gao(){
    111     Index = color = 0;
    112     while (!sta.empty()) sta.pop();
    113     M0(dfn), M0(low), M0(col), M0(insta);
    114     for (int i = 1; i <= tot; ++i)
    115         if (!dfn[i])  tarjan(i); 
    116     for (int i = 0; i <= color; ++i)
    117         haa[i] = hl[i] = 100000000, E[i].clear();
    118     int v;
    119     for (int i = 1; i <= tot; ++i){
    120         if (ha[i] < haa[col[i]] || ha[i] == haa[col[i]] && hlen[i] < hl[col[i]])
    121             haa[col[i]] = ha[i], hl[col[i]] = hlen[i];
    122         for (int j = 0; j < (int)e[i].size(); ++j){
    123              v = e[i][j];
    124              if (col[i] != col[v]) E[col[i]].push_back(col[v]);
    125         }
    126     }
    127 }
    128 
    129 void dfs(int u){ 
    130      if (dfn[u]) return;
    131      dfn[u] = 1;
    132      dp[u][0] = haa[u], dp[u][1] = hl[u];
    133      for (int i = 0; i < (int)E[u].size(); ++i){
    134            int v = E[u][i];
    135            dfs(v);
    136            if (dp[v][0] < dp[u][0] || dp[u][0] == dp[v][0] && dp[v][1] < dp[u][1])
    137                 dp[u][0] = dp[v][0], dp[u][1] = dp[v][1];
    138      }
    139 }
    140 
    141 void solve(){
    142      gao();
    143      M0(dfn);
    144      for (int i = 1; i <= color; ++i)
    145            if (!dfn[i]) dfs(i);
    146      long long ansx = 0, ansy = 0;
    147      for (int i = 1; i <= n; ++i){
    148           if (mp.find(hash[i]) == mp.end())
    149                    ansx += have[i], ansy += len[i];
    150           else {
    151                int u = mp[hash[i]];
    152                ansx += dp[col[u]][0], ansy += dp[col[u]][1];
    153           }
    154      }
    155      printf("%I64d %I64d
    ", ansx, ansy);
    156 }
    157 
    158 int main(){
    159 //    freopen("a.in", "r", stdin);
    160 //    freopen("a.out", "w", stdout);
    161     init();
    162     solve();
    163     return 0;
    164 }
    View Code

    E.Alex and Complicated Task

    题意:给定n个数的数组a,求它的最长子序列b,使得对于序列中满足:对于任意k,b[4*k+1] = b[4*k+3],b[4*k+2]=b[4*k+4]

    思路:本场比赛最好的一道题,思路也不难想,其实就是找最多的ABAB(A可等于B),存在很明显的贪心算法。。

          从左到右,找到最靠近左边的ABAB序列。。然后就变成了如何最快的找到ABAB了。。

          我用vector写了一个很复杂的方法,然后不知道怎么错了。。看了一下别人的,写的太巧了。。

          具体看代码,可能要比我说的清楚点吧。。

     1 /*
     2  * Author:  Yzcstc
     3  * Created Time:  2014/9/19 16:35:50
     4  * File Name: E.cpp
     5  */
     6 #include<cstdio>
     7 #include<iostream>
     8 #include<cstring>
     9 #include<cstdlib>
    10 #include<cmath>
    11 #include<algorithm>
    12 #include<string>
    13 #include<map>
    14 #include<set>
    15 #include<vector>
    16 #include<queue>
    17 #include<stack>
    18 #include<ctime>
    19 #define repf(i, a, b) for (int i = (a); i <= (b); ++i)
    20 #define repd(i, a, b) for (int i = (a); i >= (b); --i)
    21 #define M0(x)  memset(x, 0, sizeof(x))
    22 #define Inf  0x7fffffff
    23 #define MP make_pair
    24 #define PB push_back
    25 #define x first
    26 #define y second
    27 #define N 555555
    28 using namespace std;
    29 typedef pair<int, int> pii;
    30 int n, a[N], t[N], pos[N], m;
    31 vector<int> ans;
    32 
    33 inline int mp(const int &x){
    34     return lower_bound(t, t + m, x) - t;
    35 }
    36 
    37 void init(){
    38      repf(i, 1, n)
    39           scanf("%d", &a[i]), t[i-1] = a[i];
    40      sort(t, t + n);
    41      m = unique(t, t + n) - t;
    42 }
    43 
    44 int lleft[N], f[N];
    45 int work(int st){
    46      stack<pii> sta;
    47      int s;
    48      repf(i, st, n){
    49            s = pos[i];
    50            if (f[s] != -1){
    51                  ans.PB(t[f[s]]), ans.PB(a[i]), ans.PB(t[f[s]]), ans.PB(a[i]);
    52                  repf(j, st, i) f[pos[j]] = -1;
    53                  return i + 1;
    54            }
    55            if (lleft[s] >= st){
    56                  while ((int)sta.size() > 0 && sta.top().y != lleft[s])
    57                        f[sta.top().x] = s, sta.pop();      
    58            }
    59            sta.push(MP(s, i));
    60            if (lleft[s] < st) lleft[s] = i;
    61      }
    62      return n + 1;
    63 }
    64 
    65 void solve(){
    66      ans.clear();
    67      for (int i = 1; i <= n; ++i) pos[i] = mp(a[i]);
    68      int i = 1;
    69      M0(lleft), memset(f, -1, sizeof(f));
    70      while (i <= n) i = work(i);
    71      printf("%d
    ", (int)ans.size());
    72      for (int i = 0; i < (int)ans.size(); ++i)
    73           (int)ans.size() != i + 1 ? printf("%d ", ans[i]) : printf("%d
    ", ans[i]);
    74 }
    75 
    76 int main(){
    77 //    freopen("a.in", "r", stdin);
    78 //    freopen("a.out", "w", stdout);
    79     while (scanf("%d", &n) != EOF){
    80            init();
    81            solve();
    82     }
    83     return 0;
    84 }
    View Code

       

  • 相关阅读:
    vs2005新控件演示系列之 向导《Wizard》
    搬家、钱、欲望、环境与命运
    母版页里面查找Repeater内控件,并构造URL
    恭喜哦!我在这里排名到250了!)(*&^%$#
    sql查询语言[我是网管论坛转载的精华贴]
    WCF 3.5对HTTP编程的增强
    WCF基础知识问与答
    印第安人的灵魂——敏捷回顾
    元数据交换绑定的秘密
    “轻松掌握WCF 帮你找到入门砖”访谈实录
  • 原文地址:https://www.cnblogs.com/yzcstc/p/3982646.html
Copyright © 2011-2022 走看看