NOIP2016 DAY2

来源:互联网 发布:语音识别 算法 编辑:程序博客网 时间:2024/05/23 17:43

T1:

可以预处理啊

开始以为20倍常数要gg结果ccf的机子没想象中那么233

#include <cstdio>#include <cstring>#include <iostream>#include <algorithm>#define rep(j,k,l) for (int j=k;j<=l;j++)#define N 2005using namespace std;int cl[N][25],sm[N][N],T,k;int gt(int k,int l){int ans=0;while (k/l){ans+=k/l;k/=l;}return ans;}int main(){scanf("%d%d",&T,&k);rep(i,1,2001){ //处理i!中各种质因子个数cl[i][2]=gt(i,2);cl[i][3]=gt(i,3);cl[i][5]=gt(i,5);cl[i][7]=gt(i,7);cl[i][11]=gt(i,11);cl[i][13]=gt(i,13);cl[i][17]=gt(i,17);cl[i][19]=gt(i,19);}rep(i,1,2001) rep(j,1,i){ //处理出c(i,j)是否合法 //if提到外面快10倍if (k==2||k==3||k==5||k==7||k==11||k==13||k==17||k==19){if (cl[i][k]-cl[i-j][k]-cl[j][k]>=1) sm[i][j]=1;else sm[i][j]=0;}else if (k==4){if (cl[i][2]-cl[i-j][2]-cl[j][2]>=2) sm[i][j]=1;else sm[i][j]=0;}else if (k==6){if (cl[i][2]-cl[i-j][2]-cl[j][2]>=1&&cl[i][3]-cl[i-j][3]-cl[j][3]>=1) sm[i][j]=1;else sm[i][j]=0;}else if (k==8){if (cl[i][2]-cl[i-j][2]-cl[j][2]>=3) sm[i][j]=1;else sm[i][j]=0;}else if (k==9){if (cl[i][3]-cl[i-j][3]-cl[j][3]>=2) sm[i][j]=1;else sm[i][j]=0;}else if (k==10){if (cl[i][2]-cl[i-j][2]-cl[j][2]>=1&&cl[i][5]-cl[i-j][5]-cl[j][5]>=1) sm[i][j]=1;else sm[i][j]=0;}else if (k==12){if (cl[i][2]-cl[i-j][2]-cl[j][2]>=2&&cl[i][3]-cl[i-j][3]-cl[j][3]>=1) sm[i][j]=1;else sm[i][j]=0;}else if (k==14){if (cl[i][2]-cl[i-j][2]-cl[j][2]>=1&&cl[i][7]-cl[i-j][7]-cl[j][7]>=1) sm[i][j]=1;else sm[i][j]=0;}else if (k==15){if (cl[i][3]-cl[i-j][3]-cl[j][3]>=1&&cl[i][5]-cl[i-j][5]-cl[j][5]>=1) sm[i][j]=1;else sm[i][j]=0;}else if (k==16){if (cl[i][2]-cl[i-j][2]-cl[j][2]>=4) sm[i][j]=1;else sm[i][j]=0;}else if (k==18){if (cl[i][2]-cl[i-j][2]-cl[j][2]>=1&&cl[i][3]-cl[i-j][3]-cl[j][3]>=2) sm[i][j]=1;else sm[i][j]=0;}else if (k==20){if (cl[i][2]-cl[i-j][2]-cl[j][2]>=2&&cl[i][5]-cl[i-j][5]-cl[j][5]>=1) sm[i][j]=1;else sm[i][j]=0;}else if (k==21){if (cl[i][3]-cl[i-j][3]-cl[j][3]>=1&&cl[i][7]-cl[i-j][7]-cl[j][7]>=1) sm[i][j]=1;else sm[i][j]=0;}}rep(i,1,2001) rep(j,1,2001) //二维前辍和sm[i][j]=sm[i][j]+sm[i-1][j]+sm[i][j-1]-sm[i-1][j-1];while (T--){int k,l;scanf("%d%d",&k,&l);printf("%d\n",sm[k][l]);}}


T2:

参考http://blog.csdn.net/neither_nor/article/details/53300255

我只说一句:奇妙的大自然!

感性理解:先切的长长之后比(对应的)后切的长=开三个队列保存即可

常数较大脑子较抽

