首页 > 代码库 > NOIp 0904 出题报告

NOIp 0904 出题报告

T1 huajitree

纯模拟,把S拆成二进制查一下有多少个1,然后把这个数和N*M求一下gcd,除一下输出就好了。说求期望值可能对新高一不太友好….

技术分享
 1 //huajitree 2 //2016.8.22 3 //by Cydiater 4 #include <iostream> 5 #include <cstdio> 6 #include <cstdlib> 7 #include <queue> 8 #include <map> 9 #include <cstring>10 #include <string>11 #include <algorithm>12 #include <cmath>13 #include <ctime>14 #include <iomanip>15 using namespace std;16 #define FILE "huajitree"17 #define ll long long18 #define up(i,j,n)       for(int i=j;i<=n;i++)19 #define down(i,j,n)     for(int i=j;i>=n;i--)20 const int oo=0x3f3f3f3f;21 inline ll read(){22       char ch=getchar();ll x=0,f=1;23       while(ch>9||ch<0){if(ch==-)f=-1;ch=getchar();}24       while(ch>=0&&ch<=9){x=x*10+ch-0;ch=getchar();}25       return x*f;26 }27 ll S,ans=0,N,M;28 namespace solution{29       inline ll gcd(ll a,ll b){return b==0?a:gcd(b,a%b);}30       void init(){31             N=read();M=read();S=read();32             ans=0;33       }34       void slove(){35             while(S>0){ans+=S%2;S/=2;}36       }37       void output(){38             ll d=gcd(ans,N*M);39             if(ans>0)cout<<ans/d<</<<N*M/d;40             else puts("0");41       }42 }43 int main(){44       freopen(FILE".in","r",stdin);45       freopen(FILE".out","w",stdout);46       using namespace solution;47       init();48       slove();49       output();50       return 0;51 }
View Code

 

T2 pack

起名叫pack是为了衔接剧情QAQ,60分裸的DP,会DP就应该会,如果学过DP这个的60分没写出来就应该考虑补一下DP了。

所有数据都是随机的..所以加上一些奇淫技巧也许能暴力A掉?

给出状态转移方程:

首先把h和v的前缀和都搞出来

技术分享

技术分享

 

技术分享
 1 //NOIp by Cydiater right 2 //by Cydiater 3 //2016.8.24 4 #include <iostream> 5 #include <cstdio> 6 #include <cstring> 7 #include <string> 8 #include <algorithm> 9 #include <queue>10 #include <map>11 #include <ctime>12 #include <cstdlib>13 #include <iomanip>14 #include <cmath>15 using namespace std;16 #define ll long long17 #define up(i,j,n)       for(int i=j;i<=n;i++)18 #define down(i,j,n)     for(int i=j;i>=n;i--)19 #define FILE "pack"20 const int MAXN=1e6+5;21 const int oo=0x3f3f3f3f;22 inline ll read(){23       char ch=getchar();int x=0,f=1;24       while(ch>9||ch<0){if(ch==-)f=-1;ch=getchar();}25       while(ch>=0&&ch<=9){x=x*10+ch-0;ch=getchar();}26       return x*f;27 }28 ll N,sum[MAXN],h[MAXN],q[MAXN],head,tail,f[MAXN];29 namespace solution{30       void init(){31             N=read();32             memset(sum,0,sizeof(sum));33             memset(h,0,sizeof(h));34             memset(f,0,sizeof(f));35             up(i,1,N){36                   sum[i]=sum[i-1]+read();37                   h[i]=h[i-1]+read();38             }39       }40       inline double col(int x,int y){41             double t1=f[y]-f[x];42             double t2=sum[y]-sum[x];43             return t1/t2;44       }45       void slove(){46             head=1;tail=0;q[++tail]=0;47             up(i,1,N){48                   while(head<tail&&col(q[head],q[head+1])<h[i])head++;49                   f[i]=f[q[head]]+(sum[i]-sum[q[head]])*h[i];50                   while(head<tail&&col(q[tail-1],q[tail])>col(q[tail],i))tail--;51                   q[++tail]=i;52             }53       }54       void output(){55             cout<<f[N]<<endl;56       }57 }58 int main(){59       freopen(FILE".in","r",stdin);60       freopen(FILE".out","w",stdout);61       using namespace solution;62       init();63       slove();64       output();65       return 0;66 }
View Code

 

T3 block

我太弱啦出不了第三题,这是BZOJ上的一道题,所以说这个的题解你随便一搜成片的都是,我简单废话一下,本题所需要的数据结构就是线段树,简单的说就是用线段树维护连通性,高二的各位神犇你们说良心不良心呀。

