考试反思(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\n",now); 
21     if(num==n)
22     {
23         ans=min(ans,f[(1<<n)-1]);
24         /*printf("%d\n",ans);
25         for(int i=1;i<=n;i++)
26             printf("%d ",d[i]);
27         printf("\n");*/
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\n",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\n",ans);
107             change1(y,m-1,1,m,1);
108             change2(ans,1,m,1);
109         }
110     }
111     return 0;
112 }
Code

 

posted @ 2019-01-22 15:39  Achen_sy  阅读(190)  评论(0编辑  收藏  举报