ZOJ Problem Set - 3905 Cake
#include <iostream> #include <cstdio> #include <cstring> #include <cmath> #include <algorithm> #include <vector> #include <map> #include <stack> #include <queue> #include <set> #define LL long long #define INF 1e9 #define EPS 1e-9 using namespace std; const int maxn=8*123; int dp[maxn][maxn]; int n; struct he { int id, x,y; } Sky[maxn]; bool cmp(he a,he b) { return a.y>b.y; } void init() { scanf("%d",&n); memset(dp,0,sizeof(dp)); for(int i=1; i<=n; i++) { scanf("%d%d",&Sky[i].x,&Sky[i].y); Sky[i].id=i; } sort(Sky+1,Sky+1+n,cmp); } void play() { dp[1][0]=0; for(int i=2; i<=n; i++) { int x=Sky[i].x; int y=Sky[i].y; for(int j=1; j<i; j++) { int le=j; int ri=i-j-1; if(le<ri)continue; dp[le+1][ri]=dp[le][ri]; } for(int j=1; j<i; j++) { int le=j; int ri=i-j-1; if(le<=ri)continue; dp[le][ri+1]=max(dp[le][ri]+x,dp[le][ri+1]); } } printf("%d\n",dp[n/2][n/2]); } int T; int main() { scanf("%d",&T); while(T--) { init(); play(); } // cout << "Hello world!" << endl; return 0; }
ZOJ Problem Set - 3911 Prime Query
#include <iostream> #include <cstdio> #include <cstring> #include <cmath> #include <algorithm> #include <vector> #include <map> #include <stack> #include <queue> #include <set> #define LL long long #define INF 1e9 #define EPS 1e-9 using namespace std; const int maxn=12345678; bool notPrime[maxn]; int ai[123456]; struct he { int l,r,lazy,ans; } Sky[123456*4]; void BuildTree(int l,int r,int now) { Sky[now].l=l; Sky[now].r=r; Sky[now].lazy=0; Sky[now].ans=0; if(l==r) { Sky[now].lazy=ai[l]; if(!notPrime[Sky[now].lazy])Sky[now].ans=1; else Sky[now].ans=0; return; } int mid=(l+r)>>1; BuildTree(l,mid,now<<1); BuildTree(mid+1,r,now<<1|1); Sky[now].ans=Sky[now<<1].ans+Sky[now<<1|1].ans; } void PushDown(int x) { if(Sky[x].lazy==0)return; int ls=x<<1; int rs=x<<1|1; if(!notPrime[Sky[x].lazy]) { Sky[ls].ans=Sky[ls].r-Sky[ls].l+1; Sky[rs].ans=Sky[rs].r-Sky[rs].l+1; } else { Sky[ls].ans=0; Sky[rs].ans=0; } Sky[ls].lazy=Sky[x].lazy; Sky[rs].lazy=Sky[x].lazy; Sky[x].lazy=0; }//单点 void Update1(int id,int v,int now) { if(Sky[now].l==id&&Sky[now].r==id) { Sky[now].lazy+=v; if(!notPrime[Sky[now].lazy])Sky[now].ans=1; else Sky[now].ans=0; return; } PushDown(now); int mid=(Sky[now].l+Sky[now].r)>>1; if(id<=mid) { Update1(id,v,now<<1); } else { Update1(id,v,now<<1|1); } Sky[now].ans=Sky[now<<1].ans+Sky[now<<1|1].ans; } //区间 void Update2(int l,int r,int now,int v) { if(Sky[now].l==l&&Sky[now].r==r) { Sky[now].lazy=v; if(!notPrime[v]) { Sky[now].ans=r-l+1; } else { Sky[now].ans=0; } return; } PushDown(now); int mid=(Sky[now].l+Sky[now].r)>>1; if(r<=mid) { Update2(l,r,now<<1,v); } else if(l>mid) { Update2(l,r,now<<1|1,v); } else { Update2(l,mid,now<<1,v); Update2(mid+1,r,now<<1|1,v); } Sky[now].ans=Sky[now<<1].ans+Sky[now<<1|1].ans; } int Query(int l,int r,int now) { if(Sky[now].l==l&&Sky[now].r==r) { return Sky[now].ans; } PushDown(now); int mid=(Sky[now].l+Sky[now].r)>>1; int o1=0,o2=0; if(r<=mid) { o1=Query(l,r,now<<1); } else if(l>mid) { o2=Query(l,r,now<<1|1); } else { o1=Query(l,mid,now<<1); o2=Query(mid+1,r,now<<1|1); } return o1+o2; } int T,N,Q; char OP[10]; void init() { scanf("%d%d",&N,&Q); for(int i=1; i<=N; i++) { scanf("%d",&ai[i]); } BuildTree(1,N,1); } void play() { int l,r,v; while(Q--) { scanf("%s",OP+1); scanf("%d%d",&v,&l); if(OP[1]=='A') { Update1(l,v,1); } else if(OP[1]=='R') { scanf("%d",&r); Update2(l,r,1,v); } else { int ans=Query(v,l,1); printf("%d\n",ans); } } } int main() { memset(notPrime,0,sizeof(notPrime)); notPrime[1]=1; for(int i = 2; i*i <= maxn; i++) { if(!notPrime[i]) { for(int j = i*i; j <= maxn; j += i) { notPrime[j] = true; } } } scanf("%d",&T); while(T--) { init(); play(); } // cout << "Hello world!" << endl; return 0; }
The End ==The Start
退役啦~ 还是回来好好做题了。即使到最后一无所有。我至少没放弃我曾经想要的生活。 Update 2015-10-24
ZOJ Problem Set - 3497 Mistwald
/* Author:Chieh Because Of Coding */ #include <iostream> #include <cstdio> #include <cstring> #include <cmath> #include <algorithm> #include <queue> #include <vector> #include <stack> #include <map> #include <set> #define LL long long #define INF 1e9 #define EPS 1e-9 using namespace std; struct matrix { int e[26][26]; }; matrix Cal(matrix p,matrix q,int len) { matrix c; for(int i=1; i<=len; i++) { for(int j=1; j<=len; j++) { c.e[i][j]=0; for(int k=1; k<=len; k++) { c.e[i][j]=c.e[i][j]+p.e[i][k]*q.e[k][j]; } c.e[i][j]=min(1,c.e[i][j]); } } return c; } int can[6][6]; int T; char ch[123]; int n,m; bool dist[30][30]; matrix s,a; void init() { memset(dist,0,sizeof(dist)); scanf("%d%d",&n,&m); for(int i=1; i<=n; i++) { for(int j=1; j<=m; j++) { scanf("%s",ch+1); int u=can[i][j]; int len=strlen(ch+1); int o1=-1,o2=-1; for(int k=1; k<=len; k++) { if(ch[k]>='1'&&ch[k]<='5') { if(o1==-1)o1=ch[k]-'0'; else { o2=ch[k]-'0'; int v=can[o1][o2]; dist[u][v]=1; o1=-1; o2=-1; } } } } } } void exp_pow(int b) { while(b) { if(b&1)s=Cal(s,a,25); a=Cal(a,a,25); b>>=1; } } int ai[30]; int bi[30]; void play() { int q,t; scanf("%d",&q); while(q--) { scanf("%d",&t); for(int i=1; i<=25; i++) { for(int j=1; j<=25; j++) { a.e[i][j]=0; if(i==j)s.e[i][j]=1; else s.e[i][j]=0; if(i==can[n][m])continue; if(dist[i][j]==1) { a.e[i][j]=1; } } } exp_pow(t); int sum=0; bool flag=0; for(int j=1; j<=25; j++) { int tm=0; for(int k=1; k<=25; k++) { tm=tm+ai[k]*s.e[k][j]; } tm=min(tm,1); if(tm)sum++; if(j==can[n][m]&&tm)flag=1; } if(flag&&sum>1)printf("Maybe\n"); else if(flag&&sum==1)printf("True\n"); else printf("False\n"); } } int main() { memset(ai,0,sizeof(ai)); ai[1]=1; int st=0; for(int i=1; i<=5; i++) { for(int j=1; j<=5; j++) { can[i][j]=++st; } } scanf("%d",&T); while(T--) { init(); play(); printf("\n"); } // cout << "Hello world!" << endl; return 0; }
ZOJ Problem Set - 3690 Choosing number
/* Author:Chieh Because Of Coding */ //dp[i]=dp[i-1]*m-s;s=dp[i-1]-s; #include <iostream> #include <cstdio> #include <cstring> #include <cmath> #include <algorithm> #include <queue> #include <vector> #include <stack> #include <map> #include <set> #define LL long long #define INF 1e9 #define EPS 1e-9 using namespace std; struct matrix { LL e[2][2]; }; matrix Cal(matrix p,matrix q,int len,int MOD) { matrix c; for(int i=0; i<len; i++) { for(int j=0; j<len; j++) { c.e[i][j]=0; for(int k=0; k<len; k++) { c.e[i][j]=(c.e[i][j]+((p.e[i][k]*q.e[k][j])%MOD))%MOD; } } } return c; } const int MOD=1000000007; int n,m,k; matrix a,s; void init() { for(int i=0; i<2; i++) { for(int j=0; j<2; j++) { if(i==j)s.e[i][j]=1; else s.e[i][j]=0; } } a.e[0][0]=m; a.e[0][1]=1; a.e[1][0]=-k; a.e[1][1]=-1; } void exp_pow(int b) { while(b) { if(b&1)s=Cal(s,a,2,MOD); a=Cal(a,a,2,MOD); b>>=1; } } void play() { exp_pow(n); LL ans=s.e[0][0]; while(ans<0)ans+=MOD; printf("%lld\n",ans); } int main() { while(scanf("%d%d%d",&n,&m,&k)!=EOF) { init(); play(); } // cout << "Hello world!" << endl; return 0; }
HDU 2604 Queuing
/* Author:Chieh Because Of Coding */ #include <iostream> #include <cstdio> #include <cstring> #include <cmath> #include <algorithm> #include <queue> #include <vector> #include <stack> #include <map> #include <set> #define LL long long #define INF 1e9 #define EPS 1e-9 using namespace std; const int maxn=1234567; int k,M; int m[maxn][2]; int f[maxn]; int C[71][31]; void init() { m[0][0]=C[0][M]; m[0][1]=C[0][M]; m[1][0]=C[1][M]; m[1][1]=C[0][M]; f[1]=C[1][M]; m[2][0]=C[1][M]; m[2][1]=C[1][M]; f[2]=C[2][M]; for(int i=3; i<=k; i++) { m[i][0]=C[m[i-1][0]+m[i-1][1]][M]; m[i][1]=f[i-1]; f[i]=m[i-2][1]; f[i]=C[f[i]+C[m[i-2][0]*2][M]][M]; } } void play() { printf("%d\n",(m[k][0]+m[k][1]+f[k])%M); } int main() { for(int i=0; i<=70; i++) { for(int j=1; j<=30; j++) { C[i][j]=i%j; } } while(scanf("%d%d",&k,&M)!=EOF) { init(); play(); } // cout << "Hello world!" << endl; return 0; } /* Author:Chieh Because Of Coding */ // dp[i]=dp[i-1]+dp[i-3]+dp[i-4] #include <iostream> #include <cstdio> #include <cstring> #include <cmath> #include <algorithm> #include <queue> #include <vector> #include <stack> #include <map> #include <set> #define LL long long #define INF 1e9 #define EPS 1e-9 using namespace std; struct matrix { int e[4][4]; }; matrix Cal(matrix p,matrix q,int len,int MOD) { matrix c; for(int i=0; i<len; i++) { for(int j=0; j<len; j++) { c.e[i][j]=0; for(int k=0; k<len; k++) { c.e[i][j]=(c.e[i][j]+(p.e[i][k]*q.e[k][j]%MOD))%MOD; } } } return c; } int M; int k; matrix s,a; void init() { for(int i=0;i<4;i++){ for(int j=0;j<4;j++){ if(i==j)s.e[i][j]=1; else s.e[i][j]=0; if(i!=1&&j==0)a.e[i][j]=1; else if(i+1==j)a.e[i][j]=1; else a.e[i][j]=0; } } } void exp_pow(int b) { while(b){ if(b&1)s=Cal(s,a,4,M); a=Cal(a,a,4,M); b>>=1; } } int ai[4]; void play() { if(k<=4)printf("%d\n",ai[k-1]%M); else{ k=k-4; exp_pow(k); int ans=0; for(int i=0;i<4;i++){ ans=(ans+((ai[3-i]*s.e[i][0])%M))%M; } printf("%d\n",ans); } } int main() { ai[0]=2; ai[1]=4; ai[2]=6; ai[3]=9; while(scanf("%d%d",&k,&M)!=EOF) { init(); play(); } // cout << "Hello world!" << endl; return 0; }
HDU 1757 A Simple Math Problem
/* Author:Chieh Because Of Coding */ #include <iostream> #include <cstdio> #include <cstring> #include <cmath> #include <algorithm> #include <queue> #include <vector> #include <stack> #include <map> #include <set> #define LL long long #define INF 1e9 #define EPS 1e-9 using namespace std; int k,m; int F[10]; int d; struct matrix { LL e[10][10]; }; void init() { d=9; for(int i=0; i<=9; i++) { scanf("%d",&F[i]); } } matrix mul(matrix p,matrix q) { LL i,j,k; matrix c; for(i=0; i<=d; i++) { for(j=0; j<=d; j++) { c.e[i][j]=0; for(k=0; k<=d; k++) c.e[i][j]=(c.e[i][j]+p.e[i][k]*q.e[k][j])%m; } } return c; } matrix s; matrix a; void matrix_pow(LL b) { while(b) { if(b&1)s=mul(s,a); a=mul(a,a); b=b>>1; } //a矩阵的b次 返回 s矩阵 } void play() { if(k<10)printf("%d\n",k); else { for(int i=0; i<=9; i++) { for(int j=0; j<=9; j++) { if(i==j) s.e[i][j]=1; else s.e[i][j]=0; } } // cout<<s.e[0][2]<<endl; for(int i=0; i<=9; i++) { for(int j=0; j<=9; j++) { if(j==0) { a.e[i][j]=F[i]; } else if(i+1==j) { a.e[i][j]=1; } else { a.e[i][j]=0; } } } /* for(int i=0; i<=9; i++) { for(int j=0; j<=9; j++) { cout<<a.e[i][j]<<" "; } cout<<endl; } cout<<"---------------------------"<<endl;*/ matrix_pow(k-9); /* for(int i=0; i<=9; i++) { for(int j=0; j<=9; j++) { cout<<s.e[i][j]<<" "; } cout<<endl; }*/ LL ans=0; int t=9; for(int i=0; i<=9; i++) { ans=(ans+(t*s.e[i][0])%m)%m; t--; } printf("%I64d\n",ans); } } int main() { while(scanf("%d%d",&k,&m)!=EOF) { init(); play(); } // cout << "Hello world!" << endl; return 0; }
ZOJ Problem Set - 2273 Number Sequence III
/* Author:Chieh Because Of Coding */ #include <iostream> #include <cstdio> #include <cstring> #include <cmath> #include <algorithm> #include <queue> #include <vector> #include <map> #include <stack> #include <set> #define LL long long #define INF 1e9 #define EPS 1e-9 using namespace std; int len[100000]; int Link[11]; int idx[11]; int Get(int x,int y) { while(1) { int ys=x%10; x/=10; y--; if(y==0)return ys; } } void init() { Link[1]=1; int p=2; for(int i=2; i<=10; i++) { Link[i]=Link[i-1]+p; p*=2; p*=2; } int st=1; int bef=0; for(int i=1; i<=99999; i++) { int t; if(i>=10000)t=5; else if(i>=1000)t=4; else if(i>=100)t=3; else if(i>=10)t=2; else t=1; int now=bef+t; if(st<=10&&now>=Link[st]) { int xi=Link[st]-bef; idx[st]=Get(i,t-xi+1); st++; } len[i]=idx[st-1]; bef=now; } } int n; void play() { printf("%d\n",len[n]); } int main() { init(); while(scanf("%d",&n)!=EOF){ play(); } // cout << "Hello world!" << endl; return 0; }
Codeforces R317 DIV1 B. Minimization
/* Author:Chieh Because Of Coding */ #include <iostream> #include <cstdio> #include <cstring> #include <cmath> #include <algorithm> #include <vector> #include <map> #include <stack> #include <queue> #include <set> #define LL long long #define INF 1e9 #define EPS 1e-9 using namespace std; const int maxn=3*123456; int ai[maxn]; int n,k; bool cmp(int a,int b) { return a>b; } void init() { for(int i=1; i<=n; i++)scanf("%d",&ai[i]); sort(ai+1,ai+1+n,cmp); } LL dp[5678][5678]; void play() { if(n%k==0) { LL sum=0; int p=n/k; for(int i=1; i<=n; i+=p) { sum+=ai[i]-ai[i+p-1]; } printf("%I64d\n",sum); } else { int ys=n%k; int s1=ys; int v1=n/k+1; int s2=k-ys; int v2=n/k; for(int i=0; i<=k; i++) { for(int j=0; j<=k; j++) { dp[i][j]=1000000000000000000LL; } } dp[0][0]=0; for(int i=0;i<=s1;i++){ for(int j=0;j<=s2;j++){ int a1=i; int a2=j; int st=i*v1+j*v2+1; if(a1<s1){ dp[a1+1][a2]=min(dp[a1+1][a2],dp[a1][a2]+ai[st]-ai[st+v1-1]); } if(a2<s2){ dp[a1][a2+1]=min(dp[a1][a2+1],dp[a1][a2]+ai[st]-ai[st+v2-1]); } } } printf("%I64d\n",dp[s1][s2]); } } int main() { while(scanf("%d%d",&n,&k)!=EOF) { init(); play(); } // cout << "Hello world!" << endl; return 0; }
ZOJ Problem Set - 3822 Domination
/* Author:Chieh Because Of Coding */ #include <iostream> #include <cstdio> #include <cmath> #include <cstring> #include <algorithm> #include <map> #include <stack> #include <queue> #include <vector> #define LL long long #define INF 1e9 #define EPS 1e-9 using namespace std; const int maxn=5*12; double ai[maxn*maxn][maxn][maxn]; int T,n,m; double ans; void init() { ans=0; scanf("%d%d",&n,&m); ai[0][0][0]=1; double p=n*m; for(int k=1; k<=n*m; k++) { for(int i=1; i<=n; i++) { for(int j=1; j<=m; j++) { ai[k][i][j]=0; ai[k][i][j]+=i*j*ai[k-1][i-1][j]/p; ai[k][i][j]+=j*i*ai[k-1][i][j-1]/p; ai[k][i][j]+=i*j*ai[k-1][i-1][j-1]/p; if((i!=n||j!=m)&&i*j>=k) { ai[k][i][j]+=ai[k-1][i][j]*(i*j-k+1)/p; } } } p--; } } void play() { double ans=0; for(int i=1; i<=n*m; i++) { ans+=ai[i][n][m]*i; } printf("%.10f\n",ans); } int main() { scanf("%d",&T); while(T--) { init(); play(); } return 0; }