题目地址:http://acm.upc.edu.cn/problemset.php?page=13  2217~2226

A.Rescue The Princess

一个等边三角形告诉前2个点,求逆时针序的第三个点坐标。

简单几何,其实做法有很多,好像大多数都是带直线方程然后判断方向做的。我觉得直接将A放在原点,让B绕A逆时针旋转60度,最后加上A的偏移更简单。旋转直接用方向向量乘旋转矩阵就好。

 #include <map>
 #include <set>
 #include <list>
 #include <queue>
 #include <stack>
 #include <cmath>
 #include <ctime>
 #include <vector>
 #include <bitset>
 #include <cstdio>
 #include <string>
 #include <numeric>
 #include <cstring>
 #include <cstdlib>
 #include <iostream>
 #include <algorithm>
 #include <functional>
 using namespace std;
 typedef long long  ll;
 typedef unsigned long long ull;

 ]={-,,,};
 ]={,,-,};//up down left right
 ||x>n||y<||y>m)return false;return true;}
 )*m+y;}

 #define eps 1e-8
 #define inf 0x7fffffff
 #define debug puts("BUG")
 #define lson l,m,rt<<1
 #define rson m+1,r,rt<<1|1
 #define root 1,n,1
 #define read freopen("in.txt","r",stdin)
 #define write freopen("out.txt","w",stdout)
 #define maxn 2005
 #define maxe 10005
 const double sqt3=sqrt(3.0);
 ][],m3[][];
 ][]={{},{-sqt3/,0.5}};
 void gao()
 {
     memset(m3,,sizeof(m3));
     ;k<;++k)
         ;j<;++j)
             m3[][j]+=m1[][k]*m2[k][j];
 }
 int main()
 {
     read;
     int cas;
     scanf("%d",&cas);
     while(cas--)
     {
         double x1,x2,y1,y2;
         scanf("%lf%lf%lf%lf",&x1,&y1,&x2,&y2);
         m1[][]=x2-x1;
         m1[][]=y2-y1;
         gao();
         printf(][]+x1,m3[][]+y1);
     }
     ;
 }

B.Thrall’s Dream

题干冗长,实际上就是在一个1000个点,10000条有向边的图上判断是否存在两个点A,B不可达,不可达定义为从A不能走到B且B不能走到A,A,B不能都动。

