2018年4月12日训练日记

先说说昨晚的比赛:貌似题目都见过,只不过有的没做出来,赛后也没补,然后就凉了。但是对于当时就做出来的和赛后补了的题,可以说和做A+B一样了,不用读题,上来直接敲。。。然后7道题拿了五道一血(居然还被质疑粘题解)

A:印象深刻,第一次做的时候只有我不知道题意,然后WA好几次,其实就是给长方体三个面面积求总边长,我以为给的是空间坐标,然后读了好久好久。。。读题真迷,这次看到后立马想都没想就去敲了个一血,可惜还是2分多钟,手速还是比较慢,我个人不太满意。

B:这道题和A题是同一场比赛,也是当时没读懂题,最后偷偷问了别人题意以后立马就AC了。。。这次因为一个小细节WA了一次,错失一血。。。(题意是给你一堆数,求一个连续区间包含K个不同的数,而且去掉头或者尾部的数会导致数字减少)

C:这道题有毒。主要原因在于以下三点:1、题目要求的是求方括号对最多的区间,而且必须是合法的,我以为求括号最多。。。2、模拟一直出错,样例怎么测都对,然后各种WA,比赛结束后第二天发现输出的起始位置写错了。。。迷 3、题意说给的字符串长度最多是1e5,有个小伙伴开了1e5的数组一直RE,最后把bool类型的数组开到了1e9,内存没炸居然AC了。。迷,其实用map就可以省很多内存。(题意是给你若干个字符,包括"()[]",你需要找到正确匹配的、方括号最多的连续子串)其实简单模拟一下就可以了,赛后补得题附上代码:

#include <bits/stdc++.h>
#define ll  unsigned long long
#define inf 0x3f3f3f3f
using namespace std;
const int maxn=1000010;
const int mo=1e9+7;
int n,m,nn,mm,k,h,f;
int tmp;
map<int,bool>ok,flag;
char s[maxn];
int l[maxn],r[maxn];
int ans,ansl,ansr,st;
int main() {
    int T,t,cas;
    scanf("%s",s);
    {
    int len=strlen(s);
    int f=0,g=0,cnt=0;
    tmp=0;ans=0;
    for(int i=0;i<len;i++) {
        if(s[i]=='('||s[i]=='[')
        {l[++f]=i;}
        else if(s[i]==')')
        {
            if(f&&s[l[f]]=='(')
               {
                   ok[l[f]]=1;
                   ok[i]=1;
                   f--;
               }
            else {f=0;}
        }
        else if(s[i]==']')
        {
            if(f&&s[l[f]]=='[')
            {
              ok[l[f]]=1;
              ok[i]=1;
              f--;
            }
            else {f=0;}
        }
    }
    for(int i=0;i<len;i++)
    {
        if(ok[i]) {st=i;
        cnt=0;
        while(i<len&&ok[i])
        {
            if(s[i]=='[')  cnt++;
            i++;
        }
        if(cnt>ans)
        {
            ans=cnt;
            ansl=st;
        }
        }
    }
    if(ans==0) puts("0");
    else {
        printf("%d\n",ans);
        for(int i=ansl;ok[i]&&i<len;i++)//比赛时这里的ansl居然写成了st。。。迷
        {
            printf("%c",s[i]);
        }
        puts("");
    }
    }
        //if(flag) puts("Yes");else puts("No");
    return 0;
}

D:这道题和AB题是一场,也是当时没读懂题,最后偷偷问了别人题意,不过这次刚开始敲的时候漏了一个细节,WA一次,好在没丢一血。。。(给你竖直放置的骰子,你知道第一个骰子的上面和相邻的两个面,下面只给你骰子的两个面,让你判断骰子各个面的点数是否唯一,相对的面和为7,不难推论只要出现第一个骰子的上面的点数或者7-上面的点数,则一定不行)一血get√

E:这道题唬人的。。。其实看似数据范围是1e9,实则最多到50项左右就到上限了,所以直接暴力求出前50项然后把s挨个减保存结果就行。。。(定义K-斐波那契数列 为 前k项0-k-1都是0,从第K项开始每一项等于前K项的和,给你s、k,让你把s分解成大于2个数,每一个数都是k-斐波那契数列的项)

F:原题,当时没做出来并且还写了博客,叉积的应用。又短又简洁,一血get√(给三个点,你从第一个点走到第二个点,现在要到第三个点该左转还是右转还是直走,题目保证转角是90°或0°)代码:

#include<bits/stdc++.h>
#define ll long long
using namespace std;
const int maxn=100010;
const int mo=1e9+7;
using namespace std;
int n,m,k,h;
int ans,tmp,sum;
double x[maxn],y[maxn];
bool b[maxn],flag;
int main()
{
    int T,cas=1;
    for(int i=0;i<3;i++) cin>>x[i]>>y[i];
   {
       double ans=(x[1]-x[0])*(y[2]-y[1])-(x[2]-x[1])*(y[1]-y[0]);
       if(ans==0) puts("TOWARDS");
       else if(ans<0)puts("RIGHT");
       else puts("LEFT");
   }
  return 0;
}

G:用两个map分别存一下每个数正反出现的位置,根据询问再加起来即可,就是题干又臭又长(两个人比赛数组中找数,一个人说从头开始找找的快,另一个人说从尾开始找找的快,现在给若干个数,求他俩分别总共找到这若干个数用的次数),一血get√

H:没做出来也没找到题解,先留个坑

I:给四个数,排一下序,一个与前一个相同就加一,输出结果(第一次做这道题的时候就没看题意,直接猜的,然后1A,不过这次没拿到一血)

J:这个题就个暴力啊,怎么才三个人做呢,数据范围才50,直接暴力枚举x、y从-50到正50每一个要求的值加起来取个最大的就行了,应该是很水的题啊。。。一血get√(给你两个01二维数组,让你求(x,y)使 a i j * b i+x j+y总和最大(0<=i<n,0<=j<m))

K:我以为就是找第三个图形出现的次数,结果WA,然后就搞C去了。。。没找到题解,留个坑。

资料:今天满课,白天上课的时候也偷偷看了第一个博客里的几篇题解,从后往前。话说这个人真的不是抄题解么。。。相邻的几个题解码风都不一样,还有各种错误。。。(刚开始就写最短路、并查集、二分图也是醉了),也许刚开始写博客时候的我也是这种状态吧。接下来是AC自动机、拓扑排序、欧拉路、字典树、LCA、各种背包、dp,包括区间dp(立马去翻了一下以前看过的资料,真的快忘了),树形dp,发现dp还是我的一大弱点,因为通过实战发现,我经常想不到dp,就算想到了,状态转移方程也得想老半天。。。(还不一定对)还有RMQ,数学(看不懂,略),dfs\bfs,贪心。

树删边:

树的删边游戏
规则如下:
 给出一个有 N 个点的树,有一个点作为树的根节点。
 游戏者轮流从树中删去边,删去一条边后,不与根节点相连的
部分将被移走。
 谁无路可走谁输。
我们有如下定理:
[定理]
叶子节点的 SG 值为 0;

中间节点的 SG 值为它的所有子节点的 SG 值加 1 后的异或和

一些技巧性的题目还真是难想。。。继续看吧,顺便整理下模板。
加油。。。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值