[日记&做题记录]-Noip2016提高组复赛 倒数十天

 

 

写这篇博客的时候有点激动 为了让自己不颓 还是写写日记 存存模板

Nov.8 2016

今天早上买了两个蛋挞 吃了一个 然后就做数论(前天晚上还是想放弃数论 但是昨天被数论虐了 woc noip模拟赛出了道杜教筛)

然后白天就脑补了几道 积性函数 把例题过了一遍 

Submit_Time
1696174 wohenshuai 2154 Accepted 245432 kb 10556 ms C++/Edit 1152 B 2016-11-08 16:50:10
1695614 wohenshuai 1101 Accepted 1924 kb 8236 ms C++/Edit 952 B 2016-11-08 10:59:57
1695536 wohenshuai 2005 Accepted 2952 kb 44 ms C++/Edit 907 B 2016-11-08 09:54:44
1695489 wohenshuai 2226 Accepted 25708 kb 7532 ms C++/Edit 952 B 2016-11-08 08:47:44

 

最后一题是比较中等的积性函数 也就是昨天的数论 只会O(Nlogn - N½) 做 被虐傻了

sb数论废了我十二张白纸 真是感人肺腑 当然还有两题

总结 可以提出来的尽量提 然后$gcd(a,b)$ 变成 1 再莫比乌斯反演一下下 然后还有一点小技巧记记就好

今天晚上睡觉前全部再推一遍

哦对 今天悟出了怎么打分块 .......................... 今天还学会了插数学公式 但是所有推导要写半天不写了

晚上复习了自动机dp 明天测试不要挂哇!

 

Nov.9 2016

早上测了一场 感觉noip难度差不多 只是第二题略有点经典和sb 第三题优先队列恶心就没了

下午和晚上都做回 没有什么可以说的 题目太恶心 我太垃圾 做的很不顺

 

Nov.10 2016

早上下午写了三道点分治 基于昨天的比赛 然后膨胀了一会

总结一点 点分治要不就找什么大于等于或者小于的点对 要不就找等于k的点对 反正简单题都是这样

早上还做了一道环套树(noip 难度...) 把环去边然后算这条边的贡献

还有一个就是点分治的题要出数据卡自己有没有找错重心(经常打少一些东西) 还有跑dfs的时候要判断这个点有没有被标记过,因为找完重心之后整个树都是乱的,有可能传进来的点在这个乱的树的下面(只有我自己知道我在说什么估计)

晚上写了洛谷的一场比赛 一题错排一题twoset被虐的不知所措

1699489 wohenshuai 2152 Accepted 3340 kb 420 ms C++/Edit 2043 B 2016-11-10 15:57:06
1699060 wohenshuai 3648 Accepted 23320 kb 4308 ms C++/Edit 4089 B 2016-11-10 11:50:06

还有一些见hwzer blog上的..orzorz

 

Nov.11 2016

liao出的比赛好像有毒 次次都不上100

第一题打了很久发现有个向下取整..然后删掉暴力 第二题也想错了 第三题水暴力 第四题一秒不会做

然后下午就做回 第四题表示没力草

1701659 wohenshuai 3232 Accepted 27748 kb 4708 ms C++/Edit 2694 B 2016-11-11 17:11:19
1701469 wohenshuai 4240 Accepted 8324 kb 1696 ms C++/Edit 786 B 2016-11-11 16:09:31
1701326 wohenshuai 3211 Accepted 12912 kb 4224 ms C++/Edit 1456 B 2016-11-11 15:26:27

按顺序三二一  晚上晚点到机房然后做洛谷的比赛 感人肺腑 一个小时的看题想题时间最后啥都不会

然后颓废得把当年noip我只拿20分的题

 

Nov.12 2016

今天星期六 本应回家的 考虑到回家找不到生命的意义 然后就在学校留宿了 也颓了一天 看了一下解忧的杂货店 或有点感触

做的东西不多 主要做了noip2011的day2

当然这是提交两次之后的成绩.. 第一题一眼数学题 但不知道哪里错了两个点 第二题先写了个可持久化线段树爽了一下 发现好像这是noip赛(本来想写三分 然后用两个二分做了)