据说可以1000个点都暴力BFS过掉O(n*m)。此题可以先tarjan缩点,然后判断缩点后的图是否是一条链即可。链的充要条件应该不止一个,比较好想的是只有1个入度为0出度为1的点,只有1个入度为1出度为0的点,剩下的全是出度和入度均为1的点,平凡图特判。做的时候没考虑重边,WA了4次,还好赛场上不是我写这道题。

 #include <map>
 #include <set>
 #include <list>
 #include <queue>
 #include <stack>
 #include <cmath>
 #include <ctime>
 #include <vector>
 #include <bitset>
 #include <cstdio>
 #include <string>
 #include <numeric>
 #include <cstring>
 #include <cstdlib>
 #include <iostream>
 #include <algorithm>
 #include <functional>
 using namespace std;
 typedef long long  ll;
 typedef unsigned long long ull;

 ]={-,,,};
 ]={,,-,};//up down left right
 ||x>n||y<||y>m)return false;return true;}
 )*m+y;}

 #define eps 1e-8
 #define inf 0x7fffffff
 #define debug puts("BUG")
 #define lson l,m,rt<<1
 #define rson m+1,r,rt<<1|1
 #define root 1,n,1
 #define read freopen("in.txt","r",stdin)
 #define write freopen("out.txt","w",stdout)
 #define maxn 2005
 #define maxe 10005

 struct str
 {
     int u,v,n;
 }edge[maxe];
 int head[maxn],cnt;
 int dfn[maxn],low[maxn];
 bool ins[maxn];
 int incom[maxn];
 int dep,comn;
 stack<int>st;
 void init()
 {
     memset(dfn,,sizeof(dfn));
     memset(ins,,sizeof(ins));
     memset(head,-,sizeof(head));
     dep=comn=cnt=;
 }
 void addEdge(int u,int v)
 {
     edge[cnt].u=u;
     edge[cnt].v=v;
     edge[cnt].n=head[u];
     head[u]=cnt++;
 }
 void tarjan(int u)
 {
     dfn[u]=low[u]=++dep;
     ins[u]=true;
     st.push(u);
     for(int i=head[u];~i;i=edge[i].n)
     {
         int v=edge[i].v;
         if(!dfn[v])
         {
             tarjan(v);
             if(low[v]<low[u])
                 low[u]=low[v];
         }
         else if(ins[v]&&dfn[v]<low[u])
             low[u]=dfn[v];
     }
     if(dfn[u]==low[u])
     {
         int v;
         ++comn;
         do
         {
             v=st.top();
             st.pop();
             ins[v]=false;
             incom[v]=comn;
         }while(v!=u);
     }
 }
 ];
 bool gao()
 {
     )return true;
     memset(du,,sizeof(du));
     ;i<cnt;++i)
     {
         int u=incom[edge[i].u],v=incom[edge[i].v];
         if(u==v)continue;
         ++du[u][];
         ++du[v][];
     }
     int c1,c2,c3;
     c1=c2=c3=;
     ;i<=comn;++i)
     {
         ]==&&du[i][]==)++c1;
         ]==&&du[i][]==)++c2;
         ]==&&du[i][]==)++c3;
     }
     &&c2==&&c3==(comn-));
 }
 bool vis[maxn][maxn];
 int main()
 {
     //read;
     int cas;
     scanf("%d",&cas);
     ;xx<=cas;++xx)
     {
         int n,m;
         scanf("%d%d",&n,&m);
         init();
         int u,v;
         memset(vis,,sizeof(vis));
         ;i<m;++i)
         {
             scanf("%d%d",&u,&v);
             vis[u][v]=true;
         }
         ;i<=n;++i)
             ;j<=n;++j)
                 if(vis[i][j])addEdge(i,j);
         ;i<=n;++i)
             if(!dfn[i])tarjan(i);
         bool ff=gao();
         printf("Case %d: ",xx);
         if(!ff)puts("The Burning Shadow consume us all");
         else puts("Kalimdor is just ahead");
     }
     ;
 }

C.A^X mod P

f(x) = K, x = 1 . f(x) = (a*f(x-1) + b)%m , x > 1 . 求( A^(f(1)) + A^(f(2)) + A^(f(3)) + ...... + A^(f(n)) ) modular P (n<10^6,其余<10^9  )

总感觉可以无脑快速幂搞过的样子,赛场上没几个出的,就想肯定不可能了。其实这题只需要预处理下所有A^(1,10^9)就行,可是10^9空间和时间上都不允许。于是我们找一个k,让所有x=k*i+j,所以先求出A^k,那么A^x==(A^k)^i * A^j。感觉不是很难,还在自己太弱了。

 #include <map>
 #include <set>
 #include <list>
 #include <queue>
 #include <stack>
 #include <cmath>
 #include <ctime>
 #include <vector>
 #include <bitset>
 #include <cstdio>
 #include <string>
 #include <numeric>
 #include <cstring>
 #include <cstdlib>
 #include <iostream>
 #include <algorithm>
 #include <functional>
 using namespace std;
 typedef long long  ll;
 typedef unsigned long long ull;

 ]={-,,,};
 ]={,,-,};//up down left right
 ||x>n||y<||y>m)return false;return true;}
 )*m+y;}

 #define eps 1e-8
 #define inf 0x7fffffff
 #define debug puts("BUG")
 #define lson l,m,rt<<1
 #define rson m+1,r,rt<<1|1
 #define root 1,n,1
 #define read freopen("in.txt","r",stdin)
 #define write freopen("out.txt","w",stdout)
 #define maxn 50005
 #define maxm 100005
 ll p1[maxm+],p2[maxm+];
 ll n, A, K, a, b, m, P;
 void init()
 {
     p1[]=p2[]=1LL;
     ;i<=maxm;++i)
         p1[i]=(A*p1[i-])%P;
     ;i<=maxm;++i)
         p2[i]=(p2[i-]*p1[maxm])%P;
 }
 ll gao()
 {
     ll t=K,ans=;
     ;i<=n;++i)
     {
         ans=(ans+p2[t/maxm]*p1[t%maxm])%P;
         t=(a*t+b)%m;
     }
     return ans;
 }
 int main()
 {
     //read;
     int cas;
     scanf("%d",&cas);
     ;xx<=cas;++xx)
     {
         scanf("%lld%lld%lld%lld%lld%lld%lld",&n,&A,&K,&a,&b,&m,&P);
         init();
         printf("Case #%d: %lld\n",xx,gao());
     }
     ;
 }

