2019-7-25 考试总结
A. 匹配
考试代码($WA18$)
![](/assets/blank.gif)
![](/assets/blank.gif)
#include<algorithm> #include<iostream> #include<cstring> #include<string> #include<cstdio> #define max(x,y) ((x)>(y)?(x):(y)) #define Maxn 100050 #define INF 0x7fffff #define k1 10007 #define k2 109 #define mod1 1000000007 #define mod2 1000000009 #define Reg register using namespace std; int la,lb,t; char B[Maxn]; long long lss1,lss2,has11[Maxn],has12[Maxn],has21[Maxn],has22[Maxn],pow1[Maxn],pow2[Maxn]; int main() {scanf("%d",&t);while(t--){has11[0]=has12[0]=has21[0]=has22[0]=0;scanf("%d%d",&la,&lb);string S,K; cin>>S;for(Reg int i=1,x;i<=min(lb+1,la);++i){x=S[i-1];has11[i]=(has11[i-1]*k1+x-'a'+1)%mod1;has12[i]=(has12[i-1]*k2+x-'a'+1)%mod2;B[i]=x;}cin>>K;for(Reg int i=0;i<3;++i){if(K[i]>='a'&&K[i]<='z'){B[++lb]=K[i];break;}}pow1[0]=pow2[0]=1;for(Reg int i=1;i<=lb;++i){has21[i]=(has21[i-1]*k1+B[i]-'a'+1)%mod1;has22[i]=(has22[i-1]*k2+B[i]-'a'+1)%mod2;pow1[i]=pow1[i-1]*k1%mod1;pow2[i]=pow2[i-1]*k2%mod2;}int ans=0;for(Reg int i=lb;i>=1;--i){lss1=(has21[lb]-has21[i]*pow1[lb-i]%mod1+mod1)%mod1;lss2=(has22[lb]-has22[i]*pow2[lb-i]%mod2+mod2)%mod2;if(lss1==has11[lb-i]&&lss2==has12[lb-i]) ans=max(ans,lb-i);}printf("%d\n",ans);}return 0; }
View Code
$AC$代码
![](/assets/blank.gif)
![](/assets/blank.gif)
#include<algorithm> #include<iostream> #include<cstring> #include<string> #include<cstdio> #define max(x,y) ((x)>(y)?(x):(y)) #define Maxn 100050 #define INF 0x7fffff #define k1 10007 #define k2 109 #define mod1 1000000007 #define mod2 1000000009 #define Reg register using namespace std; int la,lb,t; char B[Maxn]; long long lss1,lss2,has11[Maxn],has12[Maxn],has21[Maxn],has22[Maxn],pow1[Maxn],pow2[Maxn]; int main() {scanf("%d",&t);while(t--){has11[0]=has12[0]=has21[0]=has22[0]=0;scanf("%d%d",&la,&lb);string S,K; cin>>S;for(Reg int i=1,x;i<=min(lb+1,la);++i){x=S[i-1];has11[i]=(has11[i-1]*k1+x-'a'+1)%mod1;has12[i]=(has12[i-1]*k2+x-'a'+1)%mod2;B[i]=x;}cin>>K;for(Reg int i=0;i<3;++i){if(K[i]>='a'&&K[i]<='z'){B[++lb]=K[i];break;}}pow1[0]=pow2[0]=1;for(Reg int i=1;i<=lb;++i){has21[i]=(has21[i-1]*k1+B[i]-'a'+1)%mod1;has22[i]=(has22[i-1]*k2+B[i]-'a'+1)%mod2;pow1[i]=pow1[i-1]*k1%mod1;pow2[i]=pow2[i-1]*k2%mod2;}int ans=0;for(Reg int i=lb;i>=0;--i){lss1=(has21[lb]-has21[i]*pow1[lb-i]%mod1+mod1)%mod1;lss2=(has22[lb]-has22[i]*pow2[lb-i]%mod2+mod2)%mod2;if(lss1==has11[lb-i]&&lss2==has12[lb-i]) ans=max(ans,lb-i);}printf("%d\n",ans);}return 0; }
View Code
低错总结:
枚举不够。。从$l_b$枚举到了$1$,结果$WA18$,
然后考试后把$1$改成了$0$,然后过了。
B. 回家
考试代码($WA 20$)
![](/assets/blank.gif)
![](/assets/blank.gif)
#include<iostream> #include<cstring> #include<cstdio> #include<vector> #include<map> #define min(x,y) ((x)<(y)?(x):(y)) #define Maxn 200050 #define Reg register using namespace std; int biao[Maxn]; int t,n,m,tot,top,ans,ok,fir[Maxn],fic[Maxn],vis[Maxn]; int root,indx,cnt,dfn[Maxn],low[Maxn],cur[Maxn],stack[Maxn],pos[Maxn],num[Maxn]; struct Tu {int st,ed,next;} lian[Maxn*2],liap[Maxn*2]; vector<vector<int> > dcc(Maxn/10); void add(int x,int y) {lian[++tot].st=x;lian[tot].ed=y;lian[tot].next=fir[x];fir[x]=tot;return; } void adp(int x,int y) {liap[++top].st=x;liap[top].ed=y;liap[top].next=fic[x];fic[x]=top;return; } void tarjan(int x,int fat) {dfn[x]=low[x]=++indx;if(x==root&&!fir[x]) {dcc[++cnt].push_back(x); return;}stack[++stack[0]]=x;int flag=0;for(Reg int i=fir[x];i;i=lian[i].next){if(!dfn[lian[i].ed]){tarjan(lian[i].ed,x);low[x]=min(low[x],low[lian[i].ed]);if(low[lian[i].ed]>=dfn[x]){++flag;if(flag>0||x!=root) cur[x]=1;++cnt;while(stack[stack[0]]!=lian[i].ed)dcc[cnt].push_back(stack[stack[0]--]);dcc[cnt].push_back(stack[stack[0]--]);dcc[cnt].push_back(x);}}else if(lian[i].ed!=fat)low[x]=min(low[x],dfn[lian[i].ed]);}return; } void dfs(int x) {vis[x]=1;if(x==pos[n]) {ok=1; return;}if(ok) return;for(Reg int i=fic[x];i;i=liap[i].next){if(!vis[liap[i].ed]){if(biao[liap[i].ed]) stack[++stack[0]]=biao[liap[i].ed];dfs(liap[i].ed);if(!ok) --stack[0];else return;}}return; } void init() {tot=top=ans=ok=root=indx=cnt=stack[0]=0;for(Reg int x=1;x<=n;++x){biao[x]=fir[x]=fic[x]=cur[x]=vis[x]=dfn[x]=low[x]=pos[x]=num[x]=0;if(x<Maxn) dcc[x].clear();}return; } int main() {scanf("%d",&t);while(t--){scanf("%d%d",&n,&m);init();for(Reg int i=1,x,y;i<=m;++i){scanf("%d%d",&x,&y);add(x,y); add(y,x);}for(Reg int i=1;i<=n;++i)if(!dfn[i]) root=i,tarjan(i,i);int num=cnt;for(Reg int i=1;i<=n;++i) if(cur[i]) pos[i]=++num,biao[num]=i;for(Reg int i=1,l;i<=cnt;++i){l=dcc[i].size();for(Reg int j=0,x;j<l;++j){x=dcc[i][j];if(cur[x]) {adp(pos[x],i); adp(i,pos[x]);}else pos[x]=i;}}cnt=num; stack[0]=0;dfs(pos[1]);memset(vis,0,sizeof(vis)); ans=0;for(Reg int i=1;i<=stack[0];++i){if(!vis[stack[i]]&&stack[i]!=n&&stack[i]!=1){++ans;vis[stack[i]]=1;}}printf("%d\n",ans);for(Reg int i=1;i<=n;++i) if(vis[i]) printf("%d ",i);printf("\n");}return 0; }
View Code
$AC$代码
![](/assets/blank.gif)
![](/assets/blank.gif)
#include<iostream> #include<cstring> #include<cstdio> #include<vector> #define min(x,y) ((x)<(y)?(x):(y)) #define Maxn 200050 #define Reg register using namespace std; int biao[Maxn*5]; int t,n,m,tot,top,ans,ok,fir[Maxn*5],fic[Maxn*5],vis[Maxn*5]; int root,indx,cnt,dfn[Maxn*5],low[Maxn*5],cur[Maxn],stack[Maxn*5],pos[Maxn*5]; struct Tu {int st,ed,next;} lian[Maxn*8],liap[Maxn*8]; vector<vector<int> > dcc(Maxn); void add(int x,int y) {lian[++tot].st=x;lian[tot].ed=y;lian[tot].next=fir[x];fir[x]=tot;return; } void adp(int x,int y) {liap[++top].st=x;liap[top].ed=y;liap[top].next=fic[x];fic[x]=top;return; } void tarjan(int x) {dfn[x]=low[x]=++indx;stack[++stack[0]]=x;if(x==root&&!fir[x]) {dcc[++cnt].push_back(x); return;}int flag=0;for(Reg int i=fir[x];i;i=lian[i].next){if(!dfn[lian[i].ed]){tarjan(lian[i].ed);low[x]=min(low[x],low[lian[i].ed]);if(low[lian[i].ed]>=dfn[x]){++flag; if(flag>0||x!=root) cur[x]=1;++cnt;while(stack[stack[0]]!=lian[i].ed)dcc[cnt].push_back(stack[stack[0]--]);dcc[cnt].push_back(stack[stack[0]--]);dcc[cnt].push_back(x);}}else low[x]=min(low[x],dfn[lian[i].ed]);}return; } void dfs(int x) {vis[x]=1;if(x==pos[n]) {ok=1; return;}if(ok) return;for(Reg int i=fic[x];i;i=liap[i].next){if(!vis[liap[i].ed]){if(biao[liap[i].ed]) stack[++stack[0]]=biao[liap[i].ed];dfs(liap[i].ed);if(biao[liap[i].ed]&&!ok) --stack[0];if(ok) return;}}return; } void init() {tot=top=ans=ok=root=indx=cnt=stack[0]=0;for(Reg int x=0;x<=n*2;++x)biao[x]=fir[x]=fic[x]=cur[x]=vis[x]=dfn[x]=low[x]=pos[x]=0;return; } int main() {scanf("%d",&t);while(t--){scanf("%d%d",&n,&m);init();for(Reg int i=1,x,y;i<=m;++i){scanf("%d%d",&x,&y);add(x,y); add(y,x);}for(Reg int i=1;i<=n;++i)if(!dfn[i]) root=i,tarjan(i);int num=cnt;for(Reg int i=1;i<=n;++i) if(cur[i]) {pos[i]=++num; biao[num]=i;}for(Reg int i=1,l;i<=cnt;++i){l=dcc[i].size();for(Reg int j=0,x;j<l;++j){x=dcc[i][j];if(cur[x]) {adp(pos[x],i); adp(i,pos[x]);}else pos[x]=i;}dcc[i].clear();} // cout<<endl; // for(Reg int i=1;i<=n;++i) cout<<pos[i]<<' '; // cout<<endl;cnt=num; stack[0]=0; ok=0;dfs(pos[1]);memset(vis,0,sizeof(vis)); ans=0;for(Reg int i=1;i<=stack[0];++i){if(!vis[stack[i]]&&stack[i]!=n&&stack[i]!=1){++ans;vis[stack[i]]=1;}}printf("%d\n",ans);for(Reg int i=1;i<=n;++i) if(vis[i]) printf("%d ",i);printf("\n");}return 0; }
View Code
低错总结:
1、数组没开够。
2、板子不熟练,考试调$Tarjan$调了半小时,然后最后还没打对。
$Tarjan$找割点的板子
void tarjan(int x) {dfn[x]=low[x]=++indx;stack[++stack[0]]=x;if(x==root&&!fir[x]) {dcc[++cnt].push_back(x); return;}int flag=0;for(Reg int i=fir[x];i;i=lian[i].next){if(!dfn[lian[i].ed]){tarjan(lian[i].ed);low[x]=min(low[x],low[lian[i].ed]);if(low[lian[i].ed]>=dfn[x]){++flag; if(flag>1||x!=root) cur[x]=1;++cnt;while(stack[stack[0]]!=lian[i].ed)dcc[cnt].push_back(stack[stack[0]--]);dcc[cnt].push_back(stack[stack[0]--]);dcc[cnt].push_back(x);}}else low[x]=min(low[x],dfn[lian[i].ed]);}return; }
考试时码的:
void tarjan(int x,int fat) {dfn[x]=low[x]=++indx;if(x==root&&!fir[x]) {dcc[++cnt].push_back(x); return;}stack[++stack[0]]=x;int flag=0;for(Reg int i=fir[x];i;i=lian[i].next){if(!dfn[lian[i].ed]){tarjan(lian[i].ed,x);low[x]=min(low[x],low[lian[i].ed]);if(low[lian[i].ed]>=dfn[x]){++flag;if(flag>0||x!=root) cur[x]=1;++cnt;while(stack[stack[0]]!=lian[i].ed)dcc[cnt].push_back(stack[stack[0]--]);dcc[cnt].push_back(stack[stack[0]--]);dcc[cnt].push_back(x);}}else if(lian[i].ed!=fat)low[x]=min(low[x],dfn[lian[i].ed]);}return; }
3、
void dfs(int x) {vis[x]=1;if(x==pos[n]) {ok=1; return;}if(ok) return;for(Reg int i=fic[x];i;i=liap[i].next){if(!vis[liap[i].ed]){if(biao[liap[i].ed]) stack[++stack[0]]=biao[liap[i].ed];dfs(liap[i].ed);if(!ok) --stack[0];else return;}}return; }
这个地方的弹栈弹过了,出现负数。。
改了一点:
if(biao[liap[i].ed]&&!ok) --stack[0]; if(ok) return;
然后过了。。
C. 寿司
$O(n^2)$的算法:
预处理出$sum[i]$表示$i$节点之前$1$的个数。
枚举区间和断点,
对于区间$[L,R]$,假设断点是$Mid$,
那么$Mid$左侧的$1$都应该移到最左端,右侧的$1$都应该移到最右端,
那么左侧需要移动的步数就是$W_1=\sum \limits_{i=L,num[i]=1}^{Mid} i-(L+sum[i]-sum[L]-1)$
右侧需要移动的步数就是$W_2=\sum \limits_{i=Mid+1,num[i]=1}^{R} R-sum[R]+sum[i-1]+1-i$
现在复杂度是$O(n^3)$,
然后化简一下就可以发现可以用前缀和。
最后就是$O(n^2)$的复杂度。
$O(n)$的算法:
决策单调性。。
当区间右移的时候,最优断点不可能左移。
至于证明:
有一个数学的方法,有点麻烦。
在$n^2$的算法中我们能够化出一个式子:
另$clac[i]$表示在当前状态中$i$点的最优步数,
那么$clac[i]= K\times sum[i] +sum1[i] -sum2[i]+P$,
其中
$sum1[i]=\sum \limits_{j=1}^{i} (j-sum[j])$
$sum2[i]=\sum \limits_{j=1}^{i} (sum[j-1]-j)$
$P=sum2[R]-sum1[L-1]+(R-sum[R]+1)\times sum[R]-(sum[L-1]-L+1)\times sum[L-1]$
$K=sum[L-1]+sum[R]-(L+R)$。
令在区间$[L,R]$中断点为$mid$时最优,
那么肯定在$[L,R]$中$clac[mid]<=clac[mid-1]$,
也就是:
$K\times sum[mid-1]+sum1[mid-1]-sum2[mid-1]+P>=K\times sum[mid] +sum[mid]-sum2[mid]+P$
再移个项:
$(K-1)\times num[mid]-2\times sum[mid]+2\times mid<=0$ ---------(*),
我们要证明在区间$[L+1,R+1]$中仍然满足这个性质:
接下来这个$P$可以消掉,不管它,看$K$。
当$L++,R++$时,
$K'=sum[L]+sum[R+1]-(L+R)-2$,
$K'=sum[L-1]+sum[R]-(L+R)-2+num[L]+num[R+1]$,
显然这个$K'<=K$,那么上边的(*)式子仍然满足。
所以就得出来了。
丑陋的代码:
![](/assets/blank.gif)
![](/assets/blank.gif)
#include<iostream> #include<cstring> #include<cstdio> #define min(x,y) ((x)<(y)?(x):(y)) #define int long long #define INF 0x7fffffffffffff #define Maxn 4000050 #define Reg register using namespace std; int t,n,P,K,mid,ans,L,R; int sum[Maxn],sum1[Maxn],sum2[Maxn],num[Maxn]; char A[Maxn]; int clac(int x) {return K*sum[x]+sum1[x]-sum2[x]+P;} signed main() {scanf("%lld",&t);while(t--){ans=INF;scanf("%s",A);n=strlen(A);sum[0]=sum1[0]=sum2[0]=0;for(Reg int i=1;i<=n;++i){sum[i]=sum[i-1];sum1[i]=sum1[i-1];sum2[i]=sum2[i-1];if(A[i-1]=='R'){++sum[i]; num[i]=1;sum1[i]+=i-sum[i];sum2[i]+=sum[i-1]-i;}else num[i]=0;}for(Reg int i=n+1;i<=2*n;++i){num[i]=num[i-n];sum[i]=sum[i-1];sum1[i]=sum1[i-1];sum2[i]=sum2[i-1];if(num[i]==1){++sum[i];sum1[i]+=i-sum[i];sum2[i]+=sum[i-1]-i;}}L=1,R=n;P=sum2[R]-sum1[L-1]+(R-sum[R]+1)*sum[R]-(sum[L-1]-L+1)*sum[L-1];K=sum[L-1]-L+1-R+sum[R]-1;mid=0;for(Reg int i=1;i<=n;++i) //枚举左端点 {L=i,R=i+n-1;P=sum2[R]-sum1[L-1]+(R-sum[R]+1)*sum[R]-(sum[L-1]-L+1)*sum[L-1];K=sum[L-1]-L+1-R+sum[R]-1;ans=min(ans,clac(mid));while(mid+1<=R&&clac(mid+1)<=clac(mid)) //决策单调性处理 {ans=min(ans,clac(mid+1));++mid;}}printf("%lld\n",ans);}return 0; }
View Code
当然也有更简单的证法:
$wd$大神题解,传送门
总结:
$T1$第一眼看是$KMP$,然后不会打。。。
打了一个$Hash$,然后$WA18$。
觉得自己之前打的是个假的$Hash$,
$T2$基本上是个$Tarjan$的板子,然后$WA20$,
这次$T1$和$T2$基本上都是送分题,然后就爆炸了。
板子不会,代码能力差,低错。。。。
然后最后$18+20+0=38$,
没什么水平。。。
最后忠告:
$AC$一道题需要$100+$行的代码,然而从$AC$到$WA$仅仅需要$1$个字符。
所以一定要打对拍。。
转载于:https://www.cnblogs.com/Milk-Feng/p/11243805.html
2019-7-25 考试总结相关推荐
- 2019.5.25考试总结
题目 T1 食物中毒 [外链图片转存失败(img-W8VPYSyZ-1563335998340)(http://10.37.2.111/upload/image/20190525/2019052515 ...
- 广播计算机应用基础,2019年秋季考试《计算机应用基础》在线考核试题 广播幻灯片操作应选择的功能区是...
2019年秋季考试<计算机应用基础>在线考核试题 广播幻灯片操作应选择的功能区是 (12页) 本资源提供全文预览,点击全文预览即可全文预览,如果喜欢文档就下载吧,查找使用更方便哦! 14. ...
- 中国大学MOOC-陈越、何钦铭-数据结构-2019夏期末考试(含答案)
中国大学MOOC-陈越.何钦铭-数据结构-2019夏期末考试(含答案) 判断题 1-1 对N个不同的数据采用冒泡排序进行从大到小的排序,当元素基本有序时交换元素次数肯定最多. (2分) 1-2 ...
- 天大计算机应用基础试题答案,天大2019年秋季考试《计算机应用基础》在线考核试题100分答案...
2019年秋季考试<计算机应用基础>在线考核试题 共题,总分:100分 时间:57分24秒 答题中 分 一.单选题共50题,100分 1 2分 在Windows中使用Ait+Tab键的作用 ...
- ap计算机科学a 5分,新鲜出炉2019年AP考试5分率分析,尝鲜版来啦~~
原标题:新鲜出炉2019年AP考试5分率分析,尝鲜版来啦~~ 近日,Colleage board 官方的twitter ,陆续公布了2019年度部分AP科目的5分率及考试情况.7-8月CB官方会更新所 ...
- 2019年秋季计算机应用基础,天大2019年秋季考试《计算机应用基础》在线考核试题【满分答案】...
2019年秋季考试<计算机应用基础>在线考核试题-0064 试卷总分:100 得分:100 一.单选题 (共 50 道试题,共 100 分) 1.运算器.控制器和寄存器组成了微机的( ) ...
- 微型计算机互联的主要目的,2019年自学考试计算机应用基础试题(5)
2019年4月自考报名已经拉开序幕,同学们可以开始准备自考复习,下面是2019年自学考试计算机应用基础试题(5),了解更多自学考试资讯请锁定自学考试网,更有海量模拟试题,精品复习资料等你来体验! 1填 ...
- 使用计算机打印汉字文档是汉字答案,天大2019年秋季考试《计算机应用基础》在线考核试题【满分答案】...
2019年秋季考试<计算机应用基础>在线考核试题-0064 试卷总分:100 得分:100 一.单选题 (共 50 道试题,共 100 分) 1.运算器.控制器和寄存器组成了微机的( ) ...
- 国家电网计算机考试分值,2019国家电网考试考什么题型?分值多少?范围是什么?...
原标题:2019国家电网考试考什么题型?分值多少?范围是什么? 国网电气考情: 一.单选:100题 30道企业文化+能源战略+行测 企业文化+能源战略:行测是1:1 行测包含:1道病句,1道逻辑填空, ...
- 国家电网职称计算机考试分值,2019国家电网考试题型、分值和范围
原标题:2019国家电网考试题型.分值和范围 国网电气考情: 一.单选:100题 30道企业文化+能源战略+行测 企业文化+能源战略:行测是1:1 行测包含:1道病句,1道逻辑填空,1道阅读,1道数字 ...
最新文章
- centos运行jar包需要的环境_Centos7服务器下启动jar包项目的最佳方法
- 模拟linux磁盘满,linux 磁盘满了简单处理一下
- 关于Unity中自带摇杆与车轮碰撞器的使用
- 核逼近(Kernel Approximation)
- boost::mp11::mp_inherit相关用法的测试程序
- 微信小程序的不同函数调用的几种方法
- mvn 修改所有子项目pom版本
- shell终端行首行尾命令介绍
- 百度题库西安交大程序C语言,程序设计基础试题(西安交大).doc
- H5页面,华为手机打开不加载JS的问题
- ubuntu搜狗输入法显示简体中文,输入却是繁体中文解决方案
- 爬虫 -- 简单封装
- php 查询数据传值,php-如何在Laravel中传递数据进行查看?
- abp过滤规则android,ABP的数据过滤器(Data Filters)
- VANT3无法使用slot引用外部icont
- c语言指针数组分配内存,指针数组数组指针的分配内存及函数参数 C语言版
- 唐发德老师:精益生产管理导师(唐发德)
- VMware下载及安装(附带下载地址)
- AndroidStudio制作欢迎界面与应用图标,使用Android Studio 3.0.1作为开发工具
- matlab对矩阵自相关,自相关矩阵和互相关矩阵的matlab实现