2017.2.26小记(cf涨分啦!)

来源:互联网 发布:ipa源码 编辑:程序博客网 时间:2024/06/06 01:22

开学第一周,感觉好辛苦(爽)啊

这周的cf开了两场,外带打了一场bc,这篇文章就这周的比赛以及状况做个小结吧!

啃完了背包九讲,Kb的模板也是到手,这周的刷题主要都在看DP题,也是受某位前辈的影响吧

最迟一天修仙到5:00a.m.,虽然期间玩了一会猫,

总体来说赛后的补题啊,亦或是对DP的思考啊,都做的很充实,回想起来能出不少的干货

熬夜调代码也是各种翘水课(

第一场cf,#401div2,出了一题,第二题愣是忘掉了lower_bound的返回值的两种用法:

①:*lower_bound(drr, drr + n, aa); 返回的是数组里的值

②:lower_bound(drr, drr + n, aa)-drr; 这样后面减去数组名,返回值就是数组的下表

把自己坑到了2小时结束

C题,1e5*1e5级别的数阵,

5 41 2 3 53 1 3 24 5 2 35 5 3 24 4 3 461 12 54 53 51 31 5
6个数对i,j,问数阵中有没有一列存在i到j非递减

至少有一个数对是YES

代码:

#include<stdio.h>#include<algorithm>#include<iostream>#include<string.h>using namespace std;int dp[100100];//dp[i]:第i列的最长连续非减数列长度int temp[100100];int maax[100100];int m, n;int main() {memset(dp, 0, sizeof(dp));memset(temp, 0, sizeof(temp));scanf("%d %d", &m, &n);int a;for (int i = 1; i <= m; i++) {//swap(temp[0], temp[1]);for (int j = 1; j <= n; j++) {scanf("%d", &a);if (temp[j] <= a) {dp[j]++;}else { dp[j] = 1; }maax[i] = max(maax[i], dp[j]);//第i行向上最长延伸temp[j] = a;}}int t;scanf("%d", &t);int cmp;int l, r;int flag = 0;for (int i = 1; i <= t; i++) {scanf("%d %d", &l, &r);if (maax[r] >= r - l + 1) { puts("Yes"); }else { puts("No"); }}}
第一个数组dp[j]记录每一列从当前i循环行为止的最上上升序列长度,

第二个数组maax[i],每一次更新dp数组都更新一次这一行向上的最大延伸量

很优美的利用循环逻辑更新最大值,值得我复习!

E题想到了朴素DP,T掉,看大多数代码是树形DP(还没开!根本不会!下周补!),也学到一种很黑科技的做法,栈模拟塔,排序优先级是外径>内径,然后栈操作

——————————————————————————————————————————————————————————————————————————

然后是周六晚上的BC,因为周五的CF太鸡,所以我格外重视这场比赛,想要好好发挥一下

毕竟还是鶸啊,只出了一题,还碰上scanf不行cin行这种很迷的事

第2题,很有趣,

给m母羊,n公羊

再给k个公母之间的友情关系

让你算有多少个不同的方法沿着友情关系数满4只羊

智商低没办法,不会。赛后补题真的很佩服这题的思路

k个关系,a[k]存♂,b[k]存♀比方说第一个关系:1,4进来,a[1]=1,b[1]=4

power[a[1]][0]++,power[b[1]][1]++:点的权值增加

最后处理的时候,ans+=(power[a[i]][0]-1)*(power[b[i]][1]-1),循环k次,想象两个朋友关系在中间像哑铃,然后外延

第3题,看完题解也是感觉背包九讲没白看(明明没做出来!)

23332232233这样一个串,给m次相邻交换机会,问最多凑几个233

代码:

#include<queue>  #include<bitset>  #include<algorithm>  #include<time.h>  template <class T1, class T2>inline void gmax(T1 &a, T2 b) { if (b>a)a = b; }using namespace std;const int N = 105, Z = 1e9 + 7, ms63 = 0x3f3f3f3f;int casenum, casei;int n, m, g;char s[N];int p[N];int dfn[N][N][N];int f[N][N][N];int dfs(int k, int lp, int tim)//处理到第k个2,上一个2的位置,可交换次数{if (k > g)return (n - lp >= 2);if (dfn[k][lp][tim] == casei)return f[k][lp][tim];//访问过了dfn[k][lp][tim] = casei;f[k][lp][tim] = -1e9;//未访问,初始化int l = max(lp + 1, p[k] - tim);//由此第k个2的位置向左延伸的极限位置lint r = min(n, p[k] + tim);//由此第k个2的位置向左延伸的极限位置r,字符串总长度nfor (int i = l; i <= r; ++i)//枚举可能位置{int cost = abs(p[k] - i);gmax(f[k][lp][tim], dfs(k + 1, i, tim - cost) + (i - lp >= 3) * (k > 1));}return f[k][lp][tim];}void solve(){scanf("%d", &casenum);for (casei = 1; casei <= casenum; ++casei){scanf("%d%d", &n, &m); m /= 2;scanf("%s", s + 1);g = 0; for (int i = 1; i <= n; ++i)if (s[i] == '2')p[++g] = i;if (g == 0) { puts("0"); continue; }int ans = dfs(1, 0, m);printf("%d\n", ans);}}int main(){ solve();return 0;}
要讲的都在注释里了,这题值得反复复习啊

——————————————————————————————————————————————————————————————————————————

周日4点到6点的CF,也是人生首次hack successly,涨了106分(还是浅绿),赛后收到了约旦少年给我发的感谢hack的消息:)

A题题意理解错,导致手慢了分数落后

B题有hack点,给你一个数字串,问你最少要删几个数字才能让他被10^k整除

显然需要对串的0进行计数,如果0的个数比k少,那么整个串只能留下一个0,而不是因为串的总长比k小,这就是hack点了

C题数组开小了(,一发RE两发A

D题懵逼1个半小时:

10^5级别的串,一个10^5级别的子串,

给出串总长那么多个从1开始不同的数字,

第i个值ai代表:第i次删掉串中ai这个位的数字

问你最多能进行几次删除

看到数据量不敢暴力模拟,其实事后才反应过来一个二分删除次数就搞定了

对于某个删除次数x,

在两个串匹配时,判断a[i]的删除顺序是否比x要大,若大的话这个字符匹配成功

整个子串成功匹配就往大了二分删除操作

——————————————————————————————————————————————————————————————————————————

卡在D题之后闲得无聊就去hack了两发

都把人家的代码敲进IDE直接运行,就当练习手速吧,希望以后能脑内模拟!

比完6点吃饭,激动地等待涨分(233)

排名872,总结下提升空间:

①做过的东西要多复习,加深印象,像这次比赛的二分,在白书上面的最大化最小值专题就应该已经培养出这种思维习惯!

自己还是鶸,啃过一遍的东西不够就在啃一遍,就像打则的某位触手一样,脑袋不行就练到形成肌肉记忆(

②手速跟backspace次数,比赛的时候老是突然手抖,容易敲错东西,严重影响输出速率,务必要提升

一点经验:

①敲代码之前把思维理顺,过了大脑模拟才可能A编译器,第二场CF秉持这种操作,学长说的还是很有道理的

②学过的东西肯定会忘的,不要因为不懂的太多就只顾着往前学,巩固学过的知识也是很有必要的

③memset maxn肯定是没有for n快的,需要警惕

大一下学期越来越有趣了

0 0
原创粉丝点击