D.Rubik’s cube

给一个乱的2色4格魔方,求拧成每面同色的最小步数。

其实转的方法一共12种,前后 上下 左右 各四种(上面2个格子2个方向 下面2个格子2个方向),由于转上面2个格子等于反向转下面的格子,所以实际上只有6种。求最少步数,暴力BFS可过,中间需要记录某个状态是否拧出来过。唯一蛋疼的地方是每个面的1234顺序不完全对应。找准转的时候是哪些面的哪个格子转动到的目标面和目标格子就好。这类题,我一直不知道怎么写简单,完全暴力模拟,代码巨丑 300+,这里不贴了。可以参见这份报告:http://blog.csdn.net/binwin20/article/details/9073941  瞬间感觉被爆了。

E.Mountain Subsequences

给出一个10^5长的字符串,字母的ASCII码做权值,问有多少个长度大于3,形如: a1 < ...< ai < ai+1 < Amax > aj > aj+1 > ... > an的序列。

赛场上真是跪给这个题了,想到了正确思路,先WA后T,回来写就AC了。DP[i][j]表示前i个字符,以j为结尾的上升序列个数,正着和反着都做一遍,然后枚举中点,两边一组合就行了。复杂度O(n*26)。其实可以降到1维,顺序扫i的时候只需要查询前面val小于val[i]的个数就可以了,然后再更新。这样写起来就很像线段树了。

dp:

 #include <map>
 #include <set>
 #include <list>
 #include <queue>
 #include <stack>
 #include <cmath>
 #include <ctime>
 #include <vector>
 #include <bitset>
 #include <cstdio>
 #include <string>
 #include <numeric>
 #include <cstring>
 #include <cstdlib>
 #include <iostream>
 #include <algorithm>
 #include <functional>
 using namespace std;
 typedef long long  ll;
 typedef unsigned long long ull;

 ]={-,,,};
 ]={,,-,};//up down left right
 ||x>n||y<||y>m)return false;return true;}
 )*m+y;}

 #define eps 1e-8
 #define inf 0x7fffffff
 #define debug puts("BUG")
 #define lson l,m,rt<<1
 #define rson m+1,r,rt<<1|1
 #define read freopen("in.txt","r",stdin)
 #define write freopen("out.txt","w",stdout)
 #define maxn 100005
 #define MOD 2012
 char ss[maxn];
 ],dp2[maxn][];
 //dp[i][j]代表前i个单词权值小于等于j的上升序列方案数,dp2同理,只不过是反过来。
 int main()
 {
     //read;
     int n;
     while(~scanf("%d",&n))
     {
         scanf("%s",ss);
         memset(dp,,sizeof(dp));
         memset(dp2,,sizeof(dp2));
         ;i<=n;++i)
         {
             ]-;
             dp[i][t]=;
             ;j<t;++j)
                 dp[i][t]=(dp[i][t]+dp[i-][j])%MOD;
             ;j<=;++j)
                 dp[i][j]=(dp[i][j]+dp[i-][j])%MOD;
         }
         ;i<=n;++i)
             ;j<=;++j)
                 dp[i][j]=(dp[i][j]+dp[i][j-])%MOD;

         ;--i)
         {
             ]-;
             dp2[i][t]=;
             ;j<t;++j)
                 dp2[i][t]=(dp2[i][t]+dp2[i+][j])%MOD;
             ;j<=;++j)
                 dp2[i][j]=(dp2[i][j]+dp2[i+][j])%MOD;
         }
         ;i<=n;++i)
             ;j<=;++j)
                 dp2[i][j]=(dp2[i][j]+dp2[i][j-])%MOD;
         ;
         ;i<n;++i)
         {
             ]-;
             ans=(ans+dp[i-][t-]*dp2[i+][t-])%MOD;
         }
         printf("%d\n",ans);
     }
     ;
 }