怎么用线段树维护连通性呢?

反正我是用一个线段树里维护6个值,分别是

左上到左下的连通性

左上到右下的连通性

左上到右上的连通性

左下到右下的连通性

左下到右上的连通性

右上到右下的连通性

 

维护四个值好像也没什么问题,具体的自己思考

 

然后合并什么的就很好(ma)搞(fan)了

具体的实现可以参考我180行的代码,虽然写的很丑..

COGS上有一个神犇90行就解决了,你们也可以去看看他的代码

 

技术分享
  1 //BZOJ 1018  2 //by Cydiater  3 //2016.8.24  4 #include <iostream>  5 #include <cstring>  6 #include <cstdio>  7 #include <cstdlib>  8 #include <string>  9 #include <ctime> 10 #include <cmath> 11 #include <queue> 12 #include <map> 13 #include <iomanip> 14 #include <algorithm> 15 using namespace std; 16 #define FILE "block" 17 #define ll long long 18 #define up(i,j,n)       for(int i=j;i<=n;i++) 19 #define down(i,j,n)     for(int i=j;i>=n;i--) 20 const int MAXN=1e5+5; 21 const int oo=0x3f3f3f3f; 22 inline int read(){ 23       char ch=getchar();int x=0,f=1; 24       while(ch>9||ch<0){if(ch==-)f=-1;ch=getchar();} 25       while(ch>=0&&ch<=9){x=x*10+ch-0;ch=getchar();} 26       return x*f; 27 } 28 struct Tree{ 29       bool luru;/*left up to right up*/ 30       bool ldrd;/*left down to right down*/ 31       bool lurd;/*left up to right down*/ 32       bool ldru;/*left down to right up*/ 33       bool luld;/*left up ro left down*/ 34       bool rurd;/*right up to right down*/ 35 }t[MAXN<<4]; 36 bool toright[2][MAXN],pipe[MAXN]; 37 int N,r1,c1,r2,c2,k,v,limleft,limright,cnt=0; 38 char s[20]; 39 namespace solution{ 40       Tree reload(Tree a,Tree b,bool upedge,bool downedge){ 41             Tree c; 42             c.luld=a.luld;c.rurd=b.rurd; 43             c.luru=(a.luru&upedge&b.luru)|(a.lurd&downedge&b.ldru); 44             c.ldrd=(a.ldrd&downedge&b.ldrd)|(a.ldru&upedge&b.lurd); 45             c.lurd=(c.luru&c.rurd)|(c.luld&c.ldrd)|(a.luru&upedge&b.lurd)|(a.lurd&downedge&b.ldrd); 46             c.ldru=(c.ldrd&c.rurd)|(c.luld&c.luru)|(a.ldrd&downedge&b.ldru)|(a.ldru&upedge&b.luru); 47             c.luld=c.luld|(c.lurd&c.ldrd)|(c.ldru&c.luru)|(a.luru&upedge&b.luld&downedge&a.ldrd); 48             c.rurd=c.rurd|(c.lurd&c.luru)|(c.ldru&c.ldrd)|(b.luru&upedge&a.rurd&downedge&b.ldrd); 49             return c; 50       } 51       void build(int leftt,int rightt,int root){ 52             if(leftt==rightt){ 53                   t[root].luru=t[root].ldrd=1; 54                   t[root].lurd=t[root].ldru=t[root].luld=t[root].rurd=0; 55                   return; 56             } 57             int mid=(leftt+rightt)>>1; 58             t[root].luru=t[root].ldrd=t[root].lurd=t[root].ldru=t[root].luld=t[root].rurd=0; 59             build(leftt,mid,root<<1); 60             build(mid+1,rightt,root<<1|1); 61       } 62       void updata1(int leftt,int rightt,int root){ 63             if(leftt>k||rightt<k)       return; 64             if(leftt==k&&rightt==k){ 65                   t[root].luld=t[root].rurd=t[root].lurd=t[root].ldru=v; 66                   return; 67             } 68             int mid=(leftt+rightt)>>1; 69             updata1(leftt,mid,root<<1); 70             updata1(mid+1,rightt,root<<1|1); 71             t[root]=reload(t[root<<1],t[root<<1|1],toright[0][mid],toright[1][mid]); 72       } 73       void updata2(int leftt,int rightt,int root){ 74             if(leftt>k||rightt<k)   return; 75             if(leftt==k&&rightt==k) return; 76             int mid=(leftt+rightt)>>1; 77             updata2(leftt,mid,root<<1); 78             updata2(mid+1,rightt,root<<1|1); 79             t[root]=reload(t[root<<1],t[root<<1|1],toright[0][mid],toright[1][mid]); 80       } 81       Tree get(int leftt,int rightt,int root){ 82             Tree a,b,c; 83             if(leftt>=limleft&&rightt<=limright)     return t[root]; 84             int mid=(leftt+rightt)>>1; 85             if(mid+1<=limleft)                  return get(mid+1,rightt,root<<1|1); 86             else if(limright<=mid)              return get(leftt,mid,root<<1); 87             else{ 88                   a=get(leftt,mid,root<<1); 89                   b=get(mid+1,rightt,root<<1|1); 90                   c=reload(a,b,toright[0][mid],toright[1][mid]); 91             } 92             return c; 93       } 94       void slove(){ 95             memset(toright,0,sizeof(toright)); 96             while(scanf("%s",s)!=EOF){ 97                   if(s[0]==E)break; 98                   if(s[0]==O){ 99                         c1=read();r1=read();c2=read();r2=read();100                         if(r1==r2&&c1!=c2){101                               k=r1;v=1;pipe[k]=1;102                               updata1(1,N,1);103                         }104                         if(r1!=r2&&c1==c2){105                               r1=min(r1,r2);k=r1;106                               toright[c1-1][r1]=1;107                               updata2(1,N,1);108                         }109                   }110                   if(s[0]==C){111                         c1=read();r1=read();c2=read();r2=read();112                         if(r1>r2){113                               swap(r1,r2);114                               swap(c1,c2);115                         }/*make sure that r1<=r2*/116                         if(r1==r2&&c1!=c2){117                               k=r1;v=0;pipe[k]=0;118                               updata1(1,N,1);119                         }120                         if(r1!=r2&&c1==c2){121                               r1=min(r1,r2);122                               toright[c1-1][r1]=0;k=r1;123                               updata2(1,N,1);124                         }125                   }126                   if(s[0]==A){127                         c1=read();r1=read();c2=read();r2=read();128                         if(c1==c2&&r1==r2){puts("Y");continue;}129                         if(r1>r2){130                               swap(r1,r2);131                               swap(c1,c2);132                         }/*make sure that r1<=r2*/133                         limleft=1;limright=r1;Tree go_left=get(1,N,1);134                         limleft=r1;limright=r2;Tree go_mid=get(1,N,1);135                         limleft=r2;limright=N;Tree go_right=get(1,N,1);136                         if(r1==r2&&c1!=c2){137                               if(go_left.rurd||go_right.luld||go_mid.luld)puts("Y");138                               else                                        puts("N");139                         }140                         if(r1!=r2&&c1==c2){141                               if(c1==1){142                                     if((go_left.rurd&go_mid.ldrd&go_right.luld)||go_mid.luru||(go_left.rurd&go_mid.ldru)||(go_right.luld&go_mid.lurd))puts("Y");143                                     else                                                                                                              puts("N");144                               }else{145                                     if((go_left.rurd&go_mid.luru&go_right.luld)||go_mid.ldrd||(go_left.rurd&go_mid.lurd)||(go_right.luld&go_mid.ldru))puts("Y");146                                     else                                                                                                              puts("N");147                               }148                         }149                         if(r1!=r2&&c1!=c2){150                               if(c1==1){/*left up to right down*/151                                     if((go_left.rurd&go_mid.ldrd)||go_mid.lurd||(go_left.rurd&go_mid.ldru&go_right.luld)||(go_mid.luru&go_right.luld))puts("Y");152                                     else                                                                                                              puts("N");153                               }else{/*left down to right up*/154                                     if((go_left.rurd&go_mid.luru)||go_mid.ldru||(go_left.rurd&go_mid.lurd&go_right.luld)||(go_mid.ldrd&go_right.luld))puts("Y");155                                     else                                                                                                              puts("N");156                               }157                         }158                   }159             }160       }161 }162 int main(){163     freopen(FILE".in","r",stdin);164     freopen(FILE".out","w",stdout);165       using namespace solution;166       N=read();167       build(1,N,1);168       slove();169       return 0;170 }
View Code

 

小结

这套题对新高一可能不太友好,但是这些知识点全都是在NOIp范围内的,可能一些比较偏?但是一些零碎的东西还是要学的。个人以为NOIp2016想进top5这套题应该要拿到230分以上吧..

 

没什么可说的了,感谢滑稽大师cdc友情出演。

NOIp 0904 出题报告