【日常】暑假7天培训

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);
}
View Code

正解:

忘记加一个取最小值然后超限了

#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;
}
View Code

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);
}
View Code

正解:

看不懂

大概是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;
}
View Code

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);
}
View Code

正解:

 每次取最小值乘上另一个值后加入这个值

把另外两个数删掉

#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);
}
View Code

晚上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);
}
View Code

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);
}
View Code

正解:

#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;
}
View Code

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;
            }
        }
    }
}
View Code

正解:

#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);
    }
}
View Code

 晚上

敲了一下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);
}
View Code

正解:

要用树状数组啥的

没弄出来

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;
}
View Code

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);
}
View Code

正解:

没写......

晚上晚自习

wbs老师说他要回厦大上课了

苦逼......

明天来上课的是他的学长gtc

他说我们不要再迟到了

不给他面子也要给gtc面子

害怕......

晚上看美国队长3

猜你喜欢

转载自www.cnblogs.com/BrokenString/p/9274459.html