zoukankan      html  css  js  c++  java
  • 大学ACM第一周心得

    PS:因为旨在复习,所以其实是每个专题挑些题目的(一般挑 提高 上下)

    然后又只写了错了比较多次的题,所以就都不是一个算法的了。

    T1:USACO Training 1.1.1 Your Ride Is Here

      WA的原因:

        1.看错题意:“举例来说,团体 "USACO" 会是 21191315=17955” 这句话当时忽略了,以为就是把字符串转成数字,再取模就行了(甚至还改了longlong,循环里取模等)浪费挺多时间的,下次一定要看懂题目。

        2.看懂题目后,有的变量的初始化没有改。贴个没有改前的代码:

     1 #include<bits/stdc++.h> 
     2 #define ll long long
     3 #define inf 0x7fffff
     4 #define N 500010
     5 #define lson rt<<1
     6 #define rson rt<<1|1
     7 #define FR freopen("tset.in","r",stdin)
     8 #define FW freopen("test.out","w",stdout)
     9 using namespace std;
    10 ll read()
    11 {
    12     ll x=0;int f=1;char ch=getchar();
    13     while (ch<'0'||ch>'9') {if (ch=='-') f=-1;ch=getchar();}
    14     while (ch>='0'&&ch<='9') {x=x*10+ch-'0';ch=getchar();}
    15     return x*f;
    16 }
    17 
    18 char a[10],b[10];
    19 int ansa=0,ansb=0;
    20 int main()
    21 {
    22     scanf("%s%s",&a,&b);
    23     int c=strlen(a),d=strlen(b);
    24     for (int i=0;i<c;i++)
    25     {
    26         int x=a[i]-'A'+1;
    27         ansa=(ansa*x)%47;
    28     }
    29     for (int i=0;i<d;i++)
    30     {
    31         int x=b[i]-'A'+1;
    32         ansb=(ansb*x)%47;
    33     }
    34     // cout<<ansa<<endl<<ansb<<endl;
    35     // ansa%=47,ansb%=47;
    36     if (ansa==ansb) printf("GO");
    37     else printf("STAY");
    38     return 0;
    39 }
    View Code

        第19行ansa,ansb的初始化还是原来的,这里应该改成1;

     T2:洛谷P3743kotori的设备

      我看了贼久题目,感觉现在读题能力真的差的不行。而且一直以为充电宝一定要在整个单位时间给某一个设备充电,怎么都没懂样例,原来充电宝可以随便给一台设备充多久,0.0000001s都行。所以,看题目标签(不小心看到了嗷)是个二分,那就很好想了,上代码叭(但是精度还是有点坑,一般还是尽量精确吧)

    #include<bits/stdc++.h> 
    #define ll long long
    #define inf 1e10
    #define N 500010
    #define lson rt<<1
    #define rson rt<<1|1
    #define FR freopen("tset.in","r",stdin)
    #define FW freopen("test.out","w",stdout)
    using namespace std;
    ll read()
    {
        ll x=0;int f=1;char ch=getchar();
        while (ch<'0'||ch>'9') {if (ch=='-') f=-1;ch=getchar();}
        while (ch>='0'&&ch<='9') {x=x*10+ch-'0';ch=getchar();}
        return x*f;
    }
    double a[100010],b[100010],n;
    double sum,p;
    bool check(double ans)
    {
        double tot=p*ans;
        sum=0;
        for (int i=1;i<=n;i++)
        {
            if (a[i]*ans<=b[i]) continue;
            sum+=(a[i]*ans-b[i]);
        }
        return sum<=tot;
    }
    int main()
    {
        n=read(),p=read();
        for (int i=1;i<=n;i++)
        {
            a[i]=read();b[i]=read();
            sum+=a[i];
        }
        if (sum<=p) 
        {
            printf("-1"); 
            return 0;
        }
        double l=0,r=1e10;
        while (r-l>1e-6)
        {
            double mid=(l+r)/2;
            if (check(mid)) l=mid;
            else r=mid;
        }
        printf("%.6lf",l);
        return 0;
    }
    View Code

     T3:洛谷P1825[USACO11OPEN]Corn Maze S

      很明显的搜索。代码:

     1 #include<bits/stdc++.h> 
     2 #define ll long long
     3 #define inf 1e10
     4 #define N 350
     5 #define lson rt<<1
     6 #define rson rt<<1|1
     7 #define FR freopen("tset.in","r",stdin)
     8 #define FW freopen("test.out","w",stdout)
     9 using namespace std;
    10 ll read()
    11 {
    12     ll x=0;int f=1;char ch=getchar();
    13     while (ch<'0'||ch>'9') {if (ch=='-') f=-1;ch=getchar();}
    14     while (ch>='0'&&ch<='9') {x=x*10+ch-'0';ch=getchar();}
    15     return x*f;
    16 }
    17 
    18 struct node
    19 {
    20     int x;
    21     int y;
    22     int stp;
    23 };
    24 queue<node> q;
    25 char a[N][N];
    26 bool vis[N][N];
    27 int n,m;
    28 int dx[4]={1,0,-1,0};
    29 int dy[4]={0,1,0,-1};
    30 int sx,sy;
    31 void gto(int &nx,int &ny,int k)
    32 {
    33     for (int i=1;i<=n;i++)
    34     {
    35         for (int j=1;j<=m;j++)
    36         {
    37             if (a[i][j]==a[nx][ny]&&(i!=nx||j!=ny))
    38             {
    39                 nx=i;
    40                 ny=j;
    41                 return ;
    42             }
    43         }
    44     }
    45 }
    46 int main()
    47 {
    48     n=read(),m=read();
    49     for (int i=1;i<=n;i++)
    50     {
    51         for (int j=1;j<=m;j++)
    52         {
    53             char ch;
    54             // ch=getchar();
    55             cin>>ch;
    56             a[i][j]=ch;
    57             if (ch=='@')
    58             {
    59                 sx=i;
    60                 sy=j;
    61             }
    62         }
    63     }
    64     vis[sx][sy]=true;
    65     q.push((node){sx,sy,0});
    66     while (!q.empty())
    67     {
    68         node now=q.front();
    69         q.pop();
    70         if (a[now.x][now.y]=='=')
    71         {
    72             printf("%d",now.stp);
    73             return 0;
    74         }
    75         if (a[now.x][now.y]>='A'&&a[now.x][now.y]<='Z')
    76         {
    77             gto(now.x,now.y,now.stp);
    78         }
    79         for (int i=0;i<4;i++)
    80         {
    81             int nx=now.x+dx[i];
    82             int ny=now.y+dy[i];
    83             if (nx>=1&&nx<=n&&ny>=1&&ny<=m&&a[nx][ny]!='#'&&!vis[nx][ny])
    84             {
    85                 vis[nx][ny]=true;
    86                 q.push((node){nx,ny,now.stp+1});
    87             }
    88         }
    89     }
    90     return 0;
    91 }
    完整代码

    复习起了一个点是,在函数参数前加‘&’,那在函数里对值做的修改都会返回原函数。比如代码里的:

     1 void gto(int &nx,int &ny,int k)
     2 {
     3     for (int i=1;i<=n;i++)
     4     {
     5         for (int j=1;j<=m;j++)
     6         {
     7             if (a[i][j]==a[nx][ny]&&(i!=nx||j!=ny))
     8             {
     9                 nx=i;
    10                 ny=j;
    11                 return ;
    12             }
    13         }
    14     }
    15 }
    View Code

     T4:洛谷P5076 【深基16.例7】普通二叉树(简化版)

      给一道绿题跪了。。。因为之前刚好花了一下午复习splay(顺便贴一个splay模板)

      1 #include<bits/stdc++.h> 
      2 #define ll long long
      3 #define inf 1e10
      4 #define N 100010
      5 #define lson rt<<1
      6 #define rson rt<<1|1
      7 #define FR freopen("tset.in","r",stdin)
      8 #define FW freopen("test.out","w",stdout)
      9 using namespace std;
     10 ll read()
     11 {
     12     ll x=0;int f=1;char ch=getchar();
     13     while (ch<'0'||ch>'9') {if (ch=='-') f=-1;ch=getchar();}
     14     while (ch>='0'&&ch<='9') {x=x*10+ch-'0';ch=getchar();}
     15     return x*f;
     16 }
     17 int ch[N][2],sz[N],cnt[N],key[N],f[N],rt,tot,n;
     18 int pd(int x) 
     19 {
     20     return ch[f[x]][1]==x;
     21 }
     22 void update(int x)
     23 {
     24     if (x)
     25     {
     26         sz[x]=cnt[x];
     27         if (ch[x][0]) sz[x]+=sz[ch[x][0]];
     28         if (ch[x][1]) sz[x]+=sz[ch[x][1]];
     29     }
     30 }
     31 void clear(int x)
     32 {
     33     ch[x][0]=ch[x][1]=f[x]=cnt[x]=sz[x]=key[x]=0;
     34 }
     35 void rotate(int x)
     36 {
     37     int fa=f[x],ffa=f[fa],dir=pd(x);
     38     ch[fa][dir]=ch[x][dir^1];f[ch[x][dir^1]]=fa;
     39     ch[x][dir^1]=fa;f[fa]=x;
     40     f[x]=ffa;
     41     if (ffa) ch[ffa][ch[ffa][1]==fa]=x;
     42     update(x);update(fa);
     43 }
     44 void Spl(int x)
     45 {
     46     int fa=f[x];
     47     while (fa)
     48     {
     49         if (f[fa]) rotate(pd(x)==pd(fa)?fa:x);
     50         rotate (x);rt=x;fa=f[x];
     51     }
     52 }
     53 void insert(int x)
     54 {
     55     if (rt==0)
     56     {
     57         f[++tot]=0;
     58         ch[tot][0]=ch[tot][1]=0;
     59         key[tot]=x;rt=tot;
     60         sz[tot]=cnt[tot]=1;
     61         return ;
     62     }
     63     int nw=rt,fa=0;
     64     while(1)
     65     {
     66         if (x==key[nw])//这个值之前存在
     67         {
     68             cnt[nw]++;
     69             update(nw);
     70             update(fa);
     71             Spl(nw);break;
     72         }
     73         fa=nw;nw=ch[nw][x>key[nw]];
     74         if (nw==0)//这个值之前不存在
     75         {
     76             f[++tot]=fa;
     77             ch[fa][x>key[fa]]=tot;
     78             ch[tot][1]=ch[tot][0]=0;
     79             key[tot]=x;
     80             sz[tot]=cnt[tot]=1;
     81             update(fa);Spl(tot);
     82             break;
     83         }
     84     }
     85 }
     86 int ask1(int x)
     87 {
     88     int nw=rt,res=0;
     89     while(1)
     90     {
     91         if (x<key[nw]) nw=ch[nw][0];
     92         else
     93         {
     94             if (ch[nw][0]) res+=sz[ch[nw][0]];
     95             if (x==key[nw])
     96             {
     97                 Spl(nw);
     98                 return res+1;
     99             }
    100             else res+=cnt[nw],nw=ch[nw][1];
    101         }
    102     }
    103 }
    104 int ask2(int x)
    105 {
    106     int nw=rt;
    107     while (1)
    108     {
    109         if (ch[nw][0]&&x<=sz[ch[nw][0]])
    110             nw=ch[nw][0];
    111         else
    112         {
    113             if (ch[nw][0]) x-=sz[ch[nw][0]];
    114             if (x<=cnt[nw]) return key[nw];
    115             else {x-=cnt[nw];nw=ch[nw][1];}
    116         }
    117     }
    118 }
    119 int getpre()
    120 {
    121     int nw=ch[rt][0];
    122     while (ch[nw][1]) nw=ch[nw][1];
    123     return nw;
    124 }
    125 int getnex()
    126 {
    127     int nw=ch[rt][1];
    128     while (ch[nw][0]) nw=ch[nw][0];
    129     return nw;
    130 }
    131 void del(int x)
    132 {
    133     ask1(x);
    134     if (cnt[rt]>1)
    135     {
    136         cnt[rt]--;
    137         update(rt);
    138         return ;
    139     }
    140     if (!ch[rt][0]&&!ch[rt][1])
    141     {
    142         clear(rt);
    143         rt=0;
    144         return ;
    145     }
    146     if (!ch[rt][0])
    147     {
    148         int old=rt;rt=ch[rt][1];
    149         f[rt]=0;
    150         clear(old);
    151         return ;
    152     }
    153     if (!ch[rt][1])
    154     {
    155         int old=rt;rt=ch[rt][0];
    156         f[rt]=0;
    157         clear(old);
    158         return ;
    159     }
    160     int pre=getpre(),old=rt;
    161     Spl(pre);
    162     ch[rt][1]=ch[old][1];
    163     f[ch[old][1]]=rt;
    164     clear(old);
    165     update(rt);
    166 }
    167 int main()
    168 {
    169     n=read();
    170     while (n--)
    171     {
    172         int ty=read(),x=read();
    173         if (ty==1) insert(x);
    174         if (ty==2) del(x);
    175         if (ty==3) printf("%d
    ",ask1(x));
    176         if (ty==4) printf("%d
    ",ask2(x));
    177         if (ty==5) 
    178         {
    179             insert(x);
    180             printf("%d
    ",key[getpre()]);
    181             del(x);
    182         }
    183         if (ty==6) 
    184         {
    185             insert(x);
    186             printf("%d
    ",key[getnex()]);
    187             del(x);
    188         }
    189     }
    190 }
    splay模板(洛谷)

      然后就想无脑打splay来着,结果全部TLE了。。目前猜测原因是题目有个坑:操作一要查询的值x不一定在平衡树里,这个查询会死循环。但是我并没有改好(对不起我太菜了)所以就直接用STL了,正解:

       

     1 #include<bits/stdc++.h> 
     2 #define ll long long
     3 #define inf 1e10
     4 #define N 100010
     5 #define lson rt<<1
     6 #define rson rt<<1|1
     7 #define FR freopen("tset.in","r",stdin)
     8 #define FW freopen("test.out","w",stdout)
     9 using namespace std;
    10 ll read()
    11 {
    12     ll x=0;int f=1;char ch=getchar();
    13     while (ch<'0'||ch>'9') {if (ch=='-') f=-1;ch=getchar();}
    14     while (ch>='0'&&ch<='9') {x=x*10+ch-'0';ch=getchar();}
    15     return x*f;
    16 }
    17 int q,n,a[N];
    18 int main()
    19 {
    20     q=read();
    21     while (q--)
    22     {
    23         int ty=read(),x=read();
    24         if (ty==1) 
    25         {
    26             int tmp=lower_bound(a+1,a+n+1,x)-a;
    27             printf("%d
    ",tmp);
    28         }
    29         if (ty==2) printf("%d
    ",a[x]);
    30         if (ty==3)
    31         {
    32             int tmp=lower_bound(a+1,a+n+1,x)-a;
    33             printf("%d
    ",a[tmp-1]);
    34         }
    35         if (ty==4)
    36         {
    37             int tmp=upper_bound(a+1,a+n+1,x)-a;
    38             if (tmp!=n+1) printf("%d
    ",a[tmp]);
    39             else printf("2147483647
    ");
    40         }
    41         if (ty==5)
    42         {
    43             int tmp=lower_bound(a+1,a+n+1,x)-a;
    44             if (tmp==n+1) a[++n]=x;
    45             else
    46             {
    47                 for (int i=n;i>=tmp;i--)
    48                 a[i+1]=a[i];a[tmp]=x;
    49                 n++;
    50             }
    51         }
    52     }
    53     return 0;
    54 }
    View Code

                                       

    数论专题专门另外写了篇博客,还在学习中:https://www.cnblogs.com/71-111/p/9745026.html

  • 相关阅读:
    组合数学+结论——cf1359E
    【模拟】分类讨论大模拟+数论——cf1358F
    【思维】前缀和——cf1358E
    Android基础—— 自定义RecyclerView内部控件的监听器
    【思维】模拟+暴力——icpc nwrrc 2019 K
    分治模板
    树上问题&图论模板整理
    数据结构模板整理
    一些计数题
    Codeforces Round #567 (Div. 2)
  • 原文地址:https://www.cnblogs.com/71-111/p/13823218.html
Copyright © 2011-2022 走看看