day1 A:签到题

赛时代码:

/*
A:设n=N+1; 先考虑可以枚举哪条边或者哪个点一个想法是枚举左边的边和底边。左边的边连接底角和上方一点,底边直接枚举(n+1)*n/2 个。(注:枚举指推公式计算那么对于一种长度为a的底边的情况,当且仅当整个长度n为-----突然想到是否可以枚举对应位置的上下两条边。这样的话枚举完长度为a的底边,顶边直接C n取a不就好了。不过这样有些难算。。。对于一个长度为n的格点,直接 C(n,1)*C(n,1)+C(n,n-1)*C(n,n-1)+...+C(n,n)*C(n,n)不会算。。。 ----瞎猜了一个 1*1+2*2+...+n*n 居然两个样例都过了?!???? 严(hu)谨 (luan)证明了一下发现大概是靠谱的。那么看来高精度无法避免了?!? =n*(n+1)*(2n+1)/6好像只能勉强90%??最后一个要写高精度????(大概率不是所以1000000000*1000000001*2000000001/6= 19:23:后面的提都不会,看上去没啥事了(?),尝试写个高精。
*/
#include<cstdio>
using namespace std;
int a[105],b[105],c[105];
int main()
{//freopen("check.in","r",stdin);//freopen("check.out","w",stdout); //printf("%lld\n",1000000001*2000000001); long long n;scanf("%lld",&n);if(n==1000000000){printf("333333333833333333500000000\n");return 0;} //long long ans=0;/*for(int i=1;i<=n;i++){ans+=i*i;}*/
//  if(n<=1000000)
//  {printf("%lld\n",n*(n+1)*(2*n+1)/6);return 0;return 0;
}

赛后订正:

