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 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 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 }

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 long
17 #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 }

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 }

小结

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

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

时间: 2024-10-13 19:43:31

NOIp 0904 出题报告的相关文章

NOIP 2003解题报告

第一题(神经网络): 题目大意,给出一些点,每个点都有2个值,c和u,给出一些有向边,权值为w.入度为0的点的c已知,其它点的c未知,每个入度不为0的点node的c等于sum(c[k]*w[k][node]),k为与它相连(有向边指向node)的点.求所有出度为0且c>0的点. 解题过程: 此题的方法应该很多,比如拓扑排序,BFS等:我直接写了个递归,要求某个点的c,就先访问所有与它相连的点,递归下去直到 碰到入度为0的点.. 较麻烦的送分题,30分钟AC 第二题(侦探推理): 明明同学最近迷上

NOIP 2006 解题报告

第一题: 在Mars星球上,每个Mars人都随身佩带着一串能量项链.在项链上有N颗能量珠.能量珠是一颗有头标记与尾标记的珠子,这些标记对应着某个正整数.并且,对于相邻的两颗珠子,前一颗珠子的尾标记一定等于后一颗珠子的头标记.因为只有这样,通过吸盘(吸盘是Mars人吸收能量的一种器官)的作用,这两颗珠子才能聚合成一颗珠子,同时释放出可以被吸盘吸收的能量.如果前一颗能量珠的头标记为m,尾标记为r,后一颗能量珠的头标记为r,尾标记为n,则聚合后释放的能量为(Mars单位),新产生的珠子的头标记为m,尾

NOIP 2000解题报告

题目简单,思路很快就有,关键是代码实现能力,大概3个多小时完成.第一题:题目大意:将一个10进制数N转换成-B进制数 (负进制转换):B<=20, N(-32768<=N<=32767): 解题过程:首先想到仿照 正进制转换过程,但结果中有负数,就想到把负数处理掉,加个B即可,为了是结果不变,比它高1位的那一位要加1,这样某一位又有可能出现B这个数字,同理减去一个B,高位减去1:重复知道全部是0到B-1的数字:40分钟一次AC 第二题:题目大意:给定一个N位数字,用k个乘号将其划分为k+

NOIP 2001解题报告

第一题:  有形如:ax3+bx2+cx+d=0  这样的一个一元三次方程.给出该方程中各项的系数(a,b,c,d  均为实数),并约定该方程存在三个不同实根(根的范围在-100至100之间),且根与根之差的绝对值>=1.要求由小到大依次在同一行输出这三个实根(根与根之间留有空格),并精确到小数点后2位. 解题过程: 直接枚举,把根的范围扩大到100来处理 (精确到小数点后2位 ),水题,15分钟写完AC.如果精确到小数点后6位什么的,就只能二分求解了..我是把结果和0相差不到0.02的 就当成

10 noip 机器翻译 解题报告

题目描述 Description 小晨的电脑上安装了一个机器翻译软件,他经常用这个软件来翻译英语文章. 这个翻译软件的原理很简单,它只是从头到尾,依次将每个英文单词用对应的中文含义 来替换.对于每个英文单词,软件会先在内存中查找这个单词的中文含义,如果内存中有, 软件就会用它进行翻译:如果内存中没有,软件就会在外存中的词典内查找,查出单词的中 文含义然后翻译,并将这个单词和译义放入内存,以备后续的查找和翻译. 假设内存中有M个单元,每单元能存放一个单词和译义.每当软件将一个新单词存入 内存前,如

0904解题报告

第一题 简单模拟,把s拆成二进制形式,然后统计有多少个一,将  ans/n*m   化简即可. 1 #include<iostream> 2 #include<cstdio> 3 #include<cstring> 4 #include<cstdlib> 5 #include<cmath> 6 #include<ctime> 7 #include<algorithm> 8 using namespace std; 9 lo

NOIp 2010 解题报告

1.   机器翻译 可以看出这是一道队列的模拟题目.按照题目要求模拟翻译过程即可. 复杂度O(N) 1 #include<iostream> 2 #include<cstdio> 3 #include<cstring> 4 #include<cmath> 5 #include<algorithm> 6 using namespace std; 7 8 //variable// 9 int q[1010],n,m,vis[1010]; 10 11

5、6两月的总结

嗯这两个月收获还是挺大的,学了两块比较大的知识点. 一是网络流,二是状压DP.本来是要准备学插头DP的,但学长们普遍说是毒瘤,就先放一下. 至于小知识点,学了一下位运算以及离散化,收获还是蛮大的(没想到离散化竟然是有理有据的sort...). 6月的时候花了一个多星期搞了一下老师在vjudge上面弄的一个DP专练,全是比较偏的DP题,收获还是蛮大的.嗯我的DP姿势水平还有待提高 7月还是继续搞知识点吧= =这个月就全部学树了,8月学一下数位DP和概率DP,然后争取把去年NOIP的解题报告写出来

NOIp 2013 Day2 解题报告

NOIp 2013 Day2 解题报告 1.   积木大赛 每次只要选取连续最大的一段区间即可. 继续归纳可得,答案为∑i=1nmax{0,hi-hi-1} 复杂度O(N) 1 #include<iostream> 2 #include<cstdio> 3 #include<cstring> 4 #include<cmath> 5 #include<algorithm> 6 using namespace std; 7 8 //variable/