然后就发现主席树查找logn提交60分 然后发现扫一遍O(1)回答就可以了.........无语了一天

第三题本来想打60分暴力 打了又删删了又打 真很吃力 然后第一次随便交0分 后来改了一下才40分

还是很弱 没打check就是没底

总结一下 做题要利索果断 然后想题要全面不怕麻烦不怕错 不要想蒙 算时间要算准

第三题正解好像是哪里省最多尽量放 这在看完题之后也有想到 但是不知道 哪里才算是省最多 我太垃圾了

 还有就是代码写的很不优美 做题不够淡定 整天吃东西

 

Nov.13 2016

早上没事干写了两道题爽了一下 下午写了份洛谷的个人公开赛 305分图包到手水了就算了

https://www.luogu.org/contest/show?tid=1189

简单说一下:
A.线段树裸题 数组没开大RE一次..

B.最小生成树 经典例题 会做作业的再连个0点就好

C.首先是二分..然后呢 就不知道该干啥了 YY了一下 字典序最小其实就是高度的字典序最小 所以的话最优方案肯定是二分后所有的值是单峰的 不然的话可以互相交换 (当然第一个和最后一个也要满足要求) 然后让后面下降的幅度尽量大 前面上升的幅度尽量小 相当于在最小和最大的两个数之间有两条链 一条最大能取就取 一条取剩下的

这种做法跑的比标程还快.. 时间O(NlogH)

D.膜MT_Chan 这道题毫无头绪 MT_Chan告诉我是经典DP 然后自己看错题意妈的还误导我..

然后自己手推了一下 不知道为什么10分

说做法:先把x和y从小到大排序一下 然后F[i][0.1.2]分别表示 对于当前x来说 没有选x而且之前选了一条边 仅仅选了x这条边 除了选x还选了另外一条边

然后就wa了 但也算有图包

 

还写了一下Noip2011的Day1 第三题不知道为什么官方数据我手动模拟都错

第三题交了两遍 第一第二题1A

感觉还是有点弱

 

Nov.14 2016

剩下五天了 实力太弱 还是有点慌

早上做了一场ljm比赛 上场看到第一题觉得要死 第二题好像是一年普及组的dp  但是加强了数据到了10^8..(我居然想O(N).......也有想用容斥 但是之前没有自己独立学过这个专题 0基础) 第三题好像二分一下可持久化就可以 然后就写了

然后二十分钟不到写完第三题 感人肺腑一下子过样例 出了组数据卡卡自己 发现数组没开大 但是时间用了1.7s....

然后我跑去问男神出题人可不可以开两秒 我写的是log^2 他说他就是要卡log^2.........

感觉要完

先看第二题 先水了个四方暴力发现麻烦了降三方 然后便秘去了很多趟厕所 然后第一题感觉可以从下面到上面搞 但是发现最下面那层最倒霉有N多个叶子节点 感觉很无奈 看了一下

40%的数据 好像最坏情况也不可以过 首先打了个双队列 发现反正都不可以过 写个稳点的搜索

然后.........

第一题40%成功不知道为什么水过 男神前4组数据都是那种最坏情况的 证明脸好

第二题30%正常过

第三题100%...最大数据0.8s 笑死我了

下午back回三题 其实第三题感觉很sb log^2和log写的时间差不多 题解也很无聊 第二题容斥被虐傻 第一题是从下到上搞 发现每个颜色都是一样的 然后记录之前颜色的状态 也就是个数和整个树的价值 从下到上合并 要求先序 也就是从左到右就好了

 

第二题简单说一下 很经典 就是用一个搜索来代替容斥 把状态不合法的塞进去搞一下 当然考场上有想到就是 状态不合法的以后还有不合法的怎么办 而递归的时候就把不合法的加回来..

也就是用了容斥的原理 答案=所有状态-不合法状态+不合法状态中自己本身无法到达的不合法状态......

至于下次能不能再想到 这要看造化了

 

还有就是N个大于等于0的数和为K的方案数为C(N-1,N+K-1) 我自己不会推 考场打表

晚上颓废了一下..

 

Nov.15 2016

