【noip2012】d1解题报告
本来是想noip前把往年真题全做完的,总有这么几道不好做,这是出发前写的,如有不周请多包涵……
NOIP2017 rp++!
t1: Vigenère 密码
纯模拟
#include<iostream> #include<cstring> #include<cstdio> using namespace std; char a[110],b[1010],c[1010]; int lena,lenb,jian[110]; int main() { scanf("%s",a+1),scanf("%s",b+1); lena=strlen(a+1),lenb=strlen(b+1); for(int i=1;i<=lena;i++) { if(a[i]>='A'&&a[i]<='Z') jian[i]=a[i]-'A'; else if(a[i]>='a'&&a[i]<='z') jian[i]=a[i]-'a'; } int x=0; for(int i=1;i<=lenb;i++) { x=(i-1)%lena+1; c[i]=(b[i]-jian[x]); if(b[i]>='A'&&b[i]<='Z'&&(c[i]<'A'||c[i]>'Z')) c[i]+=26; if(b[i]>='a'&&b[i]<='z'&&(c[i]<'a'||c[i]>'z')) c[i]+=26; cout<<c[i]; } }
t2:国王游戏
贪心证明见:http://www.cnblogs.com/Loi-dfkdsmbd/p/7770543.html
这次是打的高精版2333333
#include<algorithm> #include<iostream> #include<cstring> #include<cstdio> #include<cmath> using namespace std; typedef long long lo; struct in { lo a,b,c; }ter[1010]; lo n,l[20020],ans[20020],lin[20020]; bool cmp(in a,in b) { return a.c<b.c; } inline void re(lo &a) { a=0; char b=getchar(); while(b<'0'||b>'9') b=getchar(); while(b>='0'&&b<='9') a=a*10+b-'0',b=getchar(); } inline void cheng(lo x) { for(int i=1;i<=l[0];i++) l[i]*=x; for(int i=1;i<=l[0]+4;i++) { l[i+1]+=l[i]/10; l[i]%=10; if(l[i]) l[0]=max(l[0],(lo)i); } } inline void chu(lo x) { memset(lin,0,sizeof(lin)); lo qwq=0; for(int i=l[0];i>=1;i--) { qwq=qwq*10+l[i]; lin[i]=qwq/x; if(lin[i]) lin[0]=max(lin[0],(lo)i); qwq%=x; } } bool check() { if(ans[0]>lin[0]) return 0; else if(ans[0]<lin[0]) return 1; else { for(int i=lin[0];i>=1;i--) { if(lin[i]>ans[i]) return 1; if(lin[i]<ans[i]) return 0; } } } inline void fu() { ans[0]=lin[0]; for(int i=lin[0];i>=1;i--) ans[i]=lin[i]; } int main() { re(n); for(int i=0;i<=n;i++) re(ter[i].a),re(ter[i].b),ter[i].c=ter[i].a*ter[i].b; sort(ter+1,ter+1+n,cmp); l[0]=l[1]=1; for(int i=1;i<=n;i++) { cheng(ter[i-1].a); chu(ter[i].b); if(check()) fu(); for(int i=ans[0];i>=1;i--) cout<<ans[i]; }
t3:开车旅行
dalao一眼平衡树,我看过题解后打了个倍增
#include<algorithm> #include<iostream> #include<cstring> #include<cstdio> #include<cmath> using namespace std; typedef long long lo; int n,m; struct in { lo g; int l,r,y; bool operator <(const in &a)const { return g<a.g; } }ter[100010]; lo qwq,xa,ya; double mi=1000000007; int ax[100010],bx[100010],p[100010],x,l,r,ans; lo f[100010][20],va[100010][20],vb[100010][20]; inline bool check() { if(!l) return 0; if(!r) return 1; return ter[x].g-ter[l].g<=ter[r].g-ter[x].g; } inline int pd(int a,int b) { if(!a) return ter[b].y; if(!b) return ter[a].y; if(ter[x].g-ter[a].g<=ter[b].g-ter[x].g) return ter[a].y; return ter[b].y; } inline void make_st() { for(int i=1;i<=log2(n);i++) for(int j=1;j<=n;j++) { f[j][i]=f[f[j][i-1]][i-1]; va[j][i]=va[j][i-1]+va[f[j][i-1]][i-1]; vb[j][i]=vb[j][i-1]+vb[f[j][i-1]][i-1]; } } inline void ask(lo yong,int a) { xa=ya=0; for(int i=log2(n);i>=0;i--) { if(f[a][i]&&xa+ya+va[a][i]+vb[a][i]<=yong) xa+=va[a][i],ya+=vb[a][i],a=f[a][i]; } if(ax[a]&&xa+ya+va[a][0]<=yong) xa+=va[a][0]; } int main() { scanf("%d",&n); for(int i=1;i<=n;i++) scanf("%lld",&ter[i].g),ter[i].y=i; sort(ter+1,ter+1+n); for(int i=1;i<=n;i++) p[ter[i].y]=i; for(int i=1;i<=n;i++) ter[i].l=i-1,ter[i].r=i+1; ter[1].l=ter[n].r=0; for(int i=1;i<=n;i++) { x=p[i],l=ter[x].l,r=ter[x].r; if(check()) bx[i]=ter[l].y,ax[i]=pd(ter[l].l,r); else bx[i]=ter[r].y,ax[i]=pd(l,ter[r].r); if(l) ter[l].r=r; if(r) ter[r].l=l; } for(int i=1;i<=n;i++) { f[i][0]=bx[ax[i]]; va[i][0]=abs(ter[p[i]].g-ter[p[ax[i]]].g); vb[i][0]=abs(ter[p[ax[i]]].g-ter[p[f[i][0]]].g); } make_st(); scanf("%lld",&qwq); for(int i=1;i<=n;i++) { ask(qwq,i); if(ya&&xa*1.0/ya<mi) mi=xa*1.0/ya,ans=i; } cout<<ans<<'\n'; scanf("%d",&m); for(int i=1;i<=m;i++) { scanf("%d%lld",&l,&qwq); ask(qwq,l); cout<<xa<<' '<<ya<<'\n'; } }