8.13模拟:分治二分倍增快速幂

文章目录

  • 前言
  • 考场
  • 复盘
    • T1 road
    • T2 shop
    • T3 run
    • T4 stairs
  • 总结

前言

240分
100+80+20+40
T3少取了一个模结果全挂掉了(好不容易推出来了…)
T2也因为各种奇怪的错误挂了分
qwq
吸取教训吧

考场

今天先看题
T1第一眼看错了题意觉得水的不行
T3YBT原题且很水
T2T4乍看不太可做

因为错误审题,决定先写自以为很水的T1
写完样例不对,才发现自己审题完全审错了
那个翻折的关键性质又没有看出来(都看出来了吗,我感觉并不显然啊qwq)
分析了一会性质感觉打表或许可行
但可能是道搬砖题
此时大概8:40
于是转T3稳一稳

此时心态有些不稳了
(我甚至觉得T3的3e7会炸)
把T3超级暴力的《正解》floyd敲完还不太放心
但是也没有什么太好的方法
转回T1死磕
9:30

T1走上了慢慢打表之路
打了30min终于把恶心的转移数组敲完了
此时已经感觉药丸
但是编译结果有点惊喜
一遍过了样例???
又测了几个位置也对了
说实话那个搬砖代码一个bug没有真的挺神奇的
我本来已经做好了和它死磕的准备
结果就这么过了?
重新燃起希望
10:20

来到T2
很不错的时我很快发现了它的关键性质
利用一半为分界点递归转移
然后后面再跟个二分
check的地方递归求个数
很愉快的切掉了这道挺难的题
有一说一这道应该是我这几次模拟做的最好的一道题
确实有逻辑分析在里面
遗憾的是我切掉的时候也有点激动
手一抖最后的一步乘法没有取模

11:00

此时 我以为 我已经切了3题
心态就平和了起来
推了一会T4没有任何思路
就决定写个好一点的部分分下班
20分还是很好写的
40分也不太难
又开始暴力搬砖
11:30

这次时间有些紧凑
T1和T3浪费了太多时间
我没有很多的时间检查了
(说不定再看看T2的沙雕错误就瞅出来了呢qwq)
最后就带着那个bug走出了考场
qwq

复盘

T1 road

正解简单的离谱
关键是回溯时对原图进行一个神奇的反转操作
就很easy了
但为了纪念还是附上打表代码