第三题有毒 本机测试AC 然后交上去某vs某os洛谷全都挂了

我的还跑挺快的呢

我的第三题代码

#include<cstdio>
#include<iostream>
#include<cstring>
#include<algorithm>
#include<cstdlib>
#include<cmath>
#include<ctime>
using namespace std;
const int Maxn=14;
struct node
{
  int A[Maxn];
  node(){memset(A,0,sizeof(A));}
};

int G[20];

bool Dfs(int N,int K,int num,node X)
{
  if(K>N+1) return 0;
  if(num==0) return 1;
  
  int cnt=0; node Y;
  for(int i=0;i<=13;i++) if(X.A[i]>0) cnt++;
  if(cnt<=N-K+1) return 1;
  
  //Double
  for(int i=3;i<=12;i++)
  {
    int k=0; while(X.A[G[k+i]]>=2&&G[k+i]!=2) k++;
    if(k>=3)
    {
      Y=X;
      for(int j=i;j<i+k;j++) Y.A[G[j]]-=2;
      if(Dfs(N,K+1,num-k*2,Y)) return 1;
    }
  }
  
  //Single
  for(int i=3;i<=10;i++)
  {
    int k=0; while(X.A[G[k+i]]>=1&&G[k+i]!=2) k++;
    if(k>=5)
    {
      Y=X;
      for(int j=i;j<i+k;j++) Y.A[G[j]]-=1;
      if(Dfs(N,K+1,num-k,Y)) return 1;
    }
  }
  
  //Four+two+two
  for(int i=1;i<=13;i++)
  {
    if(X.A[i]==4)
    {
      for(int j=0;j<=13;j++) if(j!=i)
      {
        if(X.A[j]==3||X.A[j]<2) continue;
        for(int k=0;k<=13;k++) if(k!=i)
        {
          if(X.A[k]==3||X.A[k]<2) continue;
          if(j==k&&X.A[k]==2) continue;
          Y=X;
          Y.A[i]-=4; Y.A[j]-=2; Y.A[k]-=2;
          if(Dfs(N,K+1,num-8,Y)) return 1;
        }
      }
    }
  }
  
  //Four+one+one
  for(int i=1;i<=13;i++)
  {
    if(X.A[i]==4)
    {
      for(int j=0;j<=13;j++) if(j!=i)
      {
        if(X.A[j]>=3||X.A[j]==0) continue;
        for(int k=0;k<=13;k++) if(k!=i)
        {
          if(X.A[j]>=3||X.A[j]==0) continue;
          if(j==k&&X.A[k]==1) continue;
          Y=X;
          Y.A[i]-=4; Y.A[j]-=1; Y.A[k]-=1;
          if(Dfs(N,K+1,num-6,Y)) return 1;
        }
      }
    }
  }
  
  //Three+one or Three+two
  for(int i=1;i<=13;i++)
  {
    if(X.A[i]==3)
    {
      for(int j=0;j<=13;j++) if(j!=i)
      {
        if(X.A[j]>=3) continue;
        if(X.A[j]==1)
        {
          Y=X;
          Y.A[i]-=3; Y.A[j]-=1;
          if(Dfs(N,K+1,num-4,Y)) return 1;
        }
        if(X.A[j]==2)
        {
          Y=X;
          Y.A[i]-=3; Y.A[j]-=2;
          if(Dfs(N,K+1,num-5,Y)) return 1;
        }
      }
    }
  }
  
  //Triple
  for(int i=3;i<=13;i++)
  {
    int k=0; while(X.A[G[k+i]]>=3&&G[k+i]!=2) k++;
    if(k>=2)
    {
      Y=X;
      for(int j=i;j<i+k;j++) Y.A[G[j]]-=3;
      if(Dfs(N,K+1,num-k*3,Y)) return 1;
    }
  }

}

