前言

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

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

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

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

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

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

T1 2A

解题思路

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

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

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

code

#include<bits/stdc++.h>
#define int long long
#define ull unsigned long long
#define f() cout<<"Failed"<<endl
using namespace std;
bool pd(char ch){return ch>='0'&&ch<='9';}
inline int read()
{
int x=0,f=1;char ch=getchar();
while(!pd(ch)){if(ch=='-')f=-1;ch=getchar();}
while(pd(ch)){x=(x<<1)+(x<<3)+(ch^48);ch=getchar();}
return x*f;
}
const int N=50;
int n,cnt,tot,top,sta[N],s[N];
char ch[N];
string s1,s2;
signed main()
{
freopen("ip.in","r",stdin); freopen("ip.out","w",stdout);
scanf("%s",ch+1); n=strlen(ch+1);
for(int i=1;i<=n;i++)
{
if(pd(ch[i])&&!pd(ch[i-1])) cnt++;
if(pd(ch[i])) s[cnt]=(s[cnt]<<1)+(s[cnt]<<3)+(ch[i]^48);
s1.push_back(ch[i]);
}
for(int i=1;i<=cnt;i++) s[i]=min(s[i],255ll);
for(int i=1;i<=cnt;i++)
{
int x=s[i];top=0;
if(!x) sta[++top]=0;
while(x) sta[++top]=x%10,x/=10;
for(int j=top;j>=1;j--) s2.push_back((char)(sta[j]+'0'));
if(i!=cnt) s2.push_back('.');
}
if(s1==s2) printf("YES\n"),exit(0);
else printf("NO\n");
for(int i=1;i<=cnt;i++)
{
printf("%lld",s[i]);
if(i!=cnt) printf(".");
}
return 0;
}

T2 2B

解题思路

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

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

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

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

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

于是一个循环解决。。。

code

75pts XIN_Team

#include<bits/stdc++.h>
#define int long long
#define ull unsigned long long
#define f() cout<<"Failed"<<endl
using namespace std;
inline bool pd(char ch){return ch>='0'&&ch<='9';}
inline int read()
{
int x=0,f=1;char ch=getchar();
while(!pd(ch)){if(ch=='-')f=-1;ch=getchar();}
while(pd(ch)){x=(x<<1)+(x<<3)+(ch^48);ch=getchar();}
return x*f;
}
const int N=1e4+10;
int n,ans,jud;
char ch[N];
bool check(char s[],int len)
{
for(int i=2;i<=len;i++) if(s[i]=='P') return true;
return false;
}
void dfs(char s[],int len)
{
if(!check(s,len)) return ans=min(ans,len),void();
if(!ans||ans==jud) printf("%lld",ans),exit(0);
char fb[len+10];
for(int i=2;i<=len;i++)
if(s[i]=='P')
{
for(int j=1;j<=i-2;j++) fb[j]=s[j];
for(int j=i+1;j<=len;j++) fb[j-2]=s[j];
dfs(fb,len-2);
}
}
signed main()
{
freopen("apstr.in","r",stdin); freopen("apstr.out","w",stdout);
scanf("%s",ch+1); ans=n=strlen(ch+1);
for(int i=1;i<=n;i++) if(ch[i]=='A') jud++;else jud--;
dfs(ch,n); printf("%lld",ans); return 0;
}

正解

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

T3 2C

解题思路

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

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

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

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

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

code

#include<bits/stdc++.h>
#define int long long
#define ull unsigned long long
#define f() cout<<"Failed"<<endl
using namespace std;
inline bool pd(char ch){return ch>='0'&&ch<='9';}
inline int read()
{
int x=0,f=1;char ch=getchar();
while(!pd(ch)){if(ch=='-')f=-1;ch=getchar();}
while(pd(ch)){x=(x<<1)+(x<<3)+(ch^48);ch=getchar();}
return x*f;
}
const int N=1e3+10;
int n,all;
bitset<N> bit[N],temp,emp;
string s[N];
unordered_map<string,int> mp;
signed main()
{
freopen("class.in","r",stdin); freopen("class.out","w",stdout);
n=read(); mp.insert(make_pair(":",++all)); mp.insert(make_pair(";",++all));
for(int i=1;i<=n;i++)
{
int pos=1; cin>>s[pos]; temp.reset();
while(s[pos]!=";") pos++,cin>>s[pos];
if(mp.find(s[1])!=mp.end()){printf("greska\n");continue;}
for(int j=2;j<=pos;j++)if(mp.find(s[j])==mp.end()){printf("greska\n");goto V;}
for(int j=3;j<pos;j++)
{
int x=mp.find(s[j])->second;
bitset<N> f=bit[x]&temp; temp|=bit[x];
if(f==emp) continue;
for(int k=3;k<j;k++)
{
int y=mp.find(s[k])->second;
if((bit[y]&bit[x])==emp) continue;
if(bit[y][x]||bit[x][y]) continue;
printf("greska\n");goto V;
}
}
mp.insert(make_pair(s[1],++all)); printf("ok\n");
for(int j=3;j<pos;j++) bit[all]|=bit[mp.find(s[j])->second],bit[all][mp.find(s[j])->second]=true;
V:;
}
return 0;
}

T4 2D

解题思路

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

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

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

code