#include<cstdio>
using namespace std;
long long s[105],x[105],y[105];
int main()
{long long n;scanf("%lld",&n);long long a=n,b=n+1,c=2*n+1;if(a%2==1){b=b/2;}else{a=a/2;}if(a%3==0){a=a/3;}elseif(a%3==2){b=b/3;}else{c/=3;}long long d=a*b;int cnt1=0,cnt2=0;while(d){x[cnt1++]=d%10;d/=10;}while(c){y[cnt2++]=c%10;c/=10;}for(int i=0;i<cnt1;i++){int tag=0;for(int j=0;j<cnt2;j++){s[i+j]+=x[i]*y[j]+tag;tag=s[i+j]/10;//把i+j位置多出来的位进位 s[i+j]%=10;}int tmp=i+cnt2;while(tag){s[tmp]+=tag;tag=s[tmp]/10;s[tmp]%=10;tmp++;} }int w=100;while(s[w]==0){w--;}for(int i=w;i>=0;i--){printf("%lld",s[i]);}printf("\n");return 0;
}

总结:

赛时胡乱猜想一波后把规律想了出来,试了样例对了后突然发现貌似必须高精才能 90−>10090->10090−>100,一直以为联赛不考这种算法就不怎么熟练,果然考场上写了 30min30min30min 还是没什么用,于是挣扎着手算了 10910^9109 的数据后就开其他题了,赛后看了看高精的代码发现并没有很复杂,写了写终于会了。

day1 B:染色

赛时代码:

/*
B:C(36,18)=453756765C(20,10)=184756 50%或可暴力枚举判断 先把这个部分分给写了 -----发现一种类似于子串内部先找一波回文再某种组合?暴力初步完成:答案都对了,但跑起来挺慢的。甚至50% 的数据都有些悬。 文件输入了一下1.3s????凉了凉了 先去搞C
*/
#include<cstdio>
#include<map>
#include<iostream>
using namespace std;
char s[30];
map<char,int>mp;
map<int,int>mp0;
int n;
int a[30];//一个用来枚举排列的数组
int vis[30];//记录是否访问过
int sum;
int b[30];
int ans;
void dfs(int cnt)
{if(cnt>=n)//差不多这里面就是枚举成功的组合的情况了 {//for(int i=1;i<=40;i++)mp0[i]=0; mp0.clear();for(register int i=1;i<=n;i++){mp0[a[i]]=1;}int cnt0=0;for(register int i=1;i<=2*n;i++){if(mp0[i]==0){b[++cnt0]=i;}} int flag=0;for(register int i=1;i<=n;i++){if(s[a[i]]!=s[b[n-i+1]]){flag=1;break;}}if(flag==0)ans++;/*for(int i=1;i<=n;i++){printf("%d ",a[i]);}printf("\n");*///sum++; return ;}for(register int i=1;i<=2*n;i++){if(vis[i]==0&&a[cnt]<i){a[cnt+1]=i;//这里应当使用cnt+1,如果误用为++cnt则会导致for中的cnt无限增加 //printf("%d %d\n",cnt,a[cnt]);vis[i]=1;dfs(cnt+1);vis[i]=0;}}
}
int main()
{freopen("color.in","r",stdin);freopen("color.out","w",stdout);scanf("%d\n",&n);int flag=0;for(int i=1;i<=2*n;i++){scanf("%c",&s[i]);mp[s[i]]++;if(s[i]!=s[i-1]&&i!=1){flag=1;}}/*if(flag==0)//特殊处理一波字母全都相等的情况 {printf("%lld\n",) }*/for(char i='a';i<='z';i++)//如果某种字母是奇数个那么显然一个也构不成罢? {if(mp[i]%2==1){printf("0\n");return 0;} }dfs(0);//printf("sum=%d\n",sum);printf("%d\n",ans);return 0;
}

赛后订正:

#include<cstdio>
#include<map>
using namespace std;
int col[105];
unsigned long long has[105];
map<unsigned long long,int>f[50];
char s[105];
long long ans;
int n;
void check(int tag)
{unsigned long long x=0,y=0;int cnt=0,cnt1=n;for(int i=1;i<=n;i++){if(col[i]>0){x+=(unsigned long long)col[i]*has[cnt];cnt++;}else{y+=(unsigned long long)col[i]*has[cnt1];cnt1--;}}if(tag==1){ans+=f[cnt][x+y];}else{f[cnt1][x+y]++;}
}
void dfs1(int x)
{if(x>n){check(0);return ;}col[x]=s[x]-'a'+1;dfs1(x+1);col[x]=-col[x];dfs1(x+1);
}
void dfs2(int x)
{if(x<=n){check(1);return ;}int tmp=2*n-x+1; col[tmp]=s[x]-'a'+1;//s[x]!!!!!!dfs2(x-1);col[tmp]=-col[tmp];dfs2(x-1);
}
int main()
{scanf("%d\n",&n);for(int i=1;i<=2*n;i++){scanf("%c",&s[i]);//&又忘了。。。 }has[0]=1;for(int i=1;i<=n;i++){has[i]=has[i-1]*331;}dfs1(1);dfs2(2*n);printf("%lld\n",ans);return 0;
}

总结:

赛时不出所料的没做出B题,没想到折半搜索这个算法,所以尽全力打了个 50pts50pts50pts,赛后发现拿到了这部分分,所以对暴力还算满意。赛后学了折半搜索后发现这东西确实好用。然后判字符串的时候直接hash也是很好的技巧。

day1 C:数数

赛时代码:

输出了 000,并拿到了 10pts10pts10pts。。。

赛后订正:

#include<cstdio>
#include<vector>
#include<map>
#include<algorithm>
#include<cmath>
using namespace std;
long long mod=998244353;
map<pair<long long,long long>,long long>id;
struct edge
{long long v,w,val;
};
vector<edge>e[1000010];
long long x[1000055],y[1000055],u[1000055],v[1000055],deg[1000055],now,vis[1000055],g[1000055];
bool check(long long a,long long b,long long c)
{long long xa=x[a],ya=y[a],xb=x[b],yb=y[b],xc=x[c],yc=c[y];long long vx1=x[b]-x[a],vy1=y[b]-y[a],vx2=x[c]-x[a],vy2=y[c]-y[a],vx3=x[c]-x[b],vy3=y[c]-y[b];if(vx1*vx2+vy1*vy2<=0)return 0;if(vx1*vx3+vy1*vy3>=0)return 0;if(vx2*vx3+vy2*vy3<=0)return 0;return 1;
}
long long gcd(long long a,long long b){return b==0?a:gcd(b,a%b);}
long long calc(long long a,long long b,long long c)
{long long xa=x[a],ya=y[a],xb=x[b],yb=y[b],xc=x[c],yc=c[y];long long maxy=max(max(ya,yb),yc),miny=min(min(ya,yb),yc);long long maxx=max(max(xa,xb),xc),minx=min(min(xa,xb),xc);long long vx1=x[b]-x[a],vy1=y[b]-y[a],vx2=x[c]-x[a],vy2=y[c]-y[a],vx3=x[c]-x[b],vy3=y[c]-y[b];vx1=abs(vx1);vx2=abs(vx2);vx3=abs(vx3);vy1=abs(vy1);vy2=abs(vy2);vy3=abs(vy3);long long s=2*(maxx-minx)*(maxy-miny)-vx1*vy1-vx2*vy2-vx3*vy3;return s;
}
int main()
{long long n;scanf("%lld",&n);long long xa,ya,xb,yb;for(long long i=1;i<=n;i++){scanf("%lld%lld%lld%lld",&xa,&ya,&xb,&yb);pair<long long,long long>a=make_pair(xa,ya),b=make_pair(xb,yb);if(!id[a])id[a]=++now,x[now]=xa,y[now]=ya;if(!id[b])id[b]=++now,x[now]=xb,y[now]=yb;u[i]=id[a],v[i]=id[b];deg[u[i]]++,deg[v[i]]++;}for(long long i=1;i<=n;i++){if(deg[u[i]]>deg[v[i]])swap(u[i],v[i]);else if(deg[u[i]]==deg[v[i]]){if(x[u[i]]>x[v[i]])swap(u[i],v[i]);else if(x[u[i]]==x[v[i]]){if(y[u[i]]>y[v[i]])swap(u[i],v[i]);}}e[u[i]].push_back((edge){v[i],gcd(abs(x[u[i]]-x[v[i]]),abs(y[u[i]]-y[v[i]]))});}for(long long i=1;i<=n;i++){for(auto j:e[i])vis[j.v]++;for(auto &j:e[i]){j.val=vis[j.v];vis[j.v]=0;}}long long cnt=0;long long ans=0;for(long long i=1;i<=now;i++){for(auto j:e[i])vis[j.v]++,g[j.v]=gcd(abs(x[i]-x[j.v]),abs(y[i]-y[j.v]));for(auto j:e[i]){if(!j.val)continue;for(auto k:e[j.v]){if(!k.val)continue;if(vis[k.v]){if(check(i,j.v,k.v)){ans+=((calc(i,j.v,k.v)-g[j.v]-g[k.v]-k.w+2)/2)%mod*vis[k.v]%mod*j.val%mod*k.val,ans%=mod;}}}}for(auto j:e[i])vis[j.v]--;}printf("%lld\n",ans);return 0;
}

赛时一看到要求三角形内的整点的数量就挺懵,赛后一查是个pick定理。发现这是一个挺有用的tip就学了一下。然后在找三角形时,连着找三条边肯定超时,那么稍微简化一下可以找两条边,剩下一条存好等着用就行,但还是T。所以又get了一个新科技:三元环计数。时间复杂度是线性×log级别的,所以并不会超时。

day2 A:捕梦网

赛时代码:

/*A:zxscs?弄完个最小生成树之后再加个最短的边是不是就可以了。 18:08:大小样例都过了,可能是对的。先mark,回头再想。 18:52:自边算环? 那这样感觉这code是不是假了。。。
*/
#include<cstdio>
#include<algorithm>
using namespace std;
struct ben
{long long x,y,v;
}a[500005];
long long cmp(const ben &a,const ben &b)
{return a.v<b.v;
}
long long fa[100005];
long long tag[500005];
long long find(long long x)
{if(x!=fa[x])fa[x]=find(fa[x]);return fa[x];
}
int main()
{freopen("dream.in","r",stdin);freopen("dream.out","w",stdout);int n,m;scanf("%d%d",&n,&m);for(int i=1;i<=n;i++){fa[i]=i;}for(int i=1;i<=m;i++){scanf("%lld%lld%lld",&a[i].x,&a[i].y,&a[i].v);}sort(a+1,a+m+1,cmp);long long ans=0;long long cnt=0;for(int i=1;i<=m;i++){long long u=a[i].x;long long v=a[i].y;long long fu=find(u);long long fv=find(v);if(fu!=fv){ans+=a[i].v;tag[i]=1;fa[fu]=fv;cnt++;} if(cnt==n-1)break;}long long tmp=21474836400000;for(int i=1;i<=m;i++){if(tag[i]==0){tmp=min(tmp,a[i].v);}}printf("%lld\n",ans+tmp);return 0;
}

总结:

比赛时上来就想到用最小生成树,然后贪心的再取且仅取一条权值最小的边。这样的答案就是最优的。观察到会有重边自环一类,不知道有什么深意。因为我在贪心的找最后一条边时是从头开始枚举第一条没选过的(sort过的序列)。发现其他dalao有的直接取了下一条就错了。所以以后这种重边和自环的问题一定要谨慎。

day2 B:跑路

day2 C:跳跃

赛时代码:

输出了个 `-1`。。。

赛后订正:

#include<cstdio>
#include<cstring>
using namespace std;
long long dp[500055][3],qaq[500055];
long long min(long long x,long long y)
{if(x<y)return x;return y;
}
int main()
{int n,m;scanf("%d%d",&n,&m);for(int i=1;i<=n;i++){dp[i][0]=dp[i][1]=10000000000000007;qaq[i]=-1;}int p,v;for(int i=1;i<=m;i++){scanf("%d%d",&p,&v);qaq[p]=v;}for(int i=2;i<n;i++){if(qaq[i-1]==-1&&qaq[i]==-1){printf("-1\n");return 0;}}long long ans=0; for(int l=1,r;l<n;l=r){r=l;while(qaq[r]!=-1&&r<=n) {r++;}r++;dp[l][0]=0;dp[l][1]=10000000000000007;for(int i=l;i<=r;i++){if(i+1<=r)//跳一步 {dp[i+1][0]=min(dp[i+1][0],dp[i][0]+1ll);dp[i+1][1]=min(dp[i+1][1],dp[i][1]+1ll);}if(i+2<=r)//跳两步 {dp[i+2][1]=min(dp[i+2][1],min(dp[i][0],dp[i][1])+qaq[i]);}}ans+=dp[r][1];}printf("%lld\n",ans);return 0;
}

总结:

本来把问题想象成了

删去一张图中若干条联通了 111 和 nnn 的边,使得边权之和最小且剩下的图仍然联通。

结果发现不太可做。

然后发现其实是一道 dp。

第一周校内OI模拟赛总结(day1day2)相关推荐

  1. XMUT第七届蓝桥杯全国软件和信息技术专业人才大赛校内选拔赛模拟赛

    Problem A:八目鳗烧烤店 Time Limit:1000MS  Memory Limit:65536K Total Submit:75 Accepted:26 Description 八目鳗烧 ...

  2. PKUSC 模拟赛 day1 下午总结

    下午到了机房之后又困又饿,还要被强行摁着看英文题,简直差评 第一题是NOIP模拟赛的原题,随便模拟就好啦 本人模拟功力太渣不小心打错了个变量,居然调了40多分钟QAQ #include<cstd ...

  3. 第十四届蓝桥杯校内模拟赛第一期——Python

    第十四届蓝桥杯校内模拟赛第一期--Python 文章目录 第十四届蓝桥杯校内模拟赛第一期--Python 1.二进制位数 问题描述 参考答案 扩展 2. 晨跑 问题描述 参考答案 扩展 3. 调和级数 ...

  4. 2022 第十四届蓝桥杯模拟赛第一期(题解与标程)

    第十四届蓝桥杯模拟赛第一期 1. 二进制位数 问题描述 答案提交 参考答案 2. 晨跑 问题描述 答案提交 参考答案 3. 调和级数 问题描述 答案提交 参考答案 程序验证 4. 山谷 问题描述 答案 ...

  5. 第十四届蓝桥杯第一期模拟赛 python

    第十四届蓝桥杯python第一期模拟赛 文章目录 第十四届蓝桥杯python第一期模拟赛 1. 二进制位数 问题描述 答案提交 思路 参考答案 2. 晨跑 问题描述 答案提交 思路 参考答案 3. 调 ...

  6. 第十四届蓝桥杯模拟赛第一期试题【Java解析】

    目录 A 二进制位数 问题描述 答案提交 参考答案 解析 B 晨跑 问题描述 答案提交 参考答案 解析 C 调和级数 问题描述 答案提交 参考答案 解析 D 山谷 问题描述 答案提交 参考答案 解析 ...

  7. 第十四届蓝桥杯第一期模拟赛试题与题解 C++

    第十四届蓝桥杯第一期模拟赛试题与题解 C++ 试题 A 题解:位运算 试题 B 题解:日历模拟 试题 C 题解:double 求和 试题 D 题解:枚举 试题 E 题解:二维前缀和 试题 F 题解:两 ...

  8. 第十四届蓝桥杯校内模拟赛第二期-Java个人题解(仅供参考)

    刚刚结束第十四届蓝桥杯校内模拟赛第二期,在这记录下自己的代码 不保证正确! 不保证正确! 不保证正确! 有问题一起改正!! 题解 2048 代码: package _14届模拟2;public cla ...

  9. 2021年 第十二届蓝桥杯第二期校内模拟赛题解(Java版)

    时隔多日,终于会写一些简单DP了哈哈哈! 稍微改版,方便阅读,若有错,请指出 2019年 第十届蓝桥杯省赛题解(JavaB组版) 2020年 第十一届蓝桥杯第一场省赛题解(JavaB组版) 2020年 ...

最新文章

  1. python02-条件语句到循环语句
  2. 嵌入式系统自动使能alias
  3. java反射机制知识_Java反射机制讲解,程序员必须掌握的知识点
  4. Ubuntu下在线安装mysql
  5. Oracle12c与Oracle11g采用触发器与存储过程实现同步更新(代码+图解)
  6. Renascence架构原理——最优化算法
  7. android bitmap drawable 互转
  8. 腾讯云成为国内首家FinOps基金会顶级会员
  9. python爬虫源码项目_32个Python爬虫实战项目,满足你的项目慌(带源码)
  10. Simple Web Server
  11. iOS Target-Action模式下内存泄露问题深入探究
  12. 相机模型与标定(十四)--误差分析
  13. slz-servlet的引入
  14. 【tool】构造朴实的测试用例
  15. 80. 删除排序数组中的重复项 II
  16. 2019年最新全国省市区街道共46462条数据(统计局MySQL数据库)
  17. 数的三次方根(二分查找)
  18. 安装Windows系统时进行磁盘格式化及分区等操作
  19. PyTorch深度学习(B站刘二大爷)第九讲作业 Otto Group Product Classification
  20. python乒乓球比赛规则介绍_乒乓球比赛规则简单介绍

热门文章

  1. 起风了数字简谱用计算机,起风了钢琴简谱-数字双手-买辣椒也用券 高橋優
  2. 手机百度浏览器ua标识在哪里_荣耀play浏览器ua标识在哪里
  3. HTML 个人简历模板简易版
  4. docker快速安装可道云
  5. CSM5213SG替代BD00GA3WEFJ-E2 测试参数对比
  6. 【YOLOv5 数据集划分】训练和验证、训练验证和测试(train、val)(train、val、test)
  7. 麒麟系统(Fedora 64)安装谷歌(chrome)浏览器
  8. python tcl tk_安装Python WARNING: The version of Tcl/Tk (8.5.9)
  9. JAVA random 缺陷_Random在高并发下的缺陷以及JUC对其的优化
  10. 基于组态王的过程控制——以巧克力牛奶的生产为例