• 考试反思(2019/1/22)


    今天是noip2017d2测验

    因为没开longlong写挂t1是一种什么样的体验???

    1.奶酪

    因为最近在练dfs,就十分钟写出dfs然后过了样例就交了不管了。

    就不放代码了,看下次再写还记不记得开longlong

    2.宝藏

    其实之前刷状压时做过,写起来还好,中间因为剪错了枝,一度调试到不知所措。

     1 const int maxn=1e4+5;
     2 int f[1<<12],d[20],e[20][20];
     3 int n,m,ans=0x3f3f3f3f,num;
     4 void read()
     5 {
     6     memset(e,0x3f,sizeof(e));
     7     n=quick();
     8     m=quick();
     9     int x,y,l;
    10     for(int i=1;i<=m;i++)
    11     {
    12         x=quick();
    13         y=quick();
    14         l=quick();
    15         e[x][y]=e[y][x]=min(e[x][y],l);
    16     }
    17 }
    18 void dfs(int now)
    19 {
    20     //printf("%d
    ",now); 
    21     if(num==n)
    22     {
    23         ans=min(ans,f[(1<<n)-1]);
    24         /*printf("%d
    ",ans);
    25         for(int i=1;i<=n;i++)
    26             printf("%d ",d[i]);
    27         printf("
    ");*/
    28         return;
    29     }
    30     for(int i=1;i<=n;i++)
    31     {
    32         if((now&(1<<i-1))==0)
    33             continue;
    34         for(int j=1;j<=n;j++)
    35         {
    36             if(d[j])
    37                 continue;
    38             if((1<<j-1)&now)
    39                 continue;
    40             if(e[i][j]==0x3f3f3f3f)
    41                 continue;
    42             //if(f[now]+e[i][j]*d[i]>f[(1<<n)-1])
    43                 //break;
    44             if(f[now]+e[i][j]*d[i]<f[now|(1<<j-1)])
    45             {
    46                 num++;
    47                 f[now|(1<<j-1)]=f[now]+e[i][j]*d[i];
    48                 int t=d[j];
    49                 d[j]=d[i]+1;
    50                 dfs(now|(1<<j-1));
    51                 //f[now|(1<<j-1)]-=e[i][j]*d[i];
    52                 d[j]=t;
    53                 num--;
    54             }
    55         } 
    56     }
    57 }
    58 void work()
    59 {
    60     for(int i=1;i<=n;i++)
    61     {
    62         memset(f,0x3f,sizeof(f));
    63         memset(d,0,sizeof(d));
    64         num=1;
    65         d[i]=1;
    66         f[1<<i-1]=0;
    67         dfs(1<<i-1);
    68         ans=min(ans,f[(1<<n)-1]);
    69     }
    70     printf("%d",ans);
    71 }
    Code

    3.列队

    先写了个30分代码,然后考试剩下的一个多小时全花在攻克n==1那4组数据上了,用鬼畜的线段树没有做出来,不过好歹练习了下线段树模版

    30分+失败的线段树

      1 const int maxn=1e6+5;
      2 int n,m,q,ans,mark1,mark2;
      3 int a[1005][1005];
      4 int sum[maxn],lazytag[maxn],b[maxn];
      5 void build(int l,int r,int x,int y,int z)
      6 {
      7     if(x==y)
      8     {
      9         if(x==m)
     10             mark1=z;
     11         sum[z]=0;
     12         return;
     13     }
     14     int j=(x+y)>>1;
     15     build(l,r,x,j,z<<1);
     16     build(l,r,j+1,y,z<<1|1);
     17 }
     18 void pushdown(int x,int y,int z)
     19 {
     20     if(!lazytag[z])
     21         return;
     22     lazytag[z<<1]=lazytag[z<<1|1]=lazytag[z];
     23     lazytag[z]=0; 
     24 }
     25 void query(int u,int x,int y,int z)
     26 {   
     27     if(u==x&&u==y)
     28     {
     29         ans=b[u+lazytag[z]];
     30         return;
     31     }
     32     pushdown(x,y,z);
     33     int j=(x+y)>>1;
     34     if(u<=j)
     35         query(u,x,j,z<<1);
     36     if(u>j)
     37         query(u,j+1,y,z<<1|1);
     38      
     39 }
     40 void change1(int l,int r,int x,int y,int z)
     41 {
     42     if(l<=x&&r>=y)
     43     {
     44         lazytag[z]++;
     45         return;
     46     }
     47     pushdown(x,y,z);
     48     int j=(x+y)>>1;
     49     if(l<=j)
     50         change1(l,r,x,j,z<<1);
     51     if(r>j)
     52         change1(l,r,j+1,y,z<<1|1);
     53 }
     54 void change2(int u,int x,int y,int z)
     55 {
     56     if(u==x&&u==y)
     57     {
     58         lazytag[mark1]+=b[u]-b[m+lazytag[mark1]];
     59         return;
     60     }
     61     pushdown(x,y,z);
     62     int j=(x+y)>>1;
     63     if(u<=j)
     64         change2(u,x,j,z<<1);
     65     if(u>j)
     66         change2(u,j+1,y,z<<1|1);
     67 }
     68 int main()
     69 {
     70     input();
     71     n=quick();
     72     m=quick();
     73     q=quick();
     74     if(n!=1&&n<=1000&&m<=1000)
     75     {
     76         for(int i=1;i<=n;i++)
     77             for(int j=1;j<=m;j++)
     78                 a[i][j]=(i-1)*m+j;
     79             int x,y;
     80         for(int i=1;i<=q;i++)
     81         {
     82             x=quick();
     83             y=quick();
     84             printf("%d
    ",a[x][y]);
     85             int t=a[x][y];
     86             for(int i=y+1;i<=m;i++)
     87                 a[x][i-1]=a[x][i];
     88             for(int i=x+1;i<=n;i++)
     89                 a[i-1][m]=a[i][m];
     90             a[n][m]=t; 
     91         }
     92     }
     93     if(n==1)
     94     {
     95         for(int i=1;i<=m;i++)
     96             b[i]=i;
     97         build(1,m,1,m,1);
     98         int x,y;
     99         for(int i=1;i<=q;i++)
    100         {
    101             x=quick();
    102             y=quick();
    103             query(y,1,m,1);
    104             if(ans%m>0)
    105                 ans%=m;
    106             printf("%d
    ",ans);
    107             change1(y,m-1,1,m,1);
    108             change2(ans,1,m,1);
    109         }
    110     }
    111     return 0;
    112 }
    Code
  • 相关阅读:
    第七组(69)团队展示
    结对编程作业
    同步异步和阻塞非阻塞
    TCP和UDP和IP和HTTP和socket
    http协议
    数据库基础知识
    准确的笑话
    Java实现多线程的方式
    HashMap
    HTTPS与HTTP
  • 原文地址:https://www.cnblogs.com/Achensy/p/10304206.html
Copyright © 2020-2023  润新知