前言

一整套都是水题(尽管 T4 稍有难度。。

从各位的分数上就可以看出来。。Max 的 T1 打挂了,不然就有人 AK 了。。

感觉还好,最后还有 1h 看了看 T4 ,感觉有一点思路,就瞎 jb 胡了上去,样例一过想都没想直接走了。。

最后发现和正解的复杂度其实差了一个 n ,思路大体上是对的,但是题目有关于 \(b(S)\) 的定义审错了,也不知道要取较大的 k 。。。

比较爽的就是拿下了两个首切(尽管是水题。。

然后在联考的官网上的排名就比较靠后了,大概到了 26 名,不得不说 cqbz 的人们太强了%%%

T1 2A

解题思路

大水题。。大概学过字符串的都能切掉。

我感觉我的做法是比较好写的,无论读入的字符是否合法,我们都把它处理成合法的,然后和原串判断是否相等就好了。

两个字符串判等可以用 string 毕竟我比较懒。。

code

  1. #include<bits/stdc++.h>
  2. #define int long long
  3. #define ull unsigned long long
  4. #define f() cout<<"Failed"<<endl
  5. using namespace std;
  6. bool pd(char ch){return ch>='0'&&ch<='9';}
  7. inline int read()
  8. {
  9. int x=0,f=1;char ch=getchar();
  10. while(!pd(ch)){if(ch=='-')f=-1;ch=getchar();}
  11. while(pd(ch)){x=(x<<1)+(x<<3)+(ch^48);ch=getchar();}
  12. return x*f;
  13. }
  14. const int N=50;
  15. int n,cnt,tot,top,sta[N],s[N];
  16. char ch[N];
  17. string s1,s2;
  18. signed main()
  19. {
  20. freopen("ip.in","r",stdin); freopen("ip.out","w",stdout);
  21. scanf("%s",ch+1); n=strlen(ch+1);
  22. for(int i=1;i<=n;i++)
  23. {
  24. if(pd(ch[i])&&!pd(ch[i-1])) cnt++;
  25. if(pd(ch[i])) s[cnt]=(s[cnt]<<1)+(s[cnt]<<3)+(ch[i]^48);
  26. s1.push_back(ch[i]);
  27. }
  28. for(int i=1;i<=cnt;i++) s[i]=min(s[i],255ll);
  29. for(int i=1;i<=cnt;i++)
  30. {
  31. int x=s[i];top=0;
  32. if(!x) sta[++top]=0;
  33. while(x) sta[++top]=x%10,x/=10;
  34. for(int j=top;j>=1;j--) s2.push_back((char)(sta[j]+'0'));
  35. if(i!=cnt) s2.push_back('.');
  36. }
  37. if(s1==s2) printf("YES\n"),exit(0);
  38. else printf("NO\n");
  39. for(int i=1;i<=cnt;i++)
  40. {
  41. printf("%lld",s[i]);
  42. if(i!=cnt) printf(".");
  43. }
  44. return 0;
  45. }

T2 2B

解题思路

亏我还打了一个搜索,拍了那么多组数据。。

真的,看到这题第一眼不是什么正解,我看到的是高达 60 pts 的部分分。

然后我就果断码起了搜索,交上去之后赛后发现竟然有 75pts 的高分 !!!。

接着就开始想正解,一开始想到的是 之前考的 ZYB玩字符串,后来发现复杂度不太行,又想到了之前考过的 string。

记忆化XIN_Team+某些玄学操作???最后发现这不就是一个 括号匹配吗????

于是一个循环解决。。。

code

75pts XIN_Team

  1. #include<bits/stdc++.h>
  2. #define int long long
  3. #define ull unsigned long long
  4. #define f() cout<<"Failed"<<endl
  5. using namespace std;
  6. inline bool pd(char ch){return ch>='0'&&ch<='9';}
  7. inline int read()
  8. {
  9. int x=0,f=1;char ch=getchar();
  10. while(!pd(ch)){if(ch=='-')f=-1;ch=getchar();}
  11. while(pd(ch)){x=(x<<1)+(x<<3)+(ch^48);ch=getchar();}
  12. return x*f;
  13. }
  14. const int N=1e4+10;
  15. int n,ans,jud;
  16. char ch[N];
  17. bool check(char s[],int len)
  18. {
  19. for(int i=2;i<=len;i++) if(s[i]=='P') return true;
  20. return false;
  21. }
  22. void dfs(char s[],int len)
  23. {
  24. if(!check(s,len)) return ans=min(ans,len),void();
  25. if(!ans||ans==jud) printf("%lld",ans),exit(0);
  26. char fb[len+10];
  27. for(int i=2;i<=len;i++)
  28. if(s[i]=='P')
  29. {
  30. for(int j=1;j<=i-2;j++) fb[j]=s[j];
  31. for(int j=i+1;j<=len;j++) fb[j-2]=s[j];
  32. dfs(fb,len-2);
  33. }
  34. }
  35. signed main()
  36. {
  37. freopen("apstr.in","r",stdin); freopen("apstr.out","w",stdout);
  38. scanf("%s",ch+1); ans=n=strlen(ch+1);
  39. for(int i=1;i<=n;i++) if(ch[i]=='A') jud++;else jud--;
  40. dfs(ch,n); printf("%lld",ans); return 0;
  41. }

正解

  1. #include<bits/stdc++.h>
  2. using namespace std;
  3. const int N=1e4+10;int n,ans,res;char ch[N];
  4. signed main()
  5. {
  6. freopen("apstr.in","r",stdin); freopen("apstr.out","w",stdout);
  7. scanf("%s",ch+1); n=strlen(ch+1);
  8. for(int i=n;i>=1;i--) if(ch[i]=='P') res++; else if(res) res--; else ans++;
  9. ans+=res&1; printf("%d",ans); return 0;
  10. }

T3 2C

解题思路

有一点思维难度,也许就一点。。

发现操作有难度的只是对于所谓菱形情况的处理,因此我们考虑记录某个点所有的祖先(也就是所有的可以派生当前点的节点)

然后发现直接记录的时间复杂度好像不太允许,于是我们可以用取并集的 bitset

对于与之前的元素的并集没有交集的情况可以直接剪枝掉。

复杂度是 \(\mathcal{O}(\dfrac{n^3}{32})\) ,毕竟 bitset 的时间空间都要小一个 32 嘛,然后差不多是正确的复杂度了(尽管正解是 \(\mathcal{O}(n^2logn)\)...

code

  1. #include<bits/stdc++.h>
  2. #define int long long
  3. #define ull unsigned long long
  4. #define f() cout<<"Failed"<<endl
  5. using namespace std;
  6. inline bool pd(char ch){return ch>='0'&&ch<='9';}
  7. inline int read()
  8. {
  9. int x=0,f=1;char ch=getchar();
  10. while(!pd(ch)){if(ch=='-')f=-1;ch=getchar();}
  11. while(pd(ch)){x=(x<<1)+(x<<3)+(ch^48);ch=getchar();}
  12. return x*f;
  13. }
  14. const int N=1e3+10;
  15. int n,all;
  16. bitset<N> bit[N],temp,emp;
  17. string s[N];
  18. unordered_map<string,int> mp;
  19. signed main()
  20. {
  21. freopen("class.in","r",stdin); freopen("class.out","w",stdout);
  22. n=read(); mp.insert(make_pair(":",++all)); mp.insert(make_pair(";",++all));
  23. for(int i=1;i<=n;i++)
  24. {
  25. int pos=1; cin>>s[pos]; temp.reset();
  26. while(s[pos]!=";") pos++,cin>>s[pos];
  27. if(mp.find(s[1])!=mp.end()){printf("greska\n");continue;}
  28. for(int j=2;j<=pos;j++)if(mp.find(s[j])==mp.end()){printf("greska\n");goto V;}
  29. for(int j=3;j<pos;j++)
  30. {
  31. int x=mp.find(s[j])->second;
  32. bitset<N> f=bit[x]&temp; temp|=bit[x];
  33. if(f==emp) continue;
  34. for(int k=3;k<j;k++)
  35. {
  36. int y=mp.find(s[k])->second;
  37. if((bit[y]&bit[x])==emp) continue;
  38. if(bit[y][x]||bit[x][y]) continue;
  39. printf("greska\n");goto V;
  40. }
  41. }
  42. mp.insert(make_pair(s[1],++all)); printf("ok\n");
  43. for(int j=3;j<pos;j++) bit[all]|=bit[mp.find(s[j])->second],bit[all][mp.find(s[j])->second]=true;
  44. V:;
  45. }
  46. return 0;
  47. }

T4 2D

解题思路

显然是将 k 从大到小进行处理,对于每个点向比自己出度小的点的连边处理一下。

然后并查集维护一下,就好了,这里排序用 sort 可能会 TLE ,因此选择桶排或者基数排序。

考场上是有一个差不多的思路的,但是感觉时间也不够打出来这个题,连优化都没优化就交了,结果就。。(0pts代码

code

  1. #include<bits/stdc++.h>
  2. #define int long long
  3. #define ull unsigned long long
  4. #define f() cout<<"Failed"<<endl
  5. #define File
  6. using namespace std;
  7. inline bool pd(char ch){return ch>='0'&&ch<='9';}
  8. inline int read()
  9. {
  10. int x=0,f=1;char ch=getchar();
  11. while(!pd(ch)){if(ch=='-')f=-1;ch=getchar();}
  12. while(pd(ch)){x=(x<<1)+(x<<3)+(ch^48);ch=getchar();}
  13. return x*f;
  14. }
  15. const int MAXN=1e6+10,INF=1e18;
  16. int n,m,N,M,B,ans=-INF,aid,du[MAXN],cnt[MAXN],rk[MAXN],bou[MAXN];
  17. int rec[MAXN],a[MAXN],siz[MAXN],e[MAXN],fa[MAXN],mi[MAXN];
  18. int tot=1,head[MAXN],ver[MAXN<<1],nxt[MAXN<<1];
  19. struct Node{int id,dat;}s[MAXN],p[MAXN];
  20. void add_edge(int x,int y){ver[++tot]=y;nxt[tot]=head[x];head[x]=tot;}
  21. int find(int x){if(fa[x]==x) return x;return fa[x]=find(fa[x]);}
  22. signed main()
  23. {
  24. #ifdef File
  25. freopen("kdgraph.in","r",stdin);
  26. freopen("kdgraph.out","w",stdout);
  27. #endif
  28. n=read(); m=read(); M=read(); N=read(); B=read();
  29. for(int i=1,x,y;i<=m;i++) du[x=read()]++,du[y=read()]++,add_edge(x,y),add_edge(y,x);
  30. for(int i=1;i<=n;i++) p[i].dat=du[i],p[i].id=i,cnt[p[i].dat]++;
  31. for(int i=1;i<=n;i++) cnt[i]+=cnt[i-1],siz[i]=1,e[i]=du[i],fa[i]=i;
  32. for(int i=n;i>=1;i--) s[rk[i]=cnt[p[i].dat]--]=p[i];
  33. for(int i=1;i<n;i++) if(s[i].dat!=s[i+1].dat) bou[s[i].dat]=i;
  34. for(int i=1;i<=n;i++)
  35. for(int j=head[s[i].id];j;j=nxt[j])
  36. {
  37. int to=ver[j];
  38. if(s[rk[to]].dat<=s[i].dat) continue;
  39. int pos=bou[--s[rk[to]].dat]+1,id=s[pos].id;
  40. bou[s[rk[to]].dat]++;
  41. swap(s[rk[to]],s[rk[id]]); swap(rk[to],rk[id]);
  42. }
  43. for(int i=1;i<=n;i++) rec[s[i].id]=s[i].dat;
  44. memset(rk,0,sizeof(rk)); memset(cnt,0,sizeof(cnt));
  45. for(int i=1;i<=n;i++) cnt[rec[i]]++;
  46. for(int i=1;i<=n;i++) cnt[i]+=cnt[i-1];
  47. for(int i=n;i>=1;i--) a[rk[i]=cnt[rec[i]]--]=i;
  48. for(int i=n;i>=0;i--)
  49. {
  50. int x=a[i],fat=find(a[i]);
  51. for(int i=head[x];i;i=nxt[i])
  52. {
  53. int to=ver[i],fto=find(to);
  54. if(rk[to]<rk[x]) continue;
  55. if(fto==fat){mi[fat]++;continue;}
  56. if(siz[fat]<=siz[fto]) swap(fat,fto);
  57. siz[fat]+=siz[fto]; mi[fat]+=mi[fto]; e[fat]+=e[fto]; fa[fto]=fat; mi[fat]++;
  58. }
  59. if(!i||rec[x]==rec[a[i-1]]) continue;
  60. for(int j=i;j<=n;j++)
  61. if(rec[a[j]]==rec[x])
  62. {
  63. int fa2=find(a[j]);
  64. int temp=M*mi[fa2]-N*siz[fa2]+B*(e[fa2]-mi[fa2]*2);
  65. if(temp>ans) ans=temp,aid=rec[x];
  66. }
  67. else break;
  68. }
  69. printf("%lld %lld",aid,ans); return 0;
  70. }

NOIP模拟57的更多相关文章

  1. Noip模拟57 2021.9.20

    规律总结:联考必爆炸 T1 2A 没$A$掉的大水题,但是是真的不知道$000$前面的$00$也算先导$0$,以后要长记性,这种东西不能再错了 再打三遍: $000$前面的$00$也算先导$0$ $0 ...

  2. 2021.9.20考试总结[NOIP模拟57]

    (换个编辑器代码就SB地不自动折叠了.. T1 2A 考察快读的写法. $code:$ T1 #include<bits/stdc++.h> #define scanf SCANF=sca ...

  3. NOIP模拟17.9.22

    NOIP模拟17.9.22 前进![问题描述]数轴的原点上有一只青蛙.青蛙要跳到数轴上≥

  4. NOIP 模拟4 T2

    本题属于二和一问题 子问题相互对称 考虑对于问题一:知a求b 那么根据b数组定义式 显然能发现问题在于如何求dis(最短路) 有很多算法可供选择 dijsktra,floyed,bfs/dfs,spf ...

  5. 2021.9.17考试总结[NOIP模拟55]

    有的考试表面上自称NOIP模拟,背地里却是绍兴一中NOI模拟 吓得我直接文件打错 T1 Skip 设状态$f_i$为最后一次选$i$在$i$时的最优解.有$f_i=max_{j<i}[f_j+a ...

  6. NOIP模拟赛20161022

    NOIP模拟赛2016-10-22 题目名 东风谷早苗 西行寺幽幽子 琪露诺 上白泽慧音 源文件 robot.cpp/c/pas spring.cpp/c/pas iceroad.cpp/c/pas ...

  7. contesthunter暑假NOIP模拟赛第一场题解

    contesthunter暑假NOIP模拟赛#1题解: 第一题:杯具大派送 水题.枚举A,B的公约数即可. #include <algorithm> #include <cmath& ...

  8. NOIP模拟赛 by hzwer

    2015年10月04日NOIP模拟赛 by hzwer    (这是小奇=> 小奇挖矿2(mining) [题目背景] 小奇飞船的钻头开启了无限耐久+精准采集模式!这次它要将原矿运到泛光之源的矿 ...

  9. 大家AK杯 灰天飞雁NOIP模拟赛题解/数据/标程

    数据 http://files.cnblogs.com/htfy/data.zip 简要题解 桌球碰撞 纯模拟,注意一开始就在袋口和v=0的情况.v和坐标可以是小数.为保险起见最好用extended/ ...

随机推荐

  1. Eclipse的变量标记开关

    例如有如下代码: int var_a = 0; int var_b = var_a + 2; 当光标在var_a变量上时,Eclipse会将代码进行如下标记: int var_a = 0; int v ...

  2. 披着羊皮的Neo-reGeorg

    混迹 Web 安全行业许久,查杀网站后门已是家常便饭.时间久了,养"马"场也见的多了,Neo-reGeorg 算得上是同类中战斗力超群的"野马"了,也深受黑客和 ...

  3. Activity与Service生命周期

    一. Activity 先展示一张Activity的生命周期图: 1.1 Activity状态 只有下面三个状态是静态的,可以存在较长的时间内保持状态不变.(其它状态只是过渡状态,系统快速执行并切换到 ...

  4. NOIP 模拟 $22\; \rm e$

    题解 对于这个 \(abs\) 就是求大于 \(r\) 的最小值,小于 \(r\) 的最大值,建权值线段树或平衡树. 因为是 \(k\) 个点的联通块,就是求它们的 \(lca\) 到它们的链,可持久 ...

  5. Java线程池中submit()和execute()方法有什么区别

    两个方法都可以向线程池提交任务,execute()方法的返回类型是void,它定义在Executor接口中,而submit()方法返回有计算结构的Future对象,它定义在ExecutorServic ...

  6. 离线安装VS Code Server

    1. 获取commit 从https://github.com/microsoft/vscode/tags 获取最新的commit 2. 清理目录 mkdir -p ~/.vscode-server/ ...

  7. log4j.properties配置文件及详解

    log4j配置文件有三个主要的组件:Logger,Appender和Layout,分别为日志类型,日志输出目的地,日志输出格式. 1. 配置日志级别及appenderName log4j.rootLo ...

  8. CNN的Pytorch实现(LeNet)

    CNN的Pytorch实现(LeNet)   上次写了一篇CNN的详解,可是累坏了老僧我.写完后拿给朋友看,朋友说你这Pytorch的实现方式对于新人来讲会很不友好,然后反问我说里面所有的细节你都明白 ...

  9. 前端云原生,以 Kubernetes 为基础设施的高可用 SSR(Vue.js) 渲染微服务初探(开源 Demo)

    背景 笔者在逛掘金的时候,有幸看到掘友狼族小狈开源的 genesis - 一个可以支持 SSR 和 CSR 渲染的微服务解决方案.总体来说思想不错,但是基于 Kubernetes 云原生部署方面一直没 ...

  10. AI使用之技巧

    学习人脸关键点检测的收获: 可以将高难度关键点定位任务,其拆成多个小任务,逐步细化精度,每一层都是小网络,相比用一个复杂大网络,更能节省predict的运行时间. 数据增强Data Augmentat ...