seg:

 #include <map>
 #include <set>
 #include <list>
 #include <queue>
 #include <stack>
 #include <cmath>
 #include <ctime>
 #include <vector>
 #include <bitset>
 #include <cstdio>
 #include <string>
 #include <numeric>
 #include <cstring>
 #include <cstdlib>
 #include <iostream>
 #include <algorithm>
 #include <functional>
 using namespace std;
 typedef long long  ll;
 typedef unsigned long long ull;

 ]={-,,,};
 ]={,,-,};//up down left right
 ||x>n||y<||y>m)return false;return true;}
 )*m+y;}

 #define eps 1e-8
 #define inf 0x7fffffff
 #define debug puts("BUG")
 #define lson l,m,rt<<1
 #define rson m+1,r,rt<<1|1
 #define root 1,26,1
 #define read freopen("in.txt","r",stdin)
 #define write freopen("out.txt","w",stdout)
 #define maxn 100005
 #define maxm 30
 #define MOD 2012
 ];
 void pushup(int rt)
 {
     sum[rt]=(sum[rt<<]+sum[rt<<|])%MOD;
     return ;
 }
 void build(int l,int r,int rt)
 {
     if(l==r)
     {
         sum[rt]=;
         return ;
     }
     ;
     build(lson);
     build(rson);
     pushup(rt);
 }
 void update(int p,int v,int l,int r,int rt)
 {
     if(l==r)
     {
         sum[rt]=(sum[rt]+v)%MOD;
         return ;
     }
     ;
     if(p<=m)update(p,v,lson);
     else update(p,v,rson);
     pushup(rt);
 }
 int query(int l1,int r1,int l,int r,int rt)
 {
     if(l1<=l&&r1>=r)
         return sum[rt];
     ,ans=;
     if(l1<=m)ans=(ans+query(l1,r1,lson))%MOD;
     if(r1>m)ans=(ans+query(l1,r1,rson))%MOD;
     return ans;
 }
 char ss[maxn];
 ];
 int main()
 {
     //read;
     int n;
     while(~scanf("%d",&n))
     {
         scanf();
         memset(tot,,sizeof(tot));
         build(root);
         ;i<=n;++i)
         {
             ,t;
             )t=;
             ,p-,root)+;
             update(p,t,root);
             tot[i][]=(t-+MOD)%MOD;
         }
         build(root);
         ;--i)
         {
             ,t;
             )t=;
             ,p-,root)+;
             update(p,t,root);
             tot[i][]=(t-+MOD)%MOD;
         }
         ;
         ;i<n;++i)
             ans=(ans+tot[i][]*tot[i][])%MOD;
         printf("%d\n",ans);
     }
     ;
 }

F.Alice and Bob

一个多项式:(a0*x^(2^0)+1) * (a1 * x^(2^1)+1)*.......*(an-1 * x^(2^(n-1))+1)  ,给出p,求x^p的系数 (n<50  0 <=P <=1234567898765432)

其实就是把P二进制展开,然后对应位为1的a乘起来就OK。

 #include <map>
 #include <set>
 #include <list>
 #include <queue>
 #include <stack>
 #include <cmath>
 #include <ctime>
 #include <vector>
 #include <bitset>
 #include <cstdio>
 #include <string>
 #include <numeric>
 #include <cstring>
 #include <cstdlib>
 #include <iostream>
 #include <algorithm>
 #include <functional>
 using namespace std;
 typedef long long  ll;
 typedef unsigned long long ull;

 ]={-,,,};
 ]={,,-,};//up down left right
 ||x>n||y<||y>m)return false;return true;}
 )*m+y;}

 #define eps 1e-8
 #define inf 0x7fffffff
 #define debug puts("BUG")
 #define lson l,m,rt<<1
 #define rson m+1,r,rt<<1|1
 #define root 1,26,1
 #define read freopen("in.txt","r",stdin)
 #define write freopen("out.txt","w",stdout)
 #define maxn 105
 #define MOD 2012
 int a[maxn];
 int gao(ll p)
 {
     ;
     ;p;++i,p>>=)
         )ans=(ans*a[i])%MOD;
     return ans;
 }
 int main()
 {
     //read;
     int cas;
     scanf("%d",&cas);
     while(cas--)
     {
         int n,m;
         scanf("%d",&n);
         memset(a,,sizeof(a));
         ;i<=n;++i)
             scanf("%d",a+i);
         scanf("%d",&m);
         ll p;
         while(m--)
         {
             scanf("%lld",&p);
             printf("%d\n",gao(p));
         }
     }
     ;
 }

