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