【CF】323 Div2. D. Once Again...
2015-10-09 14:23
204 查看
挺有意思的一道题目。
考虑长度为n的数组,重复n次,可以得到n*n的最长上升子序列。同理,也可以得到n*n的最长下降子序列。
因此,把t分成prefix(上升子序列) + cycle(one integer repeating) + sufix(下降子序列)。
当t<=2*n时,暴力解。
注意数据范围。
考虑长度为n的数组,重复n次,可以得到n*n的最长上升子序列。同理,也可以得到n*n的最长下降子序列。
因此,把t分成prefix(上升子序列) + cycle(one integer repeating) + sufix(下降子序列)。
当t<=2*n时,暴力解。
注意数据范围。
/* 583D */ #include <iostream> #include <string> #include <map> #include <queue> #include <set> #include <stack> #include <vector> #include <deque> #include <algorithm> #include <cstdio> #include <cmath> #include <ctime> #include <cstring> #include <climits> #include <cctype> #include <cassert> #include <functional> #include <iterator> #include <iomanip> using namespace std; //#pragma comment(linker,"/STACK:102400000,1024000") #define sti set<int> #define stpii set<pair<int, int> > #define mpii map<int,int> #define vi vector<int> #define pii pair<int,int> #define vpii vector<pair<int,int> > #define rep(i, a, n) for (int i=a;i<n;++i) #define per(i, a, n) for (int i=n-1;i>=a;--i) #define clr clear #define pb push_back #define mp make_pair #define fir first #define sec second #define all(x) (x).begin(),(x).end() #define SZ(x) ((int)(x).size()) #define lson l, mid, rt<<1 #define rson mid+1, r, rt<<1|1 const int maxn = 105; const int maxm = 305; int c[maxm]; int a[maxn], b[maxn*maxn*2]; int dp[maxm]; int suf[maxn*maxn], pre[maxn*maxn]; int main() { ios::sync_with_stdio(false); #ifndef ONLINE_JUDGE freopen("data.in", "r", stdin); freopen("data.out", "w", stdout); #endif int n, t; int mx; int ans = 0; scanf("%d %d", &n, &t); rep(i, 1, n+1) { scanf("%d", &a[i]); ++c[a[i]]; } if (t <= n*2) { rep(i, 1, n+1) { int k = i; rep(j, 1, t+1) { b[k] = a[i]; k += n; } } int n_ = n*t; memset(dp, 0, sizeof(dp)); rep(i, 1, n_+1) { mx = 0; rep(j, 1, b[i]+1) mx = max(mx, dp[j]); pre[i] = ++mx; dp[b[i]] = mx; } rep(i, 1, n_+1) ans = max(ans, pre[i]); printf("%d\n", ans); return 0; } rep(i, 1, n+1) { int k = i; rep(j, 1, n+1) { b[k] = a[i]; k += n; } } // calculate prefix int n_ = n*n; memset(dp, 0, sizeof(dp)); rep(i, 1, n_+1) { mx = 0; rep(j, 1, b[i]+1) mx = max(mx, dp[j]); pre[i] = ++mx; dp[b[i]] = mx; } // calculate suffix memset(dp, 0, sizeof(dp)); per(i, 1, n_+1) { mx = 0; rep(j, b[i], maxm) mx = max(mx, dp[j]); suf[i] = ++mx; dp[b[i]] = mx; } // iteration int tmp, n2 = n+n; rep(i, 1, n+1) { rep(j, 1, n+1) { if (a[j] < a[i]) continue; tmp = pre[i+n_-n] + suf[j] + c[a[i]]*(t-n2); ans = max(ans, tmp); } } printf("%d\n", ans); #ifndef ONLINE_JUDGE printf("time = %d.\n", (int)clock()); #endif return 0; }
相关文章推荐
- GridBagConstraints(网格组布局管理器的使用)
- CodeForces - 463E Caisa and Tree (dfs+素因子分解)
- HDU 4300 Clairewd’s message
- GridBagConstraints(网格组布局管理器的使用)
- HDU 2674 N!Again
- Could not reliably determine the server's fully qualified domain name
- AIX 6.1 硬件管理
- 5029 Relief grain 树链剖分+离线标记法
- 深入解读Quartz的原理(创建Scheduler对象容器,并配置JobDetail和Trigger对象;配置强大时间调度策略,可以研究专门的CronTrigger )
- 新版fai批量安装部署debian
- 进程——wait函数
- grails之二级联动后的文本框内容的切换
- Jenkins系列之—04 email-ext邮件通知模板
- Jenkins系列之—03使用email-ext替换Jenkins的默认邮件通知
- [UVA11076]Add Again
- JetBrains KegGen
- 人工智能●专家系统
- ORA-16025: parameter LOG_ARCHIVE_DEST_2 contains repeated or conflicting attributes
- redirect、redirect-action、chain三者的区别!
- RAID介绍、理解