int main()
{
  freopen("landlords.in","r",stdin);
  freopen("landlords.out","w",stdout);
  int T,N; scanf("%d%d",&T,&N); for(int i=1;i<=15;i++) G[i]=(i>13?i-13:i);
  while(T--)
  {
    node ST; memset(ST.A,0,sizeof(ST.A));
    for(int i=1;i<=N;i++){int x,k; scanf("%d%d",&x,&k); ST.A[x]++;}
    
    // IDA*
    int L=1; int R=14; int ret;
    while(L<=R)
    {
      int mid=(L+R)>>1;
      if(Dfs(mid,1,N,ST)){ret=mid; R=mid-1;}
      else L=mid+1;
    }
    printf("%d\n",ret);
  }
  return 0;
}
View Code

当然我交上去是删freopen的 我叫一个管理员帮我看都不肯...

第二题写了个手工栈 感人肺腑

算是AC了 noip2015 600强势back回

 

晚上写了一套题,调了调栈什么的

发现这套题超水 感觉没动过脑筋..

 

Nov.16 2016

死了还剩三天了 怎么办呢??

早上切了两套题爽一下先

顺带说第一题有点恶心 可能自己打不好 就是可以wifi到外面 而我一开始打的是枚举左下角 然后吸取教训了 这样枚举可能中心在外面..

然后用矩阵差写了 以后这种题写矩阵差

第三题方法鬼畜 随便找两个质数判断一下是否为0就好 这样出现可能的几率很小 因为两个为0不合法的只可能是两个质数公倍数..然后不知道为什么T了

第二题比较恶心 转来转去 第三题有点sb 今天码速很快下午加油

 

下午做的题目好像有点强

第一题想了挺久的..虽然可以递归过 但是贪心很妙 第三题恶心题 递归题变最短路 有点妙

晚上还写回了上次比赛的D题

明天和后天早上 要做开车和疫情 然后复习割点 割边 强连通 奶牛配 KMP EXKMP 自动机 后缀数组(虽然说提高组范围没有后缀数组..) 优先队列 单调队列 (区间最大最小值) two-set

剩下就是usaco的题表选一些经典再写一下

 

Nov.17

今天不知道是效率低下还是怎样 写题好吃屎 写了开车和看病

看病最后一个点表示无力卡常 好无聊 看病这道题比较强 首先一般很难直接得到最优解就二分 然后拼命往上跳 跳完再分配下来

分配下来的时候一般来说是大对大的 可是有从一个子树上来的点可以回到那个子树 所以贪心

#include<cstdio>
#include<iostream>
#include<cstring>
#include<algorithm>
#include<cstdlib>
#include<cmath>
#include<vector>
using namespace std;
typedef long long LL;
const LL Maxn=50010;
struct node
{
  LL x,y,next,d;
}edge[Maxn*2]; LL len,first[Maxn];
void ins(LL x,LL y,LL d){len++; edge[len].x=x; edge[len].y=y; edge[len].d=d; edge[len].next=first[x]; first[x]=len;}
LL N,M; LL fa[Maxn][21]; LL dis[Maxn][21];
void Dfs(LL x)
{
  for(LL k=first[x];k!=-1;k=edge[k].next)
  {
    LL y=edge[k].y;
    if(y!=fa[x][0]){fa[y][0]=x; dis[y][0]=edge[k].d; Dfs(y);}
  }
}
void Pre()
{
  for(LL j=1;j<=20;j++)
    for(LL i=1;i<=N;i++)
    {
      fa[i][j]=fa[fa[i][j-1]][j-1];
      if(fa[i][j]) dis[i][j]=dis[fa[i][j-1]][j-1]+dis[i][j-1];
    }
}

bool bo[Maxn]; LL id[Maxn];
vector<pair<LL,LL> >res,need; //first=val second=id
LL match[Maxn];

bool Cover(LL x)
{
  if(bo[x]) return 1; bool bk=1; LL cnt=0;
  for(LL k=first[x];k!=-1;k=edge[k].next)
  {
    LL y=edge[k].y;
    if(y!=fa[x][0]){bk&=Cover(y); cnt++;}
  }
  if(cnt==0) return false;
  return bk;
}

bool Cmp(const pair<LL,LL> &x,const pair<LL,LL> &y){return x.first>y.first;}

LL Bet[Maxn],Q[Maxn];

