Day1
早上8:00上课
7:40还在家里的我(颓
匆匆忙忙地到了学校(本校)
去了趟宿舍放东西
8:10左右到了教室
迟到了一小会没有听到wbs老师的自我介绍
感觉他好可爱
我以为我是最迟的......没想到hyc大佬更迟......
第一天就上数论感觉要被劝退回隔壁pj组了
各种奇怪的定理wbs老师说只是简单的复习罢了......然而蒟蒻我脑子要炸了......
大概讲了扩欧 中国剩余定理 分块优化 欧拉函数 莫比乌斯函数 积性函数啥的
然后就没听懂几个
感觉被吊打......
中午12:00
宿舍吃鸡
前两天都好迟睡中午又没睡 感觉眼睛超级酸
下午考试毫无状态
T1:
用数论推一推
大概是用分块写吧
考试代码(90分):
#include <iostream> #include<cstdio> using namespace std; long long n,k,ans,r,t; int main() { freopen("sum.in","r",stdin); freopen("sum.out","w",stdout); cin>>n>>k; for(long long l=1;l<=n;l=r+1) { r=(t=k/l)?(k/t):n; ans-=t*(r-l+1)*(l+r)>>1; } cout<<ans+n*k; fclose(stdin); fclose(stdout); }
正解:
忘记加一个取最小值然后超限了
#include <iostream> #include<cstdio> using namespace std; long long n,k,ans,r,t; int main() { cin>>n>>k; for(long long l=1;l<=n;l=r+1) { r=(t=k/l)?min((k/t),n):n;//取最小 ans-=t*(r-l+1)*(l+r)>>1; } cout<<ans+n*k; }
T2:
当P是质数的时候裸扩欧
不是的时候就不会了......
考试的时候就打了扩欧骗骗分
扩欧证明:https://www.cnblogs.com/BrokenString/p/9275595.html
考试代码(0分):
#include<iostream> #include<cstdio> using namespace std; void exgcd(int a,int b,int &x,int &y) { if(b==0) { x=1; y=0; return; } exgcd(b,a%b,y,x); y-=a/b*x; } int main() { freopen("equation.in","r",stdin); freopen("equation.out","w",stdout); int t; cin>>t; for(int i=1;i<=t;i++) { int x,y,a,b,c; cin>>a>>c>>b; exgcd(a,b,x,y); cout<<x; } fclose(stdin); fclose(stdout); }
正解:
看不懂
大概是Ax+Cy=B
然后B是gcd(A,C)的倍数推一下用扩欧
#include<cstdio> #include<algorithm> #include<cmath> #include<map> using namespace std; typedef long long ll; int gcd(int a,int b){ if(a<b) swap(a,b); while(b) swap(a%=b,b); return a; } void exgcd(int a,int b,ll &x,ll &y){ if(!b){x=1,y=0;return;} ll p,q;exgcd(b,a%b,p,q); x=q,y=p-a/b*q; } int solve(int a,int b,int p){ a%=p,b%=p; if(!a){ if(b) return -1; return 0; } int d=gcd(a,p);ll x,y; if(b%d) return -1; exgcd(p,a,x,y); int g=y%p*(b/d)%p; return g<0?g+p:g; } int main(){ freopen("equation.in","r",stdin); freopen("equation.out","w",stdout); int T,a,p,b; for(scanf("%d",&T);T--;){ scanf("%d%d%d",&a,&b,&p); a%=p,b%=p; int x=solve(a,b,p); if(x==-1) puts("No Solution"); else printf("%d\n",x); } return 0; }
T3:
这是什么鬼 完全没思路
然后打了个随机输出十以内的数骗分
考试代码(0分):
#include<iostream> #include<cstdlib> #include<ctime> #include<cstdio> using namespace std; int main() { freopen("gcd.in","r",stdin); freopen("gcd.out","w",stdout); srand((unsigned)time(NULL)); cout<<rand()%10<<' '; fclose(stdin); fclose(stdout); }
正解:
每次取最小值乘上另一个值后加入这个值
把另外两个数删掉
#include<stdio.h> int n,t,p[1250],res,tmp; bool v[10001]; int main() { freopen("gcd.in","r",stdin); freopen("gcd.out","w",stdout); scanf("%d",&n); for(int i=2;i<=n;++i) if(!v[i]){ p[++t]=i; for(int j=i;j<=n;j+=i) v[j]=1; } for(int l=1,r=t;l<=r;--r){ tmp=p[r]; while(l<=r&&tmp*p[l]<=n) tmp*=p[l++]; ++res; } printf("%d",res); }
晚上6:00开始晚自习
晚上就做了一道扩欧的模板题 写了一下题解啥的
然后wbs老师走了以后就开始和hyc大佬悄咪咪的吃鸡
回宿舍后看了蜘蛛侠3就24:00了
补觉zzz......
Day2
早上7:40多起床
匆忙啃了几口面包就跑到机房去了
早上上了贪心 分治 树状数组 Huffman编码 KMP 还有一堆完全听不懂的高数和概率期望
一早上听不懂强行理解下来感觉脑子要bang
中午偷偷吃泡面看钢铁侠3半小时
T1:
考试的时候到是想到了
每次取2个最小值加起来的值放回原集合中
30分钟打完
考试代码(100分):
#include<iostream> #include<cstdio> #include <queue> using namespace std; priority_queue<int, vector<int>, greater<int> > H; long long n,ans; long long len[200005]; int main() { freopen("cut.in","r",stdin); freopen("cut.out","w",stdout); cin>>n; for(int i=1;i<=n;i++) { cin>>len[i]; H.push(len[i]); } while(H.size()>1) { int k=0; k+=H.top(); H.pop(); k+=H.top(); H.pop(); ans+=k; if(H.empty()) break; H.push(k); } cout<<ans; fclose(stdin); fclose(stdout); }
T2:
树状数组并不会
乱搞20分
考试代码(20分):
#include<cstdio> #include<cstring> #include<algorithm> #include<iostream> using namespace std; int a[10010]; int dp[10010]; int main() { freopen("choose.in","r",stdin); freopen("choose.out","w",stdout); int n,m; cin>>n>>m; for(int i=0;i<n;i++) { scanf("%d",&a[i]); dp[i]=1; } int ans=0; for(int i=1;i<n;i++) { for(int j=0;j<i;j++) { if(a[j]<a[i]) { dp[i]=max(dp[j]+1,dp[i]); } } ans=max(ans,dp[i]); } int k=n-ans; if(k>=m) printf("%d",ans); else { ans-=m-k; printf("%d",ans); } fclose(stdin); fclose(stdout); }
正解:
#include<cstdio> #include<cstring> #include<string> #include<algorithm> using namespace std; const int N=100002; inline int get(){ char ch;while(!isdigit(ch=getchar())); int x=ch-48; while(isdigit(ch=getchar())) x=(x<<3)+(x<<1)+ch-48; return x; } int n,m,ta[N],a[N],f1[N],f2[N],bit[N]; int main(){ freopen("choose.in","r",stdin); freopen("choose.out","w",stdout); scanf("%d%d",&n,&m); for(int i=1;i<=n;++i) ta[i]=a[i]=get(); sort(ta+1,ta+n+1); int l=unique(ta+1,ta+n+1)-ta-1; for(int i=1;i<=n;++i) a[i]=lower_bound(ta+1,ta+l+1,a[i])-ta; for(int i=1;i<=n;++i){ int ret=0; for(int j=a[i]-1;j;j-=j&-j) ret=max(ret,bit[j]); f1[i]=ret+1; for(int j=a[i];j<=l;j+=j&-j) bit[j]=max(bit[j],f1[i]); } memset(bit+1,0,l<<2); for(int i=n;i;--i){ int ret=0; for(int j=a[i]+1;j<=l;j+=j&-j) ret=max(ret,bit[j]); f2[i]=ret+1; for(int j=a[i];j;j-=j&-j) bit[j]=max(bit[j],f2[i]); } memset(bit+1,0,l<<2); int ans=0,len=n-m+1; f1[0]=f2[n+1]=0,a[n+1]=l+1; for(int i=1;i<=len;++i){ int ret=0; for(int j=a[i+m]-1;j;j-=j&-j) ret=max(ret,bit[j]); ans=max(ans,ret+f2[i+m]); for(int j=a[i];j<=l;j+=j&-j) bit[j]=max(bit[j],f1[i]); } printf("%d\n",ans); return 0; }
T3:
KMP题
并不会
直接放弃
考试代码(0分):
#include<iostream> #include<cstdio> #include<string> using namespace std; int main() { while(~scanf("%s",a)) { string a; string b; cin>>a; b[0]=a[0]; for(int i=1;i<a.size();i++) { b[i]=a[i]; while(a[i]==a[1]) { } if(b.size()==a.size()) { cout<<1<<endl; break; } } } }
正解:
#include <iostream> #include <cstdio> #include <cstring> using namespace std; const int maxn = 1000005; int next[maxn]; void get(char *s) { int l=strlen(s); int j=0,k=-1; next[0]=-1; while(j<l) { if(k == -1 || s[j] == s[k]) { next[++j]=++k; } else { k = next[k]; } } } char s[maxn]; int main() { freopen("string.in","r",stdin); freopen("string.out","w",stdout); while(~scanf("%s",s) ) { get(s); int ans=1; int l=strlen(s); if(l%(l-next[l])==0) { ans=l/(l-next[l]); } printf("%d\n",ans); } }
晚上
敲了一下KMP的板子
还有树状数组1 2的板子
晚上看了一部钢铁侠3
呼哧呼哧睡觉~
Day3
早上8:00到机房
发现机房只有我们学校的人了???
原来其他学校的人都被劝退到隔壁PJ了???
好吧我承认有的我也听不懂
早上上了一堆的暴搜
还有DFS序 迭代加深 A* 一些物理题???
看了几道题目贼长的暴搜感觉脑子炸once again
中午12:00
在食堂吃饭下大雨被困住
三个瓜皮跑到旁边宿舍躲雨吃鸡
下午考试
T1:
被wbs老师耍了一波......
说好的题目不用树状数组的咧?
然后啪啦啪啦打了2h
还TM多打了测试时用的序列(我好菜啊
考试代码(0分):
#include<iostream> #include<cstdio> using namespace std; int n,m; struct edge { int pre; int next; int to; }e[100010]; int f[100010]; int ans[100010]; int xu[100010]; int head[100010]; int sum; void add(int x,int y) { e[++m].pre=x; e[m].to=y; e[m].next=head[x]; head[x]=m; } void dfs(int x) { xu[++sum]=x; int u=head[x]; if(u==0) return; while(u!=0) { dfs(e[u].to); f[x]+=f[e[u].to]+1; u=e[u].next; } } int main() { freopen("tree.in","r",stdin); freopen("tree.out","w",stdout); cin>>n; for(int i=2;i<=n;i++) { int x; cin>>x; add(x,i); } dfs(1); for(int i=1;i<=n;i++) cout<<xu[i]<<" "; cout<<endl;//多输出这行少了30分 for(int i=1;i<=n;i++) { for(int j=i+1;j<=i+f[xu[i]];j++) { if(xu[j]<xu[i]) ans[xu[i]]++; } } for(int i=1;i<=n;i++) cout<<ans[i]<<" "; fclose(stdin); fclose(stdout); }
正解:
要用树状数组啥的
没弄出来
T2:
早上上的例题然而并不会
埃及分数迭代加深
考试时放弃(0分)
正解:
#include<cstdio> #include<cstdlib> #include<cstring> #include<cmath> #include<iostream> #include<algorithm> #define N 1000 using namespace std; long long ans[N],s[N],mo,ch; int dep; long long gcd(long long a,long long b){return b==0?a:gcd(b,a%b);} void outp() { int i; if (ans[dep]>s[dep]) { for (i=1;i<=dep;i++) { ans[i]=s[i]; } } } void dfs(long long x,long long y,int d) { long long a,b,i,w; if (d==dep) { s[d]=y; if ((x==1)&&(s[d]>s[d-1])) outp(); return; } for (i=max(s[d-1]+1,y/x+1);i<(dep-d+1)*y/x;i++) { b=y*i/gcd(y,i); a=b/y*x-b/i; w=gcd(a,b); a/=w; b/=w; s[d]=i; dfs(a,b,d+1); } } int main() { int i=0,j; scanf("%lld%lld",&ch,&mo); i=gcd(ch,mo); ch/=i; mo/=i; for (dep=2;;dep++) { ans[1]=0; s[0]=0; ans[dep]=2000000000; dfs(ch,mo,1); if (ans[1]!=0) break; } for (j=1;j<=dep;j++) { printf("%lld ",ans[j]); } printf("\n"); return 0; }
T3:
一道闲得蛋疼的物理题......
前70分暴力求公式
后三十分用调和函数大数公式
由于边加边乘少了30
考试代码(40分):
#include<iostream> #include<cmath> #include<cstdio> using namespace std; double n,l,ans; int main() { freopen("book.in","r",stdin); freopen("book.out","w",stdout); cin>>n>>l; for(double i=1;i<=n;i++) { ans+=1/(2*i)*l; } printf("%.4f",ans); fclose(stdin); fclose(stdout); }
正解:
没写......
晚上晚自习
wbs老师说他要回厦大上课了
苦逼......
明天来上课的是他的学长gtc
他说我们不要再迟到了
不给他面子也要给gtc面子
害怕......
晚上看美国队长3