【CF】323 Div2. D. Once Again...

挺有意思的一道题目。
考虑长度为n的数组,重复n次,可以得到n*n的最长上升子序列。同理,也可以得到n*n的最长下降子序列。
因此,把t分成prefix(上升子序列) + cycle(one integer repeating) + sufix(下降子序列)。
当t<=2*n时,暴力解。
注意数据范围。

  1 /* 583D */
  2 #include <iostream>
  3 #include <string>
  4 #include <map>
  5 #include <queue>
  6 #include <set>
  7 #include <stack>
  8 #include <vector>
  9 #include <deque>
 10 #include <algorithm>
 11 #include <cstdio>
 12 #include <cmath>
 13 #include <ctime>
 14 #include <cstring>
 15 #include <climits>
 16 #include <cctype>
 17 #include <cassert>
 18 #include <functional>
 19 #include <iterator>
 20 #include <iomanip>
 21 using namespace std;
 22 //#pragma comment(linker,"/STACK:102400000,1024000")
 23
 24 #define sti                set<int>
 25 #define stpii            set<pair<int, int> >
 26 #define mpii            map<int,int>
 27 #define vi                vector<int>
 28 #define pii                pair<int,int>
 29 #define vpii            vector<pair<int,int> >
 30 #define rep(i, a, n)     for (int i=a;i<n;++i)
 31 #define per(i, a, n)     for (int i=n-1;i>=a;--i)
 32 #define clr                clear
 33 #define pb                 push_back
 34 #define mp                 make_pair
 35 #define fir                first
 36 #define sec                second
 37 #define all(x)             (x).begin(),(x).end()
 38 #define SZ(x)             ((int)(x).size())
 39 #define lson            l, mid, rt<<1
 40 #define rson            mid+1, r, rt<<1|1
 41
 42 const int maxn = 105;
 43 const int maxm = 305;
 44 int c[maxm];
 45 int a[maxn], b[maxn*maxn*2];
 46 int dp[maxm];
 47 int suf[maxn*maxn], pre[maxn*maxn];
 48
 49 int main() {
 50     ios::sync_with_stdio(false);
 51     #ifndef ONLINE_JUDGE
 52         freopen("data.in", "r", stdin);
 53         freopen("data.out", "w", stdout);
 54     #endif
 55
 56     int n, t;
 57     int mx;
 58     int ans = 0;
 59
 60     scanf("%d %d", &n, &t);
 61     rep(i, 1, n+1) {
 62         scanf("%d", &a[i]);
 63         ++c[a[i]];
 64     }
 65
 66     if (t <= n*2) {
 67         rep(i, 1, n+1) {
 68             int k = i;
 69             rep(j, 1, t+1) {
 70                 b[k] = a[i];
 71                 k += n;
 72             }
 73         }
 74
 75         int n_ = n*t;
 76
 77         memset(dp, 0, sizeof(dp));
 78         rep(i, 1, n_+1) {
 79             mx = 0;
 80             rep(j, 1, b[i]+1)
 81                 mx = max(mx, dp[j]);
 82             pre[i] = ++mx;
 83             dp[b[i]] = mx;
 84         }
 85         rep(i, 1, n_+1)
 86             ans = max(ans, pre[i]);
 87         printf("%d\n", ans);
 88         return 0;
 89     }
 90
 91     rep(i, 1, n+1) {
 92         int k = i;
 93         rep(j, 1, n+1) {
 94             b[k] = a[i];
 95             k += n;
 96         }
 97     }
 98
 99     // calculate prefix
100     int n_ = n*n;
101
102     memset(dp, 0, sizeof(dp));
103     rep(i, 1, n_+1) {
104         mx = 0;
105         rep(j, 1, b[i]+1)
106             mx = max(mx, dp[j]);
107         pre[i] = ++mx;
108         dp[b[i]] = mx;
109     }
110
111     // calculate suffix
112     memset(dp, 0, sizeof(dp));
113     per(i, 1, n_+1) {
114         mx = 0;
115         rep(j, b[i], maxm)
116             mx = max(mx, dp[j]);
117         suf[i] = ++mx;
118         dp[b[i]] = mx;
119     }
120
121     // iteration
122     int tmp, n2 = n+n;
123
124     rep(i, 1, n+1) {
125         rep(j, 1, n+1) {
126             if (a[j] < a[i])
127                 continue;
128             tmp = pre[i+n_-n] + suf[j] + c[a[i]]*(t-n2);
129             ans = max(ans, tmp);
130         }
131     }
132
133     printf("%d\n", ans);
134
135     #ifndef ONLINE_JUDGE
136         printf("time = %d.\n", (int)clock());
137     #endif
138
139     return 0;
140 }
时间: 2024-08-08 06:46:56

【CF】323 Div2. D. Once Again...的相关文章

【CF】135 Div2 Choosing Capital for Treeland

树形结构,挺有意思的题目.不难. 1 /* 219D */ 2 #include <iostream> 3 #include <string> 4 #include <map> 5 #include <queue> 6 #include <set> 7 #include <stack> 8 #include <vector> 9 #include <deque> 10 #include <algorith