G.A-Number and B-Number

一个数如果某位含有7或能被7整除,那么这种数为A-Number ,把A数写成数列,如果下标不是A-number的A-number是B-number。求第n个B-number,保证答案不超long long

这题真像腾讯马拉松 HDU 4507,首先如果我们知道n以内有多少个A-Number,那么不仅第n个A-Number可以通过二分求出,B-Number,同理也能求出。问题的关键就是求n以内A-Number的个数。可以用数位DP求出n内的A-Number,其中DP[i][j][k]表示i位数,mod 7 ==j  k==1?数位含7:不含7的数的A-Number的个数,将n十进制分解,然后逐位累加就可以求出答案了。

 #include <map>
 #include <set>
 #include <list>
 #include <queue>
 #include <stack>
 #include <cmath>
 #include <ctime>
 #include <vector>
 #include <bitset>
 #include <cstdio>
 #include <string>
 #include <numeric>
 #include <cstring>
 #include <cstdlib>
 #include <iostream>
 #include <algorithm>
 #include <functional>
 using namespace std;
 typedef long long  ll;
 typedef unsigned long long ull;

 ]={-,,,};
 ]={,,-,};//up down left right
 ||x>n||y<||y>m)return false;return true;}
 )*m+y;}

 #define eps 1e-8
 #define inf 0x7fffffff
 #define debug puts("BUG")
 #define lson l,m,rt<<1
 #define rson m+1,r,rt<<1|1
 #define root 1,n,1
 #define read freopen("in.txt","r",stdin)
 #define write freopen("out.txt","w",stdout)
 #define maxn 25
 #define MOD 2012
 int d[maxn];
 ull dp[maxn][][];

 ull dfs(int dx,int mod7,int have7,int limit)
 {
     if(!dx)return (!mod7||have7);
     if(!limit&&~dp[dx][mod7][have7])
         return dp[dx][mod7][have7];
     ;
     if(limit)w=d[dx];
     ull tot=0ULL;
     ;i<=w;++i)
     {
         *mod7+i)%;
         );
         tot+=dfs(dx-,tmod7,thave7,limit&&i==w);
     }
     if(!limit)dp[dx][mod7][have7]=tot;
     return tot;
 }
 ull gao(ull n)
 {
     ;
     while(n)
     {
         d[++cnt]=n%;
         n/=;
     }
     ull t=dfs(cnt,,,);
     ;
 }
 ull bin(ull n)
 {
     ull l=7ULL,r=(1ULL<<)-,m;
     while(l<=r)
     {
         m=(l+r)>>;
         ull t1=gao(m);
         ull t2=t1-gao(t1);
         ;
         ;
     }
     ;
 }
 int main()
 {
     //read;
     memset(dp,-,sizeof(dp));
     ull n;
     while(~scanf("%llu",&n))
         printf("%llu\n",bin(n));
     ;
 }

H.Boring Counting

一个长度为n的数组,q次询问[L,R]之间在[A,B]范围内的个数(n,q<5*10^4)。

