17-06-02模拟赛

T1:

经过推算可以发现斐波那契数列第n项前缀和等于第n+2项的数-1,即s[n]=f[n+2]-1.

所以斐波那契数列的[l,r]项的区间和可以看作s[r]-s[l-1],即f[r+2]-f[l+1].

考虑到l,r的范围及取模的需要,用矩阵乘法快速幂并将乘法改为快速乘以保证不超出范围即可。

原理为

Tips:快速乘和快速幂的原理相同,把其中一个乘数拆为二进制,转乘法为加法(类比快速幂,快速幂是转幂运算为乘法),这样就可以边加边取模。

Code:

 1 #include<cstdio>
 2 #include<cstring>
 3 #include<algorithm>
 4 #define ull unsigned long long
 5 using namespace std;
 6 struct ma{
 7     ull mat[2][2];
 8 }a,b;
 9 inline ull in(){
10     ull x=0;bool f=0; char c;
11     for (;(c=getchar())<‘0‘||c>‘9‘;f=c==‘-‘);
12     for (x=c-‘0‘;(c=getchar())>=‘0‘&&c<=‘9‘;x=(x<<3)+(x<<1)+c-‘0‘);
13     return f?-x:x;
14 }
15 ull n,mod,l,r,matl,matr;
16 ull qmult(ull a,ull b){
17     if (a<b) swap(a,b);ull c=0;
18     while (b){
19         if  (b&1) c=(c+a)%mod;
20         b>>=1;a=(a<<1)%mod;
21     }
22     return c%mod;
23 }
24 ma mtmult(ma a,ma b){
25     ull sum=0;ma c;
26     memset(c.mat,0,sizeof(c.mat));
27     for (int i=0;i<2;++i)
28     for (int j=0;j<2;++j){
29         sum=0;
30         for (int k=0;k<2;++k)
31         sum=(sum+qmult(a.mat[i][k],b.mat[k][j]))%mod;
32         c.mat[i][j]=sum;
33     }
34     return c;
35 }
36 ma mtpow(ma a,ull x){
37     ma c;
38     memset(c.mat,0,sizeof(c.mat));
39     for (int i=0;i<2;++i) c.mat[i][i]=1;
40     while (x){
41         if (x&1) c=mtmult(c,a);
42         x>>=1;a=mtmult(a,a);
43     }
44     return c;
45 }
46 ull mtcult(ull x)
47 {
48     if (!x) return 0LL;if (x<3) return 1LL;
49     memset(a.mat,0,sizeof(a.mat));memset(b.mat,0,sizeof(b.mat));
50     for (int i=0;i<2;++i) b.mat[i][0]=1;
51     for (int i=0;i<2;++i) a.mat[i][1]=1;a.mat[1][0]=1;
52     a=mtpow(a,x-2);a=mtmult(a,b);return a.mat[1][0]%mod;
53 }
54 int main()
55 {
56     n=in();mod=in();
57     while (n--){
58         l=in();r=in();matl=matr=0;
59         matl=mtcult(l+1);matr=mtcult(r+2);
60         printf("%lld\n",(matr+mod-matl)%mod);
61     }
62     return 0;
63 }

T2:

先考虑m=1的情况:
设先取第i双水晶鞋比先取第j双水晶鞋优,则di*(W-wi)+dj*(W-wi-wj)<dj*(W-wj)+di*(W-wi-wj),其中W表示总权值。

由此可得di*wj<dj*wi,也就是说,当i,j满足该式时,i先取比j先取更优。

这样的结论只有在i,j相邻时是正确的,若要保证这样排序是正确的,必须证明:当i先比j先优,且j先比k先优时,i先比k先优。

我们发现这个结论满足这个性质。因此排序即可。

若m>1,我们发现若两双水晶鞋的编号对m取模不同余,那么取两双鞋的先后顺序不会对答案产生影响。

因此枚举余数,每次将模m等于该余数的水晶鞋取出排序并分别统计答案即可。

最后注意答案可能会超出long long的范围,因此需将答案用两个long long 存储。