#include<bits/stdc++.h>
using namespace std;
#define ll long long
const int N=1e6+100;
int n;
int a,b;
int mi[32];
int shunpl[5][5]={{},{0,1,1,1,3},{0,4,2,2,2},{0,3,1,3,3},{0,4,4,2,4}};
int shundir[5][5]={{},{0,2,1,1,2},{0,2,2,1,1},{0,1,2,2,1},{0,1,1,2,2}};
int shunid[5][5]={{},{0,1,2,3,4},{0,4,1,2,3},{0,3,4,1,2},{0,2,3,4,1}};
int nipl[5][5]={{},{0,1,3,1,1},{0,2,2,4,2},{0,3,3,3,1},{0,2,4,4,4}}; 
int nidir[5][5]={{},{0,1,1,2,2},{0,2,1,1,2},{0,2,2,1,1},{0,1,2,2,1}};
int niid[5][5]={{},{0,1,4,3,2},{0,2,1,4,3},{0,3,2,1,4},{0,4,3,2,1}};
int dx[5]={0,0,0,1,1},dy[5]={0,0,1,1,0};
/*
1:shun
2:ni
*/
int x2,y2,x3,y3;
void find(int k,int pl,int dir,int id,int x,int y){int ed=id+mi[2*k]-1;if((a<id||a>ed)&&(b<id||b>ed)) return;if(k==0){if(id==a){x2=x;y2=y;}if(id==b){x3=x;y3=y;}return;}if(dir==1){//shunint len=mi[k-1],tot=mi[(k-1)*2];for(int i=1;i<=4;i++){find(k-1,shunpl[pl][i],shundir[pl][i],id+(shunid[pl][i]-1)*tot,x+dx[i]*len,y+dy[i]*len);}return;}else{int len=mi[k-1],tot=mi[(k-1)*2];for(int i=1;i<=4;i++){find(k-1,nipl[pl][i],nidir[pl][i],id+(niid[pl][i]-1)*tot,x+dx[i]*len,y+dy[i]*len);}return;}
}
int main(){
//	freopen("road.in","r",stdin);
//	freopen("road.out","w",stdout);int t;scanf("%d",&t);mi[0]=1;for(int i=1;i<=30;i++) mi[i]=mi[i-1]<<1;while(t--){scanf("%d%d%d",&n,&a,&b);find(n,1,1,1,1,1);//printf("a=(%d,%d) b=(%d,%d)\n",x2,y2,x3,y3);printf("%.0lf\n",10.0*sqrt((x3-x2)*(x3-x2)+(y3-y2)*(y3-y2)));}return 0;
}
/*
3
1 1 2
2 16 1
3 4 33
*/

T2 shop

本题std的二分很神奇
类似于一个二分相对大小的最大值
然后硬限制一个范围
就过了…
觉得还是我的代码更好理解一写qwq(所有人对自己的代码都是这么想的)
不取模,见祖宗

#include<bits/stdc++.h>
using namespace std;
#define ll long long
const int N=105;
const int mod=1e9+7;
int n,k;
int solve(int x){if(x==0) return 0;return x+solve(x/2);
}
int find(int l,int r){if(l>r) return 0;if(r==0) return 0;return r-l+1 + find((l+1)/2,r/2);
}
ll ksm(ll x,int k){ll ans=1,res=x;while(k){if(k&1) ans=ans*res%mod;res=res*res%mod;k>>=1;}return ans;
}
void work(int k,int n){int tot=solve(n/2);if(k<=tot){work(k,n/2);return;}k-=tot;
//	printf("n=%d tot=%d k=%d\n",n,tot,k);int o=k/n,p=k%n;if(p==0){printf("%lld\n",n*ksm(2,o-1)%mod);return;}int st=n/2+1,ed=n;while(st<ed){int mid=st+ed>>1;
//		printf("  l=%d r=%d find=%d\n",n/2+1,mid,find(n/2+1,mid));if(find(n/2+1,mid)>=p) ed=mid;else st=mid+1;}printf("%lld\n",st*ksm(2,o)%mod);
}
int main(){
//	freopen("shop.in","r",stdin);
//	freopen("shop.out","w",stdout);int t;scanf("%d",&t);while(t--){scanf("%d%d",&k,&n);work(k,n);}return 0;
}
/*
5
3 1
3 2
5 3
1000000000 1
987654321 8765432101
32 10
*/

T3 run

YBT原题且很水
这也挂分就离谱
有一个是没有特判m=1的情况
还有一个是因为int的范围k只枚举到30而不是31!
头疼

#include<bits/stdc++.h>
using namespace std;
#define ll long long
const int N=105;
int n,m;
bool f[33][N][N];
int dis[N][N];
int main(){
//	freopen("run.in","r",stdin);
//	freopen("run.out","w",stdout);int t;scanf("%d",&t);while(t--){memset(f,0,sizeof(f));memset(dis,0x3f,sizeof(dis));
//		if(n==1){
//			printf("0\n");
//			continue;
//		}scanf("%d%d",&n,&m);for(int i=1;i<=m;i++){int x,y;scanf("%d%d",&x,&y);f[0][x][y]=1;}for(int k=1;k<=30;k++){for(int i=1;i<=n;i++){for(int j=1;j<=n;j++){//if(i==j) continue;for(int p=1;p<=n;p++){//if(p==i||p==j) continue;if(f[k-1][i][p]&&f[k-1][p][j]){f[k][i][j]=1;
//							printf("  p=%d\n",p);break;}}
//					printf("k=%d i=%d j=%d f=%d\n",k,i,j,f[k][i][j]);}}}for(int i=1;i<=n;i++){for(int j=1;j<=n;j++){//if(i==j) continue;for(int k=0;k<=30;k++){if(f[k][i][j]){
//						printf("ok:k=%d i=%d j=%d\n",k,i,j);dis[i][j]=1;break;}}}dis[i][i]=0;}for(int k=1;k<=n;k++){for(int i=1;i<=n;i++){for(int j=1;j<=n;j++){dis[i][j]=min(dis[i][j],dis[i][k]+dis[k][j]);}}}printf("%d\n",dis[1][n]);}return 0;
}
/*
1
5 5
1 4
4 1
1 2
2 3
3 5
*/

T4 stairs

这题考场确实不太可做
考后写起来发现反而不难了
状压求出转移矩阵再快速幂加速即可
一个重要的技巧是把0规定为有挡板
这样不同高度之间可以无缝连接

#include<bits/stdc++.h>
using namespace std;
#define ll long long
const int N=105;
const int mod=1e9+7;
int n,k;
int w[8];
struct matrix{int x,y;ll a[130][130];void clear(){for(int i=0;i<=x;i++)for(int j=0;j<=y;j++) a[i][j]=0;}
};
int mi[8];
void print(matrix o){for(int i=0;i<=min(3,o.x);i++){for(int j=0;j<=3;j++) printf("%d ",o.a[i][j]);printf("\n");}return;
}
matrix cheng(matrix a,matrix b){matrix o;//printf("Mul:\n") ;//print(a);print(b);o.x=a.x;o.y=b.y;o.clear();for(int i=0;i<=o.x;i++){for(int j=0;j<=o.y;j++){for(int k=0;k<=a.y;k++){o.a[i][j]=(o.a[i][j]+a.a[i][k]*b.a[k][j])%mod;//if(a.a[i][k]*b.a[k][j])	printf("  i=%d j=%d k=%d %d*%d a=%d\n",i,j,k,a.a[i][k],b.a[k][j],o.a[i][j]);}}}return o;
}
int dp[130][2];//dp[i][op]op:下面的边 
matrix trans[8];
void init(){mi[0]=1;for(int i=1;i<=7;i++) mi[i]=mi[i-1]<<1;for(int k=1;k<=7;k++){trans[k].x=trans[k].y=mi[7]-1;for(int i=0;i<mi[k];i++){for(int j=0;j<mi[k];j++){dp[0][1]=1;dp[0][0]=0;for(int p=1;p<=k-1;p++){if((i|j)&mi[p-1]){dp[p][1]=dp[p-1][0]+dp[p-1][1];dp[p][0]=dp[p-1][1]+dp[p-1][0];}else{dp[p][1]=dp[p-1][0];dp[p][0]=dp[p-1][1]+dp[p-1][0];}dp[p][0]%=mod;dp[p][1]%=mod;}if((i|j)&mi[k-1]) trans[k].a[i][j]=dp[k-1][0]+dp[k-1][1];else trans[k].a[i][j]=dp[k-1][0];//printf("k=%d i=%d j=%d trans=%d\n",k,i,j,trans[k].a[i][j]);}}}
}
matrix ans;
int main(){for(int i=1;i<=7;i++) scanf("%d",&w[i]);init();ans.x=0;ans.y=mi[7]-1;ans.a[0][0]=1;for(int i=1;i<=ans.y;i++) ans.a[0][i]=0;for(int k=1;k<=7;k++){//printf("k=%d trans:\n",k);//print(trans[k]);while(w[k]){//printf("k=%d\n",w[k]);if(w[k]&1){ans=cheng(ans,trans[k]);//printf("ans:\n");//for(int i=0;i<=4;i++) printf("%d ",ans.a[0][i]);//printf("\n");}trans[k]=cheng(trans[k],trans[k]);//printf("trans:\n");//print(trans[k]);w[k]>>=1;}}printf("%lld\n",ans.a[0][0]);return 0;
}
/*
5
3 1
3 2
5 3
1000000000 1
987654321 8765432101
32 10
*/

总结

争取吃一堑长一智吧
以后检查代码注意的东西又多了一个:取模是否彻底!
明天:字符串 加油!awa

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/318247.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

dnSpy 强大的.Net反编译软件

一说起.net的反编译软件&#xff0c;大家首先想到的就是Reflector&#xff0c;ILSpy&#xff0c;dotPeek等等。而dnSpy同样是一款优秀的反编译软件&#xff0c;同时它是开源免费的。官方的描述是: dnSpy是一个调试器和.NET组件编辑器。 即使您没有任何可用的源代码&#xff0c;…

图的匹配

定义见&#xff1a;OI-Wiki 图的匹配 。 二分图 解法 \(1\) &#xff1a;网络流(通用) 二分图最大匹配可以转换成最大流(费用流)模型 。 如果使用 \(\operatorname{Dinic}\) 算法求该网络的最大流&#xff0c;复杂度\(O(\sqrt{n}m)\) 。 具体代码见博客文章网络流 。 解法 \(2\…

AT2161-[ARC065D]シャッフル/Shuffling【dp】

正题 题目链接:https://www.luogu.com.cn/problem/AT2161 题目大意 长度为nnn的0/10/10/1串&#xff0c;mmm个区间&#xff0c;你可以按照顺序任意排列区间中的数字&#xff0c;求最后的可能情况数。 保证给出区间的左端点不降。 1≤n,m≤30001\leq n,m\leq 30001≤n,m≤3000…

【acwing210 异或运算】

【acwing210 异或运算】 题意&#xff1a; 给定你由N个整数构成的整数序列&#xff0c;你可以从中选取一些&#xff08;甚至一个&#xff09;进行异或&#xff08;XOR&#xff09;运算&#xff0c;问所有能得到的不同的结果中第k小的结果是多少。 题解&#xff1a; 把所有数…

小奇探险

文章目录题目题解代码实现题目 小奇去遗迹探险&#xff0c;遗迹里有N个宝箱&#xff0c;有的装满了珠宝&#xff0c;有的装着废品。 小奇有地图&#xff0c;所以它知道每一个宝箱的价值&#xff0c;但是它不喜欢走回头路&#xff0c;所以要按顺序拿这N个宝箱中的若干个。 拿宝…

8.14 模拟:字符串

文章目录前言收获考场复盘T1 wordlistT2 passwordT3 readtreeT4 bracket总结前言 290分 2010070100 又被KH爆碾了qwq T1签到题脑抽写挂了80分… &#xff08;就差这80啊…&#xff09;、 收获 学会了启发式合并 还有一个把字符串所有后缀放进trie树的比较字符串的技巧 考场…

基于Asp.Net Core打造轻量级内部服务治理RPC(二 远程服务设计)

紧接上一篇《基于Asp.Net Core打造轻量级内部服务治理RPC(一)》文章。本文主要讲解基于Asp.Net Core的远程服务设计和实现。在上一篇中讲过,服务提供者提供的服务实际上就是一个Controller&#xff0c;那么是否在该程序中&#xff0c;服务都按照Asp.Net Core 中的Web Api的方式…

[TJOI2008]彩灯

题目&#xff1a; Peter 女朋友的生日快到了&#xff0c;他亲自设计了一组彩灯&#xff0c;想给女朋友一个惊喜。已知一组彩灯是由一排 N个独立的灯泡构成的&#xff0c;并且有 MM 个开关控制它们。从数学的角度看&#xff0c;这一排彩灯的任何一个彩灯只有亮与不亮两个状态&a…

51nod1229-序列求和V2【数学,拉格朗日插值】

正题 题目链接:http://www.51nod.com/Challenge/Problem.html#problemId1229 题目大意 给出n,k,rn,k,rn,k,r求 ∑i1nikri\sum_{i1}^ni^kr^ii1∑n​ikri 1≤T≤20,1≤n,r≤1018,1≤k≤20001\leq T\leq 20,1\leq n,r\leq 10^{18},1\leq k\leq 20001≤T≤20,1≤n,r≤1018,1≤k≤…

【做题记录】图论杂题

P1268 树的重量 $\texttt{solution}$ 算法&#xff1a;(贪心)\(\) 找规律 当 \(n2\) 时&#xff0c;显然答案就是 \(dis(1,2)\) 。 当 \(n3\) 时&#xff0c;答案&#xff1a; \[\dfrac{dis(1,3)dis(2,3)-dis(1,2)}{2} \]当 \(n\) 是任意的&#xff0c;第 \(n\) 条路径可以处于…

[NOIP 2009 提高组]最优贸易

勤劳的一更题目题解代码实现题目 C国有 n个大城市和 m 条道路&#xff0c;每条道路连接这n个城市中的某两个城市。任意两个城市之间最多只有一条道路直接相连。这 m 条道路中有一部分为单向通行的道路&#xff0c;一部分为双向通行的道路&#xff0c;双向通行的道路在统计条数…

8.15模拟:图论

文章目录前言收获考场复盘T1 recoverT2 teamT3 planT4 seqpath总结至暗时刻 前言 60分 303000 … 已经不是被KH爆碾的问题 &#xff08;KH屹立不倒%%%&#xff09; 昨天祈祷不要挂80了 结果今天挂了160&#xff08;还不算那个背包的70&#xff09; qwq 加油吧 奇怪的教训又增加…

Azure Service Fabric Mesh:一个构建任务关键型微服务的平台

本文要点Azure Service Fabric Mesh&#xff08;目前处于预览阶段&#xff09;是一个完全托管的服务&#xff0c;它使你可以使用“无服务器”方法构建、部署和管理由运行在容器中的多语言服务组成的应用程序。Azure Service Fabric Mesh 通过使用 Envoy Proxy 构建的软件定义网…

【做题记录】人类智慧

CF741C Arpa’s overnight party and Mehrdad’s silent entering 描述&#xff1a;有 \(2n\) 个人坐在一张圆桌&#xff0c;第 \(1\) 个位置与第 \(n\) 个位置相邻。现在给他们分配 \(1\) 或 \(2\) 两种食物。要求任意相邻的三个人食物不完全相同。求是否有可行的分配方案。 转…

CF1039D-You Are Given a Tree【根号分治,贪心】

正题 题目链接:https://www.luogu.com.cn/problem/CF1039D 题目大意 给出nnn个点的一棵树&#xff0c;然后对于k∈[1,n]k\in[1,n]k∈[1,n]求每次使用一条长度为kkk的链覆盖树并且不能重复覆盖点时最大覆盖条数。 1≤n≤1051\leq n\leq 10^51≤n≤105 解题思路 先考虑暴力怎么…

P3265 [JLOI2015]装备购买

题目描述&#xff1a; 给N个整数向量&#xff0c;每个向量带权值&#xff0c;求权值和最小的线性基 题解&#xff1a; 按权值v从小->大排序&#xff0c;依次插入线性基。整数线性基的思想类似&#xff0c;只是此时“消去”不能直接xor完成&#xff0c;需要类似高斯消元一样…

模板:欧拉路

文章目录前言代码前言 就是欧拉路的板子 理解起来有亿点困难&#xff08;连大神学长都还没有完全理解…&#xff09; 不过背起来还是很好背的 请勿模仿 如果是无向图&#xff1a;开一个vis数组&#xff0c;走一条边时把它的反向边标记上即可 代码 #include<bits/stdc.h&g…

Surging1.0发布在即,.NET开发者们,你们还在等什么?

开源&#xff0c;是近三十年来互联网经久不衰的话题。它不仅仅是一种技术分享的形态&#xff0c;更是一种开放&#xff0c;包容&#xff0c;互利共赢的互联网精神。 不到30年前&#xff0c;大神林纳德托瓦兹&#xff0c;在赫尔辛基大学实验室里&#xff0c;开发出了第一个版本的…

[SDOI2016]排列计数 (错排数概念 + 递推公式【附带证明】)

辛勤二更题目题解错排数概念错排数递推公式及其证明代码实现这种题做的时候&#xff1a; 做完后&#xff1a;正常这就是生活&#xff0c;我们要学会习惯 题目 求有多少种长度为 n 的序列 A&#xff0c;满足以下条件&#xff1a; 1 ~ n 这 n 个数在序列中各出现了一次 若第 i …

长链剖分

将较长的链剖出来。 先来一道模板题 注意&#xff01;&#xff01;&#xff01; 【指针版长链剖分】循环遍历儿子们的答案时&#xff0c; for(int j0;j<len[ver[i]];j)... 而不是(因为申请了长度为 \(len\) 的数组&#xff01;&#xff01;) for(int j0;j<len[ver[i]];j)…