这题很像HDU 4417 ,线段树离线操作,可以先把数组和询问全部保存下来,然后数组按照权从小到大排序,然后询问先按照B从小到大排序,然后线段树在按序插入数组中的数,然后就可以依次回答排序后的询问了,同理再按A排序,做差就是答案。另外还可以用划分树做。

 #include <map>
 #include <set>
 #include <list>
 #include <queue>
 #include <stack>
 #include <cmath>
 #include <ctime>
 #include <vector>
 #include <bitset>
 #include <cstdio>
 #include <string>
 #include <numeric>
 #include <cstring>
 #include <cstdlib>
 #include <iostream>
 #include <algorithm>
 #include <functional>
 using namespace std;
 typedef long long  ll;
 typedef unsigned long long ull;

 ]={-,,,};
 ]={,,-,};//up down left right
 ||x>n||y<||y>m)return false;return true;}
 )*m+y;}

 #define eps 1e-8
 #define inf 0x7fffffff
 #define debug puts("BUG")
 #define lson l,m,rt<<1
 #define rson m+1,r,rt<<1|1
 #define root 1,n,1
 #define read freopen("in.txt","r",stdin)
 #define write freopen("out.txt","w",stdout)
 #define maxn 50005
 #define MOD 2012
 ];
 struct str1
 {
     int h,dx;
     bool operator <(const str1 t) const{return h<t.h;}
 }nd[maxn];
 struct str2
 {
     int l,r,h1,h2,dx;
 }que[maxn];
 bool cmp1(str2 s1,str2 s2)
 {
     return s1.h1<s2.h1;
 }
 bool cmp2(str2 s1,str2 s2)
 {
     return s1.h2<s2.h2;
 }
 ];
 void pushup(int rt)
 {
     sum[rt]=sum[rt<<]+sum[rt<<|];
     return ;
 }
 void build(int l,int r,int rt)
 {
     if(l==r)
     {
         sum[rt]=;
         return ;
     }
     ;
     build(lson);
     build(rson);
     pushup(rt);
 }
 void update(int p,int l,int r,int rt)
 {
     if(l==r)
     {
         ++sum[rt];
         return ;
     }
     ;
     if(p<=m)update(p,lson);
     else update(p,rson);
     pushup(rt);
 }
 int query(int l1,int r1,int l,int r,int rt)
 {
     if(l1<=l&&r1>=r)
         return sum[rt];
     ,ans=;
     if(l1<=m)ans+=query(l1,r1,lson);
     if(r1>m)ans+=query(l1,r1,rson);
     return ans;
 }
 int main()
 {
     //read;
     int cas;
     scanf("%d",&cas);
     ;xx<=cas;++xx)
     {
         int n,m;
         scanf("%d%d",&n,&m);
         //保存节点和查询信息,离线线段树
         ;i<=n;++i)
         {
             scanf("%d",&nd[i].h);
             nd[i].dx=i;
         }
         ;i<=m;++i)
         {
             scanf("%d%d%d%d",&que[i].l,&que[i].r,&que[i].h1,&que[i].h2);
             que[i].dx=i;
         }
         //对于每个节点,按权值从小到大排序
         sort(nd+,nd+n+);
         //对每个询问,先按h2从小到大排序
         sort(que+,que++m,cmp2);
         build(root);
         ;
         ;i<=m;++i)
         {
             while(cnt<=n&&nd[cnt].h<=que[i].h2)
             {
                 update(nd[cnt].dx,root);
                 ++cnt;
             }
             ans[que[i].dx][]=query(que[i].l,que[i].r,root);
         }
         build(root);
         //再对每个询问,先按h1从小到大排序
         sort(que+,que++m,cmp1);
         cnt=;
         ;i<=m;++i)
         {
             while(cnt<=n&&nd[cnt].h<que[i].h1)
             {
                 update(nd[cnt].dx,root);
                 ++cnt;
             }
             ans[que[i].dx][]=query(que[i].l,que[i].r,root);
         }
         printf("Case #%d:\n",xx);
         //答案就是两次统计的差值
         ;i<=m;++i)
             printf(]-ans[i][]);
     }
     ;
 }

I.The number of steps

一个n行三角形迷宫,有概率向左,向左下,向右下移动。求从顶点移动到最左下角的步数期望(n<45)。