bool Check(LL D)
{
  memset(bo,0,sizeof(bo)); res.clear(); need.clear();
  for(LL k=1;k<=M;k++)
  {
    LL i=id[k]; LL x=D;
    for(LL j=20;j>=0;j--)
    {
      if(x>=dis[i][j]&&fa[i][j]!=1) x-=dis[i][j],i=fa[i][j];
    }
    if(x>=dis[i][0]&&fa[i][0]==1) res.push_back(make_pair(x-dis[i][0],i));
    else bo[i]=1;
  }
  
  for(LL k=first[1];k!=-1;k=edge[k].next)
  {
    LL y=edge[k].y;
    if(!Cover(y))
      need.push_back(make_pair(edge[k].d,y));
  }
  
  sort(res.begin(),res.end(),Cmp);
  sort(need.begin(),need.end(),Cmp);
  memset(match,-1,sizeof(match));
  memset(Bet,-1,sizeof(Bet));
  memset(Q,-1,sizeof(Q));
  
  for(LL i=0;i<need.size();i++) Q[need[i].second]=i;
  for(LL i=0;i<res.size();i++)
  {
    if(Q[res[i].second]!=-1)
    {
      if(match[Q[res[i].second]]==-1) Bet[i]=Q[res[i].second],match[Q[res[i].second]]=i;
      else Bet[match[Q[res[i].second]]]=-1,match[Q[res[i].second]]=i,Bet[i]=Q[res[i].second];
    }
  }
  
  LL j=0;
  for(LL i=0;i<res.size();i++)
  {
    while(match[j]!=-1&&j<need.size()) j++;
    if(j==need.size()) return true;
    if(Bet[i]==-1)
    {
      if(res[i].first>=need[j].first){match[j]=i; j++;}
      else return false;
    }
    else if(j<Bet[i]){match[Bet[i]]=-1; Bet[i]=j; match[j]=i; j++;}
  }
  while(match[j]!=-1&&j<need.size()) j++;
  if(j==need.size()) return true;
  else return false;
}
int main()
{
  scanf("%lld",&N); len=0; memset(first,-1,sizeof(first));
  for(LL i=1;i<N;i++){LL x,y,d; scanf("%lld%lld%lld",&x,&y,&d); ins(x,y,d); ins(y,x,d);}
  memset(dis,126,sizeof(dis)); Dfs(1); Pre(); memset(bo,0,sizeof(bo));
  scanf("%lld",&M);
  for(LL i=1;i<=M;i++) scanf("%lld",&id[i]);
  LL L=0,R=1e9*N; LL ret=-1;
  while(L<=R)
  {
    LL mid=(L+R)>>1;
    if(Check(mid)) R=mid-1,ret=mid;
    else L=mid+1;
  }
  return printf("%lld\n",ret),0;
}
View Code

 晚上打了一下模版 不会的考了认命

 

Nov.18

出发Noip 调整了一下心情 然后晚上去买了杯奶茶喝 住的地方有点毛病 后面那家人打麻将打通宵,和我同房的lcd大神买了几本小黄杂志

 

Nov.19

Noip早上考完 感觉难度有点吃屁 第二题10点还没出来想法有点慌 然后后面暴力发现也不会打也有点慌 第三题期望没看题目直接跳(后来发现好像是一道可以拿分的题目) 第二题打了200行树剖想骗60分 感觉不稳数据太大调不过去 然后弃疗了 估分100+30(60)+0

 

下午心情不太好 和小伙伴一起去看电影 还没了几瓶护手霜(作为安慰吧) 晚上继续买奶茶颓废

 

Nov.20

今天的题好像友善一点 然后吸取教训都看了一遍题目 然后第二题感觉不可做,随便按数据点蒙分 但第三题好像可以水暴力 然后就sb的打了 考完出来发现看错了一点条件 第三题

估分100+70+60

 

然后就回去了..再见广州 可能要退役

 

出成绩的那一天 好像比其他数据都要弱 分数100+35+0+100+70+55=360 一等有点悬

然后出线了 1= 280 贺电

liao爷爷ak 有个小朋友作弊..

 

算是结束了 没有遗憾没有保留

 

posted @ 2016-11-08 20:27  wohenshuai  阅读(230)  评论(3编辑  收藏  举报