#include <bits/stdc++.h>#define N 100005#define M 7000005#define rep(j,k,l) for (int j=k;j<=l;j++)using namespace std;int n,m,q,u,v,T,hd1,hd2,hd3,tl1,tl2,tl3;int a[N],b[M],c[M]; //最初蚯蚓=切掉的前半段=切掉的后半段bool cmp(const int &x,const int &y){return x>y;}int main(){scanf("%d%d%d%d%d%d",&n,&m,&q,&u,&v,&T);double cl=u*1.0/v;rep(i,1,n) scanf("%d",&a[i]);sort(a+1,a+n+1,cmp);rep(i,1,n) a[i]+=q*m;hd1=1;hd2=1;hd3=1;tl1=n;tl2=0;tl3=0;rep(pi,0,m-1){int mx=0;if (hd1<=tl1) mx=max(mx,a[hd1]);if (hd2<=tl2) mx=max(mx,b[hd2]);if (hd3<=tl3) mx=max(mx,c[hd3]);if (hd1<=tl1&&mx==a[hd1]) hd1++;else if (hd2<=tl2&&mx==b[hd2]) hd2++;else if (hd3<=tl3&&mx==c[hd3]) hd3++;mx-=(m-pi)*q;b[++tl2]=(int)mx*cl+(m-pi-1)*q;c[++tl3]=2*(m-pi-1)*q+mx-b[tl2];if ((pi+1)%T==0){if (pi+1!=T) printf(" ");printf("%d",mx);}}printf("\n");rep(i,1,n+m){int mx=0;if (hd1<=tl1) mx=max(mx,a[hd1]);if (hd2<=tl2) mx=max(mx,b[hd2]);if (hd3<=tl3) mx=max(mx,c[hd3]);if (hd1<=tl1&&mx==a[hd1]) hd1++;else if (hd2<=tl2&&mx==b[hd2]) hd2++;else if (hd3<=tl3&&mx==c[hd3]) hd3++;if (i%T==0){if (i!=T) printf(" ");printf("%d",mx);}}}

T3:

听说搜索可A?

然后写了半天dfs才发现要写bfs(代码不贴


另一种奇技淫巧:

将点打乱=然后乱搞(不一定要弄出正解的乱搞)=取min

重复上一行字23333遍即可

#include <bits/stdc++.h>#define rep(j,k,l) for (int j=k;j<=l;++j)#define N 20#define eps 0.000001using namespace std;double a[N],b[N],c[N][N],d[N][N];int used[N],nm[N],T,TT,n,ans,kkk[N][N];void wk(){rep(i,1,n) used[i]=0;int tot=0;rep(i,1,n) if (used[i]==0){used[i]=1;rep(j,i+1,n) if (kkk[nm[i]][nm[j]]){used[j]=1;double kk=c[nm[i]][nm[j]];double ll=d[nm[i]][nm[j]];rep(k,j+1,n) if (kk*a[nm[k]]*a[nm[k]]+ll*a[nm[k]]>b[nm[k]]-eps&&kk*a[nm[k]]*a[nm[k]]+ll*a[nm[k]]<b[nm[k]]+eps) used[k]=1;break;}tot++;}ans=min(ans,tot);}int main(){scanf("%d",&TT);for (T=1;T<=TT;T++){scanf("%d%*d",&n);srand(n*2333+T*233+TT*23333);rep(i,1,n) scanf("%lf%lf",&a[i],&b[i]),nm[i]=i;rep(i,1,n) rep(k,1,n) if (i!=k&&a[k]!=a[i]&&(b[i]*a[k]-b[k]*a[i])/(a[i]*a[k]*(a[i]-a[k]))<0){
kkk[k][i]=kkk[i][k]=1;c[k][i]=c[i][k]=(b[i]*a[k]-b[k]*a[i])/(a[i]*a[k]*(a[i]-a[k]));           //抛物线的ad[k][i]=d[i][k]=(b[i]*a[k]*a[k]-b[k]*a[i]*a[i])/(a[i]*a[k]*(a[k]-a[i])); //抛物线的b}else kkk[k][i]=kkk[i][k]=0; //能否组成合法抛物线ans=n;rep(PI,1,23333){rep(i,1,n){ //打乱int poi=rand()%n+1;swap(nm[i],nm[poi]);}wk();}printf("%d\n",ans);}}



0 0
原创粉丝点击