比较简单的期望题,因为递推关系中无环,所以DP线性递推。方向要搞对,从下向上,从左到右。

 #include <map>
 #include <set>
 #include <list>
 #include <queue>
 #include <stack>
 #include <cmath>
 #include <ctime>
 #include <vector>
 #include <bitset>
 #include <cstdio>
 #include <string>
 #include <numeric>
 #include <cstring>
 #include <cstdlib>
 #include <iostream>
 #include <algorithm>
 #include <functional>
 using namespace std;
 typedef long long  ll;
 typedef unsigned long long ull;

 ]={-,,,};
 ]={,,-,};//up down left right
 ||x>n||y<||y>m)return false;return true;}
 )*m+y;}

 #define eps 1e-8
 #define inf 0x7fffffff
 #define debug puts("BUG")
 #define lson l,m,rt<<1
 #define rson m+1,r,rt<<1|1
 #define read freopen("in.txt","r",stdin)
 #define write freopen("out.txt","w",stdout)
 #define maxn 55
 #define MOD 1000000007
 double dp[maxn][maxn];
 int main()
 {
     //read;
     int n;
     while(scanf("%d",&n),n)
     {
         double a,b,c,d,e;
         scanf("%lf%lf%lf%lf%lf",&a,&b,&c,&d,&e);
         dp[n][]=;
         ;i<=n;++i)
             dp[n][i]=dp[n][i-]+1.0;
         ;i>;--i)
         {
             dp[i][]=a*dp[i+][]+b*dp[i+][]+1.0;
             ;j<n;++j)
                 dp[i][j]=c*dp[i+][j]+d*dp[i+][j+]+e*dp[i][j-]+1.0;
         }
         printf(][]);
     }
     ;
 }

J.Contest Print Server

题意是模拟一个打印服务。

一道水题,可以直接模拟,由于赛场上一个很戏剧性的剧情,导致这个题AC的并不多。

 #include <map>
 #include <set>
 #include <list>
 #include <queue>
 #include <stack>
 #include <cmath>
 #include <ctime>
 #include <vector>
 #include <bitset>
 #include <cstdio>
 #include <string>
 #include <numeric>
 #include <cstring>
 #include <cstdlib>
 #include <iostream>
 #include <algorithm>
 #include <functional>
 using namespace std;
 typedef long long  ll;
 typedef unsigned long long ull;

 ]={-,,,};
 ]={,,-,};//up down left right
 ||x>n||y<||y>m)return false;return true;}
 )*m+y;}

 #define eps 1e-8
 #define inf 0x7fffffff
 #define debug puts("BUG")
 #define lson l,m,rt<<1
 #define rson m+1,r,rt<<1|1
 #define read freopen("in.txt","r",stdin)
 #define write freopen("out.txt","w",stdout)
 #define maxn 105
 #define MOD 2012
 int n,s,x,y,mod;
 struct str
 {
     ];
     int p;
 };
 str tt[maxn];
 void gao(int ff)
 {
     int now=s;
     ;i<=n;++i)
     {
         if(tt[i].p<=now)
         {
             printf("%d pages for %s\n",tt[i].p,tt[i].name);
             now-=tt[i].p;
         }
         else
         {
             printf("%d pages for %s\n",now,tt[i].name);
             s=(x*s+y)%mod;
             now=s;
             --i;
         }
     }
     puts("");
 }
 int main()
 {
     //read;
     int cas;
     scanf("%d",&cas);
     while(cas--)
     {
         scanf("%d%d%d%d%d",&n,&s,&x,&y,&mod);
         ],s2[];
         ;i<=n;++i)
             scanf("%s%s%d%s",tt[i].name,s1,&tt[i].p,s2);
         gao(cas);
     }
     ;
 }

这次省赛很悲剧,由于160min出第4题后一直哑火到比赛结束。最终只拿到银牌。

很讽刺的是这是最后一次参加比赛了,可却是总结最认真的一次。平时做题不好好总结,赛场上出这么多原题就傻眼了吧,看来这就是平时偷懒不认真总结的报应了。

最后感谢SDUT E_star 给了我一些题目的思路,并提供了标程和数据让我能对拍。