Code:

 1 #include<cstdio>
 2 #include<cstring>
 3 #include<algorithm>
 4 #define ll long long
 5 #define MN 200005
 6 #define Mx 1000000000000000000LL
 7 using namespace std;
 8 inline ll in(){
 9     ll x=0;bool f=0; char c;
10     for (;(c=getchar())<‘0‘||c>‘9‘;f=c==‘-‘);
11     for (x=c-‘0‘;(c=getchar())>=‘0‘&&c<=‘9‘;x=(x<<3)+(x<<1)+c-‘0‘);
12     return f?-x:x;
13 }
14 ll d[MN],w[MN],pos[MN];
15 ll n,m,a1,a2;
16 bool cmp(ll x,ll y){
17     return (1LL*d[x]*w[y]<1LL*d[y]*w[x]);
18 }
19 int main()
20 {
21     n=in();m=in();
22     for (int i=1;i<=n;++i) d[i]=in(),w[i]=in();
23     for (int i=1;i<=m;++i){
24         ll cnt=0,sum=0;
25         for (int j=i;j<=n;j+=m) pos[++cnt]=j,sum+=w[j];
26         sort(pos+1,pos+cnt+1,cmp);
27         for (int j=1;j<=cnt;++j){
28             sum-=w[pos[j]];a2+=1LL*d[pos[j]]*sum;
29             if (a2>Mx) ++a1,a2-=Mx;
30         }
31     }if (!a1) printf("%lld",a2);else printf("%lld%018lld",a1,a2);
32     return 0;
33 }

T3:

依题意可知该无向连通图为一棵树。

考虑对该树上的节点进行差分。

注意到每个节点的贡献是与它深度差不超过m的祖先,所以可将将该节点加上该节点的精华值,离该节点距离为m的祖先处减去该节点的精华值,统计答案时从叶节点往上加即可。

Code:

 1 #include<cstdio>
 2 #include<cstring>
 3 #include<algorithm>
 4 #define MN 1000005
 5 using namespace std;
 6 inline int in(){
 7     int x=0;bool f=0; char c;
 8     for (;(c=getchar())<‘0‘||c>‘9‘;f=c==‘-‘);
 9     for (x=c-‘0‘;(c=getchar())>=‘0‘&&c<=‘9‘;x=(x<<3)+(x<<1)+c-‘0‘);
10     return f?-x:x;
11 }
12 struct edge{
13     int to,next;
14 }e[MN<<1];
15 int head[MN],lev[MN],dif[MN],w[MN];
16 int n,m,x,y,cnt=0,top,dep;
17 void ins(int x,int y){
18     e[++cnt].to=y;e[cnt].next=head[x];head[x]=cnt;
19 }
20 void dfs(int u,int fa){
21     top=(dep-m<0)?0:dep-m;
22     dif[u]+=w[u];dif[lev[top]]-=w[u];lev[++dep]=u;
23     for (int i=head[u];i;i=e[i].next){
24         int v=e[i].to;
25         if (v==fa) continue;
26         dfs(v,u);dif[u]+=dif[v];
27     }--dep;
28 }
29 int main()
30 {
31     n=in();m=in();
32     for (int i=1;i<=n;++i) w[i]=in();
33     for (int i=1;i<n;++i){
34         x=in();y=in();ins(x,y);ins(y,x);
35     }dfs(1,0);
36     for (int i=1;i<=n;++i) printf("%d\n",dif[i]);
37     return 0;
38 }

T4:区间动规。

f[i][j][l][r](l,r=0 or 1)表示在i到j的区间中左端法力类型为l,右端法力类型为r时得到的最大法术强度。

注意处理由于受到了一些段强制选择法力的约束而产生的不可能得到的状态。

转移方程为f[l][r][l1][r1]=max{f[l][k][l1][r2]+f[k+1][r][l2][r1]+a[l1^l2][l]*a[l1^l2][k+1]+a[r1^r2][k]*a[r1^r2][r]}.

时间复杂度为O(16*n3)。

