2025.1.26 Ethflow Round 1 (Codeforces Round 1001, Div. 1 + Div. 2)
Solved:5/9
A. String
题意:给一个字符串,每次可以选一个相邻字符不同的子串翻转,问最少几次能变成全 0 串。
注意到每次操作至多只能减少一个 1,而每次选一个 1 变成 0 就能做到这一点,所以答案就是 1 的个数。
void solve(){ string a; cin>>a; int res=0; for(char x:a)res+=x=='1'; cout<<res<<'\n'; }
B. Clockwork
题意:有
显然最优策略就是来回遍历整个序列。如果一个计时器在一周期内会变到 0 就肯定失败。
bool solve(){ int n; cin>>n; vector<int> a(n); for(int& x:a)cin>>x; for(int i=0;i<n;++i){ if(a[i]<=max(i,n-1-i)*2)return 0; } return 1; }
C. Cirno and Operations
题意:给一个序列,每次可以选择反转或取差分,问任意多次操作后序列所有数之和的最大值。
注意到本质不同的操作只有多次差分或反转一次再多次差分。直接
void solve(){ int n; cin>>n; vector<ll> a(n),b(n); for(ll& x:a)cin>>x; ll res=-inf; for(int i=0;i<n;++i){ ll sum=0; for(int j=0;j<n-i;++j)sum+=a[j]; res=max(res,i?abs(sum):sum); for(int j=0;j<n-i-1;++j)b[j]=a[j+1]-a[j]; a=b; } cout<<res<<'\n'; }
D. Balanced Tree
题意:给一棵树,每个点的点权取值在一个区间中。现可以做多次操作,每次选择一棵子树将其所有点点权加 1。分配初始点权后通过上述操作让所有点权相等,求这个相等的点权的最小值。
任取一个点作为根,令
直接贪心选每个点的点权为子节点点权的最大值即可。若在区间外则改为端点值。
const int N=2e5+5; int n,a[N],b[N],c[N],x,y; ll ans; vector<int> e[N]; void adde(int x,int y){ e[x].push_back(y); } void dfs(int u,int f){ c[u]=a[u]; for(int v:e[u])if(v^f)dfs(v,u),c[u]=max(c[u],c[v]); c[u]=min(c[u],b[u]); for(int v:e[u])if(v^f)ans+=max(0,c[v]-c[u]); } void solve(){ cin>>n; for(int i=1;i<=n;++i)e[i].clear(); for(int i=1;i<=n;++i)cin>>a[i]>>b[i]; for(int i=1;i<n;++i)cin>>x>>y,adde(x,y),adde(y,x); ans=0,dfs(1,0); cout<<ans+c[1]<<'\n'; }
E1. The Game (Easy Version)
题意:给一棵树,两人轮流操作,每人可以选择点权小于上一个人选择的点权的点删去它及其整棵子树,不能操作者胜。给出一个先手首次选择可以取胜的点。
按点权从大到小枚举,找到第一个取完后手能继续取的点即可。因为后面的点必然全都是必败点。
const int N=3e5+5; int n,a[N],x,y; vector<int> e[N],o[N]; void adde(int x,int y){ e[x].push_back(y); } int dfn[N],sz[N],id; void dfs(int u,int f){ dfn[u]=++id,sz[u]=1; for(int v:e[u])if(v^f)dfs(v,u),sz[u]+=sz[v]; } struct bit{ int c[N]; void clear(){ memset(c,0,sizeof(int)*(n+1)); } void upd(int x,int y){ for(;x<=n;x+=x&-x)c[x]+=y; } int sum(int x){ int res=0; for(;x;x-=x&-x)res+=c[x]; return res; } int qry(int x){ return sum(dfn[x]+sz[x]-1)-sum(dfn[x]-1); } }T; void solve(){ cin>>n; for(int i=1;i<=n;++i)e[i].clear(),o[i].clear(); T.clear(); for(int i=1;i<=n;++i)cin>>a[i],o[a[i]].push_back(i); for(int i=1;i<n;++i)cin>>x>>y,adde(x,y),adde(y,x); id=0,dfs(1,0); int cnt=0; bool fl=1; for(int i=n;i;--i)if(o[i].size()){ vector<int> tmp; for(int u:o[i]){ if(T.qry(u)==cnt||fl==1)continue; cout<<u<<'\n'; return; } for(int u:o[i])T.upd(dfn[u],1); cnt+=o[i].size(),fl=0; } cout<<"0\n"; }
我愿意追随你的轨迹,不远万里,不问归期
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 展开说说关于C#中ORM框架的用法!