#include<bits/stdc++.h>
#define int long long
#define ull unsigned long long
#define f() cout<<"Failed"<<endl
#define File
using namespace std;
inline bool pd(char ch){return ch>='0'&&ch<='9';}
inline int read()
{
int x=0,f=1;char ch=getchar();
while(!pd(ch)){if(ch=='-')f=-1;ch=getchar();}
while(pd(ch)){x=(x<<1)+(x<<3)+(ch^48);ch=getchar();}
return x*f;
}
const int MAXN=1e6+10,INF=1e18;
int n,m,N,M,B,ans=-INF,aid,du[MAXN],cnt[MAXN],rk[MAXN],bou[MAXN];
int rec[MAXN],a[MAXN],siz[MAXN],e[MAXN],fa[MAXN],mi[MAXN];
int tot=1,head[MAXN],ver[MAXN<<1],nxt[MAXN<<1];
struct Node{int id,dat;}s[MAXN],p[MAXN];
void add_edge(int x,int y){ver[++tot]=y;nxt[tot]=head[x];head[x]=tot;}
int find(int x){if(fa[x]==x) return x;return fa[x]=find(fa[x]);}
signed main()
{
#ifdef File
freopen("kdgraph.in","r",stdin);
freopen("kdgraph.out","w",stdout);
#endif
n=read(); m=read(); M=read(); N=read(); B=read();
for(int i=1,x,y;i<=m;i++) du[x=read()]++,du[y=read()]++,add_edge(x,y),add_edge(y,x);
for(int i=1;i<=n;i++) p[i].dat=du[i],p[i].id=i,cnt[p[i].dat]++;
for(int i=1;i<=n;i++) cnt[i]+=cnt[i-1],siz[i]=1,e[i]=du[i],fa[i]=i;
for(int i=n;i>=1;i--) s[rk[i]=cnt[p[i].dat]--]=p[i];
for(int i=1;i<n;i++) if(s[i].dat!=s[i+1].dat) bou[s[i].dat]=i;
for(int i=1;i<=n;i++)
for(int j=head[s[i].id];j;j=nxt[j])
{
int to=ver[j];
if(s[rk[to]].dat<=s[i].dat) continue;
int pos=bou[--s[rk[to]].dat]+1,id=s[pos].id;
bou[s[rk[to]].dat]++;
swap(s[rk[to]],s[rk[id]]); swap(rk[to],rk[id]);
}
for(int i=1;i<=n;i++) rec[s[i].id]=s[i].dat;
memset(rk,0,sizeof(rk)); memset(cnt,0,sizeof(cnt));
for(int i=1;i<=n;i++) cnt[rec[i]]++;
for(int i=1;i<=n;i++) cnt[i]+=cnt[i-1];
for(int i=n;i>=1;i--) a[rk[i]=cnt[rec[i]]--]=i;
for(int i=n;i>=0;i--)
{
int x=a[i],fat=find(a[i]);
for(int i=head[x];i;i=nxt[i])
{
int to=ver[i],fto=find(to);
if(rk[to]<rk[x]) continue;
if(fto==fat){mi[fat]++;continue;}
if(siz[fat]<=siz[fto]) swap(fat,fto);
siz[fat]+=siz[fto]; mi[fat]+=mi[fto]; e[fat]+=e[fto]; fa[fto]=fat; mi[fat]++;
}
if(!i||rec[x]==rec[a[i-1]]) continue;
for(int j=i;j<=n;j++)
if(rec[a[j]]==rec[x])
{
int fa2=find(a[j]);
int temp=M*mi[fa2]-N*siz[fa2]+B*(e[fa2]-mi[fa2]*2);
if(temp>ans) ans=temp,aid=rec[x];
}
else break;
}
printf("%lld %lld",aid,ans); return 0;
}

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. A Python Environment Detector

    The user provide the method to get result(command on remote host), the check standard(a callback fun ...

  2. Vue CLI安装报错 npm ERR! Exit handler never called!

    安装Vue CLI时报错: npm install –g vue-cli 试了四种办法 1.把全局安装-g放到后面 npm install @vue/cli –g 2.命令行输入 npm 缓存清理命令 ...

  3. SQL 练习15

    检索" 01 "课程分数小于 60,按分数降序排列的学生信息 SELECT Student.* ,SC.score from Student,SC WHERE sc.cid = ' ...

  4. xml的约束

    一.DTD约束xml 1.约束介绍 由于xml的标签由用户自己定义,因此在开发的时候,每个人都可以根据自己的需求来定义xml标签,这样导致项目中的xml难以维护,因此需要使用一定的规范机制来约束xml ...

  5. JavaWeb学习笔记(四)

    本文内容 1. 会话技术 1. Cookie 2. Session 2. JSP:入门学习 会话技术 1. 会话:一次会话中包含多次请求和响应. * 一次会话:浏览器第一次给服务器资源发送请求,会话建 ...

  6. redis缓存穿透,缓存击穿,缓存雪崩

    缓存穿透 缓存穿透是指用户查询数据,在数据库没有,自然在缓存中也不会有.这样就导致用户查询的时候,在缓存中找不到,每次都要去数据库再查询一遍,然后返回空(相当于进行了两次无用的查询).这样请求就会绕过 ...

  7. ASP.NET Core教程:在ASP.NET Core中使用HttPClient调用WebService

    一.前言 在以前的一篇文章中,曾经讲述过如何在ASP.NET Core中调用WebService.但是那种方式是通过静态引用的方式去调用的,如果是在生产环境中,肯定不能使用这种方式去调用,幸运的是微软 ...

  8. wpf 的style

    <ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" x ...

  9. 使用TypeConverter类

    3.2.2 使用TypeConverter类将XAML标签的Attribute与对象的Property进行映射注意本小节的例子对于初学者来说理解起来比较困难而且实用性不大,主要是为喜欢刨根问底的WPF ...

  10. 二级C语言题集

    时间:2015-5-13 18:01 在131题之后是按考点分类的题集,有需要的朋友可以看一下 ---------------------------------------------------- ...