Code:

 1 #include<cstdio>
 2 #include<cstring>
 3 #include<algorithm>
 4 #define MN 202
 5 #define inf 0x3fffffff
 6 using namespace std;
 7 inline int in(){
 8     int x=0;bool f=0; char c;
 9     for (;(c=getchar())<‘0‘||c>‘9‘;f=c==‘-‘);
10     for (x=c-‘0‘;(c=getchar())>=‘0‘&&c<=‘9‘;x=(x<<3)+(x<<1)+c-‘0‘);
11     return f?-x:x;
12 }
13 int f[MN][MN][2][2],a[2][MN],col[MN];
14 int n,m1,m2,x,ans=-inf;
15 int main()
16 {
17     n=in();m1=in();m2=in();memset(col,-1,sizeof(col));
18     for (int i=1;i<=m1;++i) x=in(),col[x]=0;
19     for (int i=1;i<=m2;++i) x=in(),col[x]=1;
20     for (int i=1;i<=n;++i) a[1][i]=in(),a[0][i]=in();
21     for (int i=1;i<=n;++i) f[i][i][0][1]=f[i][i][1][0]=-inf;
22     for (int i=1;i<=n;++i)
23     for (int j=i;j<=n;++j){
24     if (col[i]>=0) f[i][j][col[i]^1][0]=f[i][j][col[i]^1][1]=-inf;
25     if (col[j]>=0) f[i][j][0][col[j]^1]=f[i][j][1][col[j]^1]=-inf;}
26     for (int i=1;i<n;++i)
27     for (int l=1,r=i+1;r<=n;++l,++r)
28     for (int l1=0;l1<=1;++l1)
29     for (int r1=0;r1<=1;++r1)
30     if (f[l][r][l1][r1]!=-inf)
31     for (int k=l;k<r;++k)
32     for (int r2=0;r2<=1;++r2)
33     for (int l2=0;l2<=1;++l2)
34     f[l][r][l1][r1]=max(f[l][r][l1][r1],f[l][k][l1][r2]+f[k+1][r][l2][r1]+a[l1^l2][l]*a[l1^l2][k+1]+a[r1^r2][k]*a[r1^r2][r]);
35     for (int l=0;l<=1;++l)
36     for (int r=0;r<=1;++r) ans=max(ans,f[1][n][l][r]);
37     printf("%d",ans);return 0;
38 }
时间: 2024-10-10 16:33:48

17-06-02模拟赛的相关文章

2017.9.17校内noip模拟赛解题报告

预计分数:100+60+60=220 实际分数:100+60+40=200 除了暴力什么都不会的我..... T1 2017.9.17巧克力棒(chocolate) 巧克力棒(chocolate)Time Limit:1000ms Memory Limit:64MB题目描述LYK 找到了一根巧克力棒,但是这根巧克力棒太长了,LYK 无法一口吞进去.具体地,这根巧克力棒长为 n,它想将这根巧克力棒折成 n 段长为 1 的巧克力棒,然后慢慢享用.它打算每次将一根长为 k 的巧克力棒折成两段长为 a

NOIP模拟9.17(TYVJNOIP2017模拟赛D2)

曼德布洛特(Mandelbrot)集合 算法课W1·leetcode654.MaximumBinaryTree 官方文档PackageOverview软件包概述--几何内核类 glClearColor第四个参数有什么用? dxd奈犯材http://p.baidu.com/itopic/main/center?uid=00266162633962396665360ebc&59m6丶号斗yrci6b觅滓问http://p.baidu.com/itopic/main/center?uid=4ba761

2017.12.02【NOIP提高组】模拟赛A组

2017.12.02[NOIP提高组]模拟赛A组 T1 3555[GDKOI2014模拟]树的直径 T2 3542[清华集训2014]冒泡排序 T3 3486[NOIP2013模拟联考10]道路改建(rebuild) T1 树直径的一个性质,两棵树合并,形成新的树的直径的两个端点为原树中的四个端点之二. 可以用反证法证明.用此性质本题就变成了lca裸题了 Code #include<cstdio> #include<cstring> #include<cmath> #i

ZROI 普及组模拟赛02总结

