#include<cstdio>#include<iostream>#include<map>#define RI register int#define CI const int&usingnamespace std;
int n,x; map <int,int> c;
intmain(){
//freopen("B.in","r",stdin); freopen("B.out","w",stdout); RI i; for (scanf("%d",&n),i=1;i<=3*n;++i) scanf("%d",&x),++c[x];
bool flag=1; for (auto [_,t]:c) if (t%3!=0) flag=0;
returnputs(flag?"N":"Y"),0;
}
#include<cstdio>#include<iostream>#include<map>#include<set>#define RI register int#define CI const int&usingnamespace std;
typedeflonglong LL;
constint N=400005,mod1=998244353,mod2=1e9+7;
int n,k,c[N],bkt[N],ans; map <LL,int> fst; multiset <int> s;
structHasher{
int x,y;
inlineHasher(CI X=0,CI Y=0){
x=X; y=Y;
}
inline LL get_val(void){
return ((1LL*x)<<31LL)|(1LL*y);
}
friendinlinebooloperator == (const Hasher& A,const Hasher& B)
{
return A.x==B.x&&A.y==B.y;
}
friendinline Hasher operator + (const Hasher& A,const Hasher& B)
{
returnHasher((A.x+B.x)%mod1,(A.y+B.y)%mod2);
}
friendinline Hasher operator - (const Hasher& A,const Hasher& B)
{
returnHasher((A.x-B.x+mod1)%mod1,(A.y-B.y+mod2)%mod2);
}
friendinline Hasher operator * (const Hasher& A,const Hasher& B)
{
returnHasher(1LL*A.x*B.x%mod1,1LL*A.y*B.y%mod2);
}
}pw[N],cur,norm; const Hasher seed=Hasher(31,131);
intmain(){
//freopen("C.in","r",stdin); freopen("C.out","w",stdout); RI i; for (scanf("%d%d",&n,&k),i=1;i<=n;++i) scanf("%d",&c[i]);
for (pw[0]=Hasher(1,1),i=1;i<=k;++i) s.insert(0),pw[i]=pw[i-1]*seed,norm=norm+pw[i];
for (fst[0]=0,i=1;i<=n;++i)
{
s.erase(s.find(bkt[c[i]]));
s.insert(++bkt[c[i]]); cur=cur+pw[c[i]];
intmin_t=*s.begin();
Hasher tmp=cur-norm*Hasher(min_t,min_t);
if (fst.count(tmp.get_val())) ans=max(ans,i-fst[tmp.get_val()]);
else fst[tmp.get_val()]=i;
}
returnprintf("%d",ans),0;
}
5|0D. Deciphering WordWhiz
签到模拟题,难点在于阅读题意
#include<cstdio>#include<iostream>#include<string>#define RI register int#define CI const int&usingnamespace std;
constint N=1005;
int n,m,ext[30]; string base,words[N];
intmain(){
//freopen("D.in","r",stdin); freopen("D.out","w",stdout); RI i,j; for (cin>>n,i=1;i<=n;++i) cin>>words[i]; base=words[1];
for (i=0;i<5;++i) ext[base[i]-'a']=1;
for (cin>>m,i=1;i<=m;++i)
{
string res; cin>>res; int ans=0;
auto comp=[&](string s)
{
string ret=""; for (RI i=0;i<5;++i)
if (s[i]==base[i]) ret+="*";
elseif (ext[s[i]-'a']) ret+="!";
else ret+="X"; return ret;
};
for (j=1;j<=n;++j) if (comp(words[j])==res) ++ans;
cout<<ans<<endl;
}
return0;
}
6|0E. Elevated Profits
题目都没看,防AK题+1
7|0F. Forward and Backward
徐神开场写的一个Easy题,我题目都没看
#include<bits/stdc++.h>using llsi = longlongsignedint;
intcheck(llsi n, llsi base){
std::vector<llsi> num;
while(n) num.push_back(n % base), n /= base;
for(size_t i = 0; i < num.size(); ++i) if(num[i] != num[num.size() - i - 1]) return0;
return1;
}
intmain(){
llsi n;
std::cin >> n;
std::vector<llsi> ans;
llsi ue = std::min(n, 1000000ll);
for(llsi i = ue; i >= 2; --i) if(check(n, i)) ans.push_back(i);
for(llsi i = 1; i < ue; ++i) {
llsi base = (n - i) / i;
if(base && base > 1000000ll && n % base == i && n / base == i)
ans.push_back(base);
}
std::sort(ans.begin(), ans.end());
if(ans.size()) for(size_t i = 0; i < ans.size(); ++i) std::cout << ans[i] << char(i == ans.size() - 1 ? 10 : 32);
else std::cout << "*\n";
return0;
}
8|0G. GPS on a Flat Earth
这题思路很简单,就是不断地将所有斜45度的正方形求交,最后剩下来的点集就是答案
但因为一些不可名状的细节这题很容易写挂,徐神应该还在补这个题代码就先坑着
9|0H. Health in Hazard
祁神知道我们写不来几何特意跑过来秒了这道题
这题我题意都不知道,做法是二分+半平面交,感觉这两个算法结合的题目确实比较多
#include<bits/stdc++.h>usingnamespace std;
#define int long long#define LD long doubleconst LD eps = 1e-8;
const LD INF = 1e9;
intsgn(LD x){returnfabs(x)<=eps ? 0 : (x > eps ? 1 : -1);}
structPt{
LD x, y;
Pt operator-(Pt b)const{return Pt{x-b.x, y-b.y};}
Pt operator+(Pt b)const{return Pt{x+b.x, y+b.y};}
Pt operator*(LD b)const{return Pt{x*b, y*b};}
LD crs(Pt b)const{return x*b.y-y*b.x;}
LD len()const{returnsqrtl(x*x+y*y);}
intquad()const{
if (sgn(x)>0 && sgn(y)>=0){return1;} if (sgn(x)<=0 && sgn(y)>0){return2;}
if (sgn(x)<0 && sgn(y)<=0){return3;} if (sgn(x)>=0 && sgn(y)<0){return4;}
}
};
structLine{
Pt p, v;
Line(){}
Line(Pt _p, Pt _v):p(_p), v(_v){}
booloperator<(Line b)const{
if (v.quad()!=b.v.quad()) return v.quad()<b.v.quad();
else{
LD crs = v.crs(b.v);
returnsgn(crs)!=0 ? sgn(crs)>0 : sgn(v.crs(b.p-p))< 0;
}
}
};
const Line bd[4] = {
Line(Pt{-INF, -INF}, Pt{1, 0}), Line(Pt{INF, -INF}, Pt{0, 1}),
Line(Pt{INF, INF}, Pt{-1, 0}), Line(Pt{-INF, INF}, Pt{0, -1}),
};
Pt pt_l_l(Line a, Line b){return a.p+a.v*(b.v.crs(a.p-b.p)/(a.v.crs(b.v)));}
boolhalfPlane(vector<Line> &ln, vector<Pt> &res){
for (int i=0; i<4; ++i) ln.push_back(bd[i]);
sort(ln.begin(), ln.end());
int cur=0;
for (int i=1; i<(int)ln.size(); ++i){
if (sgn(ln[cur].v.crs(ln[i].v))!=0) ln[++cur]=ln[i];
}
ln.erase(ln.begin()+cur+1, ln.end());
int sz = ln.size();
vector<Line> Ql(sz+5);
vector<Pt> Qp(sz+5);
int frl=0, edl=-1, frp=0, edp=-1;
Ql[++edl] = ln[0];
for (int i=1; i<sz; ++i){
while (frp<=edp && sgn(ln[i].v.crs(Qp[edp]-ln[i].p))<=0) --edp, --edl;
while (frp<=edp && sgn(ln[i].v.crs(Qp[frp]-ln[i].p))<=0) ++frp, ++frl;
Qp[++edp] = pt_l_l(ln[i], Ql[edl]);
Ql[++edl] = ln[i];
}
while (frp<=edp && sgn(Ql[frl].v.crs(Qp[edp]-Ql[frl].p)<=0)) --edp, --edl;
if (frl<edl) Qp[++edp] = pt_l_l(Ql[edl], Ql[frl]);
if (edp-frp<2) returnfalse;
else{
res.clear();
res.insert(res.end(), Qp.begin()+frp, Qp.begin()+edp+1);
returntrue;
}
}
constint N = 2e5+5;
int n; LD D;
Line ln[N];
boolcheck(int x){
vector<Line> vec;
for (int i=1; i<=x; ++i) vec.push_back(ln[i]);
vector<Pt> ch;
halfPlane(vec, ch);
int sz=ch.size();
bool ok=false;
for (int i=0; i<sz; ++i){
// printf("i=%lld (%Ld %Ld)\n", i, ch[i].x, ch[i].y);if (sgn((ch[i]).len()-D)>0){
ok=true;
break;
}
}
return ok;
}
signedmain(){
scanf("%lld%Lf", &n, &D);
for (int i=1; i<=n; ++i){
int x1, y1, x2, y2; scanf("%lld%lld%lld%lld", &x1, &y1, &x2, &y2);
Pt a=Pt{x1, y1}, b=Pt{x2, y2};
if (sgn((b-a).crs(Pt{0, 0}-a)<0)) swap(a, b);
ln[i] = Line(a, b-a);
}
// for (int i=1; i<=n; ++i){// printf("i=%lld (%Lf %Lf)(%Lf %Lf)\n", i, ln[i].p.x, ln[i].p.y, ln[i].v.x, ln[i].v.y);// }if (check(n)){
printf("*\n");
}else{
int L=1, R=n;
while (L<R){
int M = L+(R-L)/2;
if (check(M)) L=M+1;
else R=M;
}
printf("%lld\n", L);
}
return0;
}
10|0I. Inversions
一个Easy数数题,根据逆序对的统计方法手玩一下推个式子即可
对于原来的某个元素si,设原串中在它之后并且小于si的元素个数为A,整个原串小于si的元素个数为B
则si的贡献就是首项为A,公差为B,项数为n的等差数列之和
#include<cstdio>#include<iostream>#include<cstring>#define int long long#define RI register int#define CI const int&usingnamespace std;
constint N=100005,mod=1e9+7,inv2=(mod+1)/2;
int n,t,bkt[30],A[N],B[N],ans; char s[N];
signedmain(){
//freopen("I.in","r",stdin); freopen("I.out","w",stdout); RI i,j; for (scanf("%s%lld",s+1,&t),n=strlen(s+1),i=n;i>=1;--i)
{
for (j=s[i]-'a'-1;j>=0;--j) A[i]+=bkt[j]; ++bkt[s[i]-'a'];
}
for (i=1;i<=n;++i)
{
for (j=s[i]-'a'-1;j>=0;--j) B[i]+=bkt[j];
(ans+=(2LL*A[i]+(t-1)*B[i])%mod*(t%mod)%mod*inv2%mod)%=mod;
}
returnprintf("%lld",ans),0;
}
#include<cstdio>#include<iostream>#include<vector>#include<utility>#define RI register int#define CI const int&#define fi first#define se secondusingnamespace std;
constint N=100005,INF=1e9;
typedef pair <int,int> pi;
int n,x,y,ans[N]; vector <int> v[N];
classTree_Solver{
private:
int anc[N][20],dep[N];
public:
inlinevoidDFS(CI now=1,CI fa=0){
anc[now][0]=fa; dep[now]=dep[fa]+1;
for (RI i=0;i<18;++i) if (anc[now][i]) anc[now][i+1]=anc[anc[now][i]][i]; elsebreak;
for (auto to:v[now]) if (to!=fa) DFS(to,now);
}
inlineintgetLCA(int x,int y){
RI i; if (dep[x]<dep[y]) swap(x,y);
for (i=19;i>=0;--i) if (dep[anc[x][i]]>=dep[y]) x=anc[x][i];
if (x==y) return x;
for (i=19;i>=0;--i) if (anc[x][i]!=anc[y][i]) x=anc[x][i],y=anc[y][i];
return anc[x][0];
}
inlineintgetdis(CI x,CI y){
return dep[x]+dep[y]-2*dep[getLCA(x,y)];
}
}T;
namespace Point_Divide_Tree
{
int rt,ots,sz[N],mx[N],fa[N]; pi mi[N]; bool vis[N];
inlinevoidgetrt(CI now=1,CI fa=0){
sz[now]=1; mx[now]=0; for (auto to:v[now])
if (to!=fa&&!vis[to]) getrt(to,now),sz[now]+=sz[to],mx[now]=max(mx[now],sz[to]);
if (mx[now]=max(mx[now],ots-sz[now]),mx[now]<mx[rt]) rt=now;
}
inlinevoidsolve(int now){
vis[now]=1; for (auto to:v[now]) if (!vis[to])
mx[rt=0]=INF,ots=sz[to],getrt(to,now),fa[rt]=now,solve(rt);
}
inlinevoiddivide(CI n){
for (RI i=1;i<=n;++i) mi[i]=pi(INF,0);
mx[rt=0]=INF; ots=n; getrt(); solve(rt);
//for (RI i=1;i<=n;++i) if (fa[i]) printf("%d->%d\n",fa[i],i); }
}
usingnamespace Point_Divide_Tree;
intmain(){
//freopen("J.in","r",stdin); freopen("J.out","w",stdout); RI i; for (scanf("%d",&n),i=1;i<n;++i)
scanf("%d%d",&x,&y),v[x].push_back(y),v[y].push_back(x);
for (T.DFS(),divide(n),i=n;i>=1;--i)
{
if (i!=n)
{
pi res=pi(INF,0);
for (x=i;x;x=fa[x]) res=min(res,pi(mi[x].fi+T.getdis(i,x),mi[x].se));
ans[i]=res.se;
} else ans[i]=n;
for (x=i;x;x=fa[x]) mi[x]=min(mi[x],pi(T.getdis(i,x),i));
}
for (i=1;i<=n;++i) printf("%d ",ans[i]);
return0;
}
#include<cstdio>#include<iostream>#include<vector>#include<algorithm>#include<cstdlib>#include<ctime>#define RI register int#define CI const int&usingnamespace std;
constint N=305;
int n,k,a[N],nxt[N][N],vis[N],f[1<<25],pre[1<<25];
intmain(){
//freopen("K.in","r",stdin); freopen("K.out","w",stdout); RI i,j; for (scanf("%d%d",&n,&k),i=1;i<=n;++i) scanf("%d",&a[i]);
for (i=0;i<=n+1;++i) for (j=0;j<=n+1;++j) nxt[i][j]=n+1;
for (i=0;i<=n;++i) for (j=i+1;j<=n;++j) nxt[i][a[j]]=min(nxt[i][a[j]],j);
if (k>=20)
{
int ans[N]; for (i=1;i<=k;++i) ans[i]=i;
for (srand(time(0));;)
{
random_shuffle(ans+1,ans+k+1);
int lst=0; for (i=1;i<=k;++i) lst=nxt[lst][ans[i]];
if (lst>n)
{
for (i=1;i<=k;++i) printf("%d ",ans[i]); break;
}
}
return0;
}
for (i=0;i<(1<<k);++i) pre[i]=-1;
for (f[0]=0,i=1;i<(1<<k);++i)
{
for (j=0;j<k;++j) if ((i>>j)&1)
if (nxt[f[i^(1<<j)]][j+1]>f[i]) f[i]=nxt[f[i^(1<<j)]][j+1],pre[i]=j;
}
if (f[(1<<k)-1]<=n) returnputs("*"),0;
vector <int> ans;
for (int S=(1<<k)-1;S;S=S^(1<<pre[S])) ans.push_back(pre[S]+1);
reverse(ans.begin(),ans.end());
for (auto x:ans) printf("%d ",x);
return0;
}
#include<cstdio>#include<iostream>#include<vector>#include<algorithm>#define RI register int#define CI const int&usingnamespace std;
constint N=305;
int n,k,a[N],nxt[N][N],vis[N],f[1<<25],pre[1<<25];
intmain(){
//freopen("K.in","r",stdin); freopen("K.out","w",stdout); RI i,j; for (scanf("%d%d",&n,&k),i=1;i<=n;++i) scanf("%d",&a[i]);
for (i=0;i<=n+1;++i) for (j=0;j<=n+1;++j) nxt[i][j]=n+1;
for (i=0;i<=n;++i) for (j=i+1;j<=n;++j) nxt[i][a[j]]=min(nxt[i][a[j]],j);
if (k>=20)
{
int lst=0; for (i=1;i<=k;++i)
{
int mx=0,pos=-1;
for (j=1;j<=k;++j) if (!vis[j]&&nxt[lst][j]>mx) mx=nxt[lst][j],pos=j;
vis[pos]=1; lst=nxt[lst][pos]; printf("%d ",pos);
if (lst>n) break;
}
for (i=1;i<=k;++i) if (!vis[i]) printf("%d ",i);
return0;
}
for (i=0;i<(1<<k);++i) pre[i]=-1;
for (f[0]=0,i=1;i<(1<<k);++i)
{
for (j=0;j<k;++j) if ((i>>j)&1)
if (nxt[f[i^(1<<j)]][j+1]>f[i]) f[i]=nxt[f[i^(1<<j)]][j+1],pre[i]=j;
}
if (f[(1<<k)-1]<=n) returnputs("*"),0;
vector <int> ans;
for (int S=(1<<k)-1;S;S=S^(1<<pre[S])) ans.push_back(pre[S]+1);
reverse(ans.begin(),ans.end());
for (auto x:ans) printf("%d ",x);
return0;
}
13|0L. Latam++
徐神我们的红太阳,开场秒了这个题,后面发现原来这是我们队这场写的过的人最少的一个题了
大致思路就是拿个栈来模拟,但需要讨论并且细节巨多,在数次破防后徐神总算是过了这个题
#include<bits/stdc++.h>using llsi = longlongsignedint;
llsi ans = 0;
boolcalc(constchar *&s){
llsi res = 0;
llsi stack = 0;
bool is_legal = true;
char pre = '(';
if(*s == ')') returnfalse;
for(;; /* std::cerr << *s << ' ' << is_legal << char(10) */) switch(*s) {
case'\0':
// std::cerr << "FUCK\n";returnfalse;
case')':
s += 1;
// std::cerr << "is_legal = " << is_legal << char(10);// std::cerr << "ans = " << ans << char(10);return is_legal && (islower(pre) || pre == ')');
case'+':
case'-':
case'*':
case'/':
if(!islower(pre) && pre != ')')
is_legal = false,
stack = 0;
pre = *s++;
break;
case'(':
s += 1;
if(islower(pre) || pre == ')') {
is_legal = false;
if(!calc(s)) stack = 0;
else ans += stack = 1;
} else {
if(calc(s)) {
ans += stack += 1;
} else {
is_legal = false;
stack = 0;
}
}
pre = ')';
break;
default:
if(!islower(pre) &&
pre != '+' &&
pre != '-' &&
pre != '*' &&
pre != '/' &&
pre != '(') stack = 0, is_legal = false;
pre = *s++;
ans += stack += 1;
}
}
intmain(void){
std::ios::sync_with_stdio(false);
std::string s;
std::getline(std::cin, s);
constchar *ss = s.c_str();
while(*ss) {
while(*ss && *ss == ')') ss += 1;
calc(ss);
}
std::cout << ans << std::endl;
return0;
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 25岁的心里话
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现
2023-01-10 末日下的恋歌——《秽翼的尤斯蒂娅》杂谈