写这篇博客的时候有点激动 为了让本身不颓 仍是写写日记 存存模板php
Nov.8 2016node
今天早上买了两个蛋挞 吃了一个 而后就作数论(前天晚上仍是想放弃数论 可是昨天被数论虐了 woc noip模拟赛出了道杜教筛)ios
而后白天就脑补了几道 积性函数 把例题过了一遍 数组
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½) 作 被虐傻了ide
sb数论废了我十二张白纸 真是感人肺腑 固然还有两题函数
总结 能够提出来的尽可能提 而后$gcd(a,b)$ 变成 1 再莫比乌斯反演一下下 而后还有一点小技巧记记就好测试
今天晚上睡觉前所有再推一遍大数据
哦对 今天悟出了怎么打分块 .......................... 今天还学会了插数学公式 可是全部推导要写半天不写了spa
晚上复习了自动机dp 明天测试不要挂哇!3d
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; }
固然我交上去是删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; }
晚上打了一下模版 不会的考了认命
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 有个小朋友做弊..
算是结束了 没有遗憾没有保留