ZROI 普及组模拟赛02总结 先放[网址][http://zhengruioi.com/contest/96] 可能是有一段时间没有打这种正式的比赛了,今天打的很奇怪... T1 模拟水题 既然是普及组模拟赛T1还是比较良心的 20分钟就过掉了 T2 <论不仔细观察题目导致的惨案> 没有发现莫尔斯电码非常的全 所以应该枚举哪些不行,而不是枚举26个字母 但是根据计算\(2*26*1e6\)也能跑过去啊 不知道为什么就是超时了... 最可笑的是还卡了20min的常数,还自己造了几组1e6的数据

体育成绩统计——20180801模拟赛T3

体育成绩统计 / Score 题目描述 正所谓“无体育,不清华”.为了更好地督促同学们进行体育锻炼,更加科学地对同学们进行评价,五道口体校的老师们在体育成绩的考核上可谓是煞费苦心.然而每到学期期末时,面对海量的原始数据,如何对数据进行处理,得到同学们的体育总评成绩却又成了体育部老师的一大难题. 对于大一的同学们来说,体育课的总评成绩由五部分组成:体育课专项成绩(满分50分).长跑测试成绩(满分20分).“阳光长跑”成绩(满分10分).体质测试成绩(满分10分).“大一专项计划”成绩(满分10分)

【BZOJ】【2741】【FOTILE模拟赛】L

可持久化Trie+分块 神题……Orz zyf & lyd 首先我们先将整个序列搞个前缀异或和,那么某一段的异或和,就变成了两个数的异或和,所以我们就将询问[某个区间中最大的区间异或和]改变成[某个区间中 max(两个数的异或和)] 要是我们能将所有[l,r]的答案都预处理出来,那么我们就可以O(1)回答了:然而我们并不能. 一个常见的折中方案:分块! 这里先假设我们实现了一个神奇的函数ask(l,r,x),可以帮我们求出[l,r]这个区间中的数,与x最大的异或值. 我们不预处理所有的左端点,我

10.30 NFLS-NOIP模拟赛 解题报告

总结:今天去了NOIP模拟赛,其实是几道USACO的经典的题目,第一题和最后一题都有思路,第二题是我一开始写了个spfa,写了一半中途发现应该是矩阵乘法,然后没做完,然后就没有然后了!第二题的暴力都没码QAQ 现在我来写解题报告了,有点饿了QAQ.. 第一题 题目 1: 架设电话线 [Jeffrey Wang, 2007] 最近,Farmer John的奶牛们越来越不满于牛棚里一塌糊涂的电话服务,于 是,她们要求FJ把那些老旧的电话线换成性能更好的新电话线.新的电话线架设 在已有的N(2 <=

【题解】PAT团体程序设计天梯赛 - 模拟赛

由于本人愚笨,最后一题实在无力AC,于是只有前14题的题解Orz 总的来说,这次模拟赛的题目不算难,前14题基本上一眼就有思路,但是某些题写起来确实不太容易,编码复杂度有点高~ L1-1 N个数求和 设计一个分数类,重载加法运算符,注意要约分,用欧几里得算法求个最大公约数即可. 1 #include <cstdio> 2 3 long long abs(long long x) 4 { 5 return x < 0 ? -x : x; 6 } 7 8 long long gcd(long

[铁一中OI模拟赛]2017.8.19 Day1

T1 小Z的情书 题目链接 思考: 题目主要难度在于旋转后的位置如何,在手写了样例之后不难发现规律. #include <cstdio> #include <cstring> #define up(a,b,c) for(register int c=a;c<=b;++c) #define down(a,b,c) for(register int c=a;c>=b;--c) const int Maxn=1005; int n; bool Map[Maxn][Maxn],

bzoj2741: 【FOTILE模拟赛】L

2741: [FOTILE模拟赛]L Time Limit: 15 Sec  Memory Limit: 162 MBSubmit: 2679  Solved: 766[Submit][Status][Discuss] Description FOTILE得到了一个长为N的序列A,为了拯救地球,他希望知道某些区间内的最大的连续XOR和. 即对于一个询问,你需要求出max(Ai xor Ai+1 xor Ai+2 ... xor Aj),其中l<=i<=j<=r. 为了体现在线操作,对于一