【TopCoder】SRM151 DIV2 练习总结

第一次做完整的SRM题,刷完感觉萌萌哒,不过自己对java中很多细节不熟练,还要边做题边google. 250分的题:判断字符串序列是否是前缀码,如果不是,返回第一个违反前缀码规则的字符串. 简单的暴力方法,要积累的是java中startsWith的用法: 1 public boolean startsWith(String prefix) 如果prefix是调用该函数的字符串的前缀,返回true,否则返回false.从实际经验来看,对大小写是敏感的,即No不是not的前缀. 完整代码连接:Gi

【SRM】600#div2 B 枚举

题意:有一个集合和一个目标态goal,现在的状态是X=0,现在在集合中有一些数,经过每次X=X|a[i] 这种异或运算后,能使得X=goal,即达到目标态.问:最少删除集合中多少个元素,使得初始X=0,不能达到目标态. 思路:SRM600 #div2 的A题做了好一会儿,主要是不知道怎么直接计算出那个shuttle的数量,突然发现暴力枚举可行. 因此做B题的时候也受枚举思想的影响.刚开始我想枚举子集再决定删除多少个,但真不好决定.接着又想枚举goal的每一位(二进制),显然可行!但是由于思路不严

【CF】38E Let&#39;s Go Rolling! (dp)

前言 这题还是有点意思的. 题意: 给你 \(n\) (\(n<=3000\)) 个弹珠,它们位于数轴上.给你弹珠的坐标 \(x_i\) 在弹珠 \(i\) 上面花费 \(C_i\) 的钱 可以使弹珠在原地不动 (\(-10^9<=x_i,C_i<=10^9\)),游戏开始时,所有的弹珠向左滚动,直到碰到定在原地不动的弹珠,其花费是其滚动的距离.总花费=开始前的花费+弹珠滚动的花费,问最小的花费是多少 题解 首先划分出阶段,,我们可以先将弹珠排序,前 \(i\) 个弹珠,最后一个固定的弹

【CF】codeforces round 369(div2)

*明早起来再贴代码 A [题意] 给定n*5的方格 将横向的相邻两个变成+输出   [题解] ...   B [题意] 一个n*n的正整数矩阵,有且仅有一个数为0 ,在这个位置填上一个数,使得每一列的和 每一行的和 两条对角线各自的和都相等 输出这个数   [题解]sb题.暴力一下.注意细节,否则你就像这样 (不是本人   C [题意] 一排点,用1~n表示,熊孩子要给这些点上色.最初每个点的颜色为ci.一共有m种颜色,如果ci=0表示这个点最初无色. 熊孩子们需要给最初为无色的点涂上色,往第i

【CF】Round #618 div2 C(文末有技巧)

目录 round #618 div2 C(文末有技巧) 题目: 样例输入输出 思路 小技巧(拿小本本记下来) round #618 div2 C(文末有技巧) 这是题目链接->链接 题目: 原题目是全英文的,所以我就粗略来翻译一下: 有这样一个函数f:f(x,y)=(x|y)-y;(其中|是按位或操作) 比如说:f(11,6)=(11|6)-6=15-6=9;(简单明了) 现在有一个数组 [a1,a2,-,an],让你求f(f(-f(f(a1,a2),a3),-an?1),an) ,数组中可能有

【CF】Codeforces Round #361 (Div. 2)

难得有想法写一整套题解 首先想说的是,这场CF,我感觉是div2极为不错的一场(对于中档选手<因为我就出了三题,还掉了一个-- 说笑了,感觉这一场很耐人寻味.就是那种抓破头皮想不出,知道做法后细细品味,有种   哦~~~~~这样啊~~~~好神奇!!! 的感觉 首先..秀一下战绩 不多说了 都在题里 ↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓ A. Mike and Cellphone time limit per test 1 second memory limit per test 256 megaby

【CF】掉分总结

比赛总结 前情提要 自从前段时间连续掉分,就心态崩了,还是自己太菜,一直想写个总结,看看这几场比赛都干了啥,以后准备怎么办.鸽了这么久的总结,是该写写了. 这是正文 首先大致提一下情感曲线(菜的真实): 那一晚,那一夜,sc大佬突然qq发消息给我,"打cf吗",我眉头一紧,这个cf莫非是穿越火线?又一想大佬才不会玩这种游戏,又一想,难道是codeforces?我颤颤巍巍的回了"codeforces?",大佬回的很快,扔给我了个链接,并说"这是616,你做吧

【CF】121 Div.1 C. Fools and Roads

题意是给定一棵树.同时,给定如下k个查询: 给出任意两点u,v,对u到v的路径所经过的边进行加计数. k个查询后,分别输出各边的计数之和. 思路利用LCA,对cnt[u]++, cnt[v]++,并对cnt[LCA(u, v)] -= 2.然后dfs求解各边的计数. 1 /* 191C */ 2 #include <iostream> 3 #include <string> 4 #include <map> 5 #include <queue> 6 #inc