2022高考集训1
相对而言,试题比较水,数据也不强,不过以后数据就强了,毕竟有\(lyin\)大佬卡掉一切
2A ip
简单模拟,有点细节,比如\(000\),可恶,痛失\(20\)分
\(long long\)也是可以卡掉的,数字应该只要大于\(255\),就设成\(255\)
懒得改了
\(art\)加了这个\(hack\),然而没有卡掉\(long long\)
这告诉我们不会\(hack\),就不要\(hack\)
$ugly$ $code$
#include<cstdio>
#include<cstring>
using namespace std;
bool flag=0;
int cnt=0,now=0,s;
char c[105];
long long read(){
long long x=0;
int i;
for(i=now;i<s;++i)
if(c[i]<'0'||c[i]>'9'){
if(c[i]=='.')++cnt;
else flag=1;
}else break;
int qc=0;
while(c[i]<='9'&&c[i]>='0'){
if(c[i]=='0'&&x==0)++qc;
x=(x<<3)+(x<<1)+c[i]-'0';
++i;
}
now=i;
if((qc&&x)||qc>1)flag=1;
return x;
}
int main(){
freopen("ip.in","r",stdin);
freopen("ip.out","w",stdout);
scanf("%s",c);s=strlen(c);
long long a=read();
long long b=read();
long long c=read();
long long d=read();
if(a>255){a=255;flag=1;}
if(b>255){b=255;flag=1;}
if(c>255){c=255;flag=1;}
if(d>255){d=255;flag=1;}
if(cnt!=3)flag=1;
if(now!=s)flag=1;
if(flag)printf("NO\n%lld.%lld.%lld.%lld\n",a,b,c,d);
else printf("YES\n");
return 0;
}
2B apstr
开始猜是先删\(AP\)
然后觉得是个栈
最后发现只用加加减减
++水题
code
#include<cstdio>
#include<cstring>
using namespace std;
char c[10005];
int top;
int main(){
freopen("apstr.in","r",stdin);
freopen("apstr.out","w",stdout);
scanf("%s",c);
int s=strlen(c);
for(int i=0;i<s;++i){
if(top&&c[i]=='P')--top;
else ++top;
}
printf("%d\n",top);
return 0;
}
2C class
本来复杂度不正确的切了,然后\(lyin\)觉得数据太水,造了组数据重测赛时,然后我被\(hack\)
\(rk3->rk4\)
而\(lyin\)大佬\(rk4->rk3\)
赞!
哲缟素窝闷,一定要算好时间复杂度,防止毒瘤造数据者大佬卡你
做法就是用\(map\),\(bitset\)(我用的\(bool\)数组)搞,优化在于有派生关系的只需要扫后面那个
code
#include<map>
#include<string>
#include<iostream>
#include<algorithm>
using namespace std;
int n,id;
map<string,int>mp;
string s[1005];
bool b[1005][1005];
int rem[1005],top,v[1005];
bool ls[1005];
bool work(){
cin>>s[0];
int cnt=0;
while(s[cnt]!=";"){++cnt;cin>>s[cnt];if(s[cnt]==":")--cnt;}
--cnt;
if(mp[s[0]]!=0)return false;
for(int i=1;i<=cnt;++i)v[i]=mp[s[i]];
sort(v+1,v+cnt+1);
if(cnt&&v[1]==0)return false;
for(int i=1;i<=id;++i)ls[i]=0;
for(int i=cnt;i>=1;--i){
if(ls[v[i]])continue;
for(int j=1;j<=id;++j)
if(b[v[i]][j]){
if(ls[j])return false;
else ls[j]=1;
}
}
mp[s[0]]=++id;
for(int i=1;i<=id;++i)b[id][i]=ls[i];b[id][id]=1;
return true;
}
int main(){
freopen("class.in","r",stdin);
freopen("class.out","w",stdout);
scanf("%d",&n);
for(int i=1;i<=n;++i)if(work())printf("ok\n");else printf("greska\n");
return 0;
}
2D kdgraph
考场并茶几是对的,但是划分等级搞错了
应该用拓扑,但是直接拓扑会挂,本来不会,但是\(lyin\)又双造了两组数据
学弟学妹们大概会感谢\(lyin\)吧,大概
神奇的\(n+m+m\)拓扑,其实就是开桶,我太菜了,不知道怎么讲。
上代码吧。。
code
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<queue>
#include<vector>
using namespace std;
const int maxn=1000005;
const int maxm=2000005;
typedef long long ll;
int read(){
int x=0;char c;c=getchar();bool f=0;
while(c<'0'||c>'9'){if(c=='-')f=1;c=getchar();}
while(c>='0'&&c<='9'){x=(x<<3)+(x<<1)+(c^48);c=getchar();}
if(f)x=-x;
return x;
}
int n,m,d[maxn],head[maxn],tot,st[maxn];
ll M,N,B;
struct edge{int to,net;}e[maxm];
void add(int u,int v){
e[++tot].net=head[u];
head[u]=tot;
e[tot].to=v;
++d[v];
}
struct SET{
int f[maxn],dd[maxn],mm[maxn],sd[maxn];
int ansk;
int as[maxn],ask;
ll score=-99999999999999999;
int fa(int x){return f[x]=f[x]==x?x:fa(f[x]);}
void hb(int x,int y){
x=fa(x);y=fa(y);
if(x==y)return;
f[x]=y;
dd[y]+=dd[x];
mm[y]+=mm[x];
sd[y]+=sd[x];
}
void ad(int x){
f[x]=x;dd[x]=1;mm[x]=0;sd[x]=d[x];
int nbian=0;
for(int i=head[x];i;i=e[i].net){
int v=e[i].to;
if(f[v]){++nbian;hb(x,v);}
}
x=fa(x);mm[x]+=nbian;
if(dd[x]>1)as[++ask]=x;
}
void ga(int k){
for(int j=1;j<=ask;++j){
int i=as[j];if(fa(i)!=i)continue;
ll sc=M*mm[i]-N*dd[i]+B*(sd[i]-mm[i]-mm[i]);
if(sc>score){score=sc;ansk=k;}
}
}
}S;
int tp[maxn],no[maxn],rem[maxn];
vector<int>v[maxn];
void tpe(){
for(int i=1;i<=n;++i)v[d[i]].push_back(i),rem[i]=d[i];
int cnt=n;
for(int k=1;k<=n;++k){
int s=v[k].size(),now=0;
for(int i=0;i<s;++i)no[++now]=v[k][i],--cnt;
for(int l=1;l<=now;++l){
if(tp[no[l]])continue;
tp[no[l]]=k;
for(int i=head[no[l]];i;i=e[i].net){
int to=e[i].to;
if(tp[to])continue;
--rem[to];
if(rem[to]<=k)no[++now]=to,--cnt;
else v[rem[to]].push_back(to);
}
}
if(cnt==0)break;
}
}
bool cmp(int x,int y){return tp[x]>tp[y];}
signed main(){
freopen("kdgraph.in","r",stdin);
freopen("kdgraph.out","w",stdout);
n=read();m=read();
M=read();N=read();B=read();
for(int i=1;i<=m;++i){
int u,v;u=read();v=read();
add(u,v);add(v,u);
}
for(int i=1;i<=n;++i)st[i]=i;
tpe();
sort(st+1,st+1+n,cmp);
int now=1;
for(int k=tp[st[1]];k>=tp[st[n]];--k){
if(k==0)break;S.ask=0;
while(tp[st[now]]==k&&now<=n){S.ad(st[now]);++now;}
S.ga(k);
}
printf("%d %lld\n",S.ansk,S.score);
return 0;
}