[ACM]2013山东省“浪潮杯”省赛 解题报告的更多相关文章

  1. 2013山东省“浪潮杯”省赛 A.Rescue The Princess

    A.Rescue The PrincessDescription Several days ago, a beast caught a beautiful princess and the princ ...

  2. 2016 ACM/ICPC亚洲区大连站-重现赛 解题报告

    任意门:http://acm.hdu.edu.cn/showproblem.php?pid=5979 按AC顺序: I - Convex Time limit    1000 ms Memory li ...

  3. ZROIDay4-比赛解题报告

    ZROIDay4-比赛解题报告 扯闲话 感觉这个出题人的题做起来全都没感觉啊,今天又凉了,T1完全不知道什么意思,T2只会暴力,T3现在还不懂什么意思,真的太菜了 A 题意半天没搞懂爆零GG了,讲了一 ...

  4. ZROIDay3-比赛解题报告

    ZROIDay3-比赛解题报告 瞎扯 从今天开始考试有点不在状态,可能是因为不太适应题目的原因,T1已经接近了思想但是没有想到状态转移,T2思考方向错误,T3不会打LCT,还是太菜了 A 考场上想到要 ...

  5. 10.30 NFLS-NOIP模拟赛 解题报告

    总结:今天去了NOIP模拟赛,其实是几道USACO的经典的题目,第一题和最后一题都有思路,第二题是我一开始写了个spfa,写了一半中途发现应该是矩阵乘法,然后没做完,然后就没有然后了!第二题的暴力都没 ...

  6. CH Round #56 - 国庆节欢乐赛解题报告

    最近CH上的比赛很多,在此会全部写出解题报告,与大家交流一下解题方法与技巧. T1 魔幻森林 描述 Cortana来到了一片魔幻森林,这片森林可以被视作一个N*M的矩阵,矩阵中的每个位置上都长着一棵树 ...

  7. 2018.10.26NOIP模拟赛解题报告

    心路历程 预计得分:\(100 + 100 + 70\) 实际得分:\(40 + 100 + 70\) 妈妈我又挂分了qwq..T1过了大样例就没管,直到临考试结束前\(10min\)才发现大样例是假 ...

  8. 2014山东省“浪潮杯”第五届ACM省赛总结

    一次比赛做一次总结,弱菜又来总结了…… 我这种大四的又死皮赖来混省赛了,貌似就我和山大威海的某哥们(不详其大名)了吧.颁奖前和他聊天,得知他去百度了,真是不错,ORZ之. 比赛流水账: 题目目前不知道 ...

  9. Anagram(山东省2018年ACM浪潮杯省赛)

    Problem Description Orz has two strings of the same length: A and B. Now she wants to transform A in ...

随机推荐

  1. db2,差集

    --漏报的数据 FROM A LEFT JOIN A′ ON 交集的条件 WHERE A′.xx IS NULL --多报的数据 FROM A′ LEFT JOIN A ON 交集的条件 WHERE ...

  2. NodeJs中数据库的使用

    另一遍通用的NODEJS数据库方法koa,express,node 通用方法连接MySQL 1.Node.js 连接 MySQL $ cnpm install mysql 连接mysql: var m ...

  3. mysql 删除数据重复的记录

    delete from user where id not in ( select * from ( select min(id) from user group by username,email ...

  4. 集训第六周 E题

    E - 期望(经典问题) Time Limit:1000MS     Memory Limit:32768KB     64bit IO Format:%lld & %llu Submit S ...

  5. 3D标签云

    一.圆的坐标表达式 for(var i = 0;i < len;i++){ degree = (2*(k+1)-1)/len - 1;a = Math.acos(degree);//这样取得弧度 ...

  6. 在win10配置环境变量

    从win7升级成win10后找不到在哪配置环境变量...手动再见ヾ( ̄▽ ̄)Bye~,废话不多说,下面开始图文模式: 1)打开文件资源管理器,点左上角的"计算机"

  7. 爬虫(1):requests模块

    requests介绍: reqeusts模块:python原生一个基于网络请求的模块,模拟浏览器发起请求. requests模块的优点: - 1.自动处理url编码 - 2.自动处理post请求的参数 ...

  8. android开发里跳过的坑——android studio 错误Error:Execution failed for task ':processDebugManifest'. > Manifest merger failed with multiple errors, see logs

    使用AS在gradle里配置了多个定制版本,发现在编译版本切换时,会出现错误: Error:Execution failed for task ':processDebugManifest'.> ...

  9. CF585E:Present for Vitalik the Philatelist

    n<=500000个2<=Ai<=1e7的数,求这样选数的方案数:先从其中挑出一个gcd不为1的集合,然后再选一个不属于该集合,且与该集合内任意一个数互质的数. 好的统计题. 其实就 ...

  10. Linux下汇编语言学习笔记57 ---

    这是17年暑假学习Linux汇编语言的笔记记录,参考书目为清华大学出版社 Jeff Duntemann著 梁晓辉译<汇编语言基于Linux环境>的书,喜欢看原版书的同学可以看<Ass ...