当前位置: 首页 > news >正文

Atto Round 1 (Codeforces Round 1041, Div. 1 + Div. 2) C、D、E

C. Trip Shopping

可以发现,Ali只要找到改变量最小的那两对,然后一直选那两对即可,

而对于一组数,我们先进行调整,我们默认a存的是晓得那组,那么我们就可以发现,每组数都可以形成一个区间,而当两个区间相交的时候,这两个区间无论怎么变化都没办法增大答案,那么这一定是Ali的首选,相反如果没有区间相交,我们就去找区间相隔距离最短的长度之后ans就是这个长度乘二+原来的答案就行了

Code:

#include<bits/stdc++.h>
using namespace std;
#define inf 0x3f3f3f3f
#define maxns 1145141
#define maxn 114
typedef long long ll;
typedef unsigned long long ull;
typedef pair<int, int> pii;
void solve(){
ll n,k,sum=0;
cin>>n>>k;
vector<int>a(n+1);vector<pii>b(n+1);
for (int i=1;i<=n;i++){
cin>>a[i];
}
for (int i=1;i<=n;i++){int tmp1,tmp2;
cin>>tmp1;tmp2=a[i];if (tmp1>tmp2) swap(tmp1,tmp2);
sum+=tmp2-tmp1;b[i]=make_pair(tmp1,tmp2);}
sort(b.begin(),b.end());
int mini=inf,maxi=-0x3f3f3f3f;for (int i=1;i<=n;i++){
if (b[i].first<=maxi) {printf("%lld\n",sum);return;} mini=min(mini,b[i].first-maxi);
maxi=max(maxi,b[i].second);}
printf("%lld\n",sum+2ll*mini);
}
int main (){
std::ios::sync_with_stdio(false);std::cin.tie(nullptr);int t;cin>>t;while (t--){
solve();}
}

D. Root was Built by Love, Broken by Destiny

这里我们需要注意到,图中的桥是不能相交的,这就意味着没有环形的存在,也就是说形成的图案必然是一棵树。

如果而且对于一个非叶子节点,我们会散射出一些点,那么这些点当且只当父亲节点为根时,最多只能有两个非叶子节点的子节点,除此之外,都最多只能有一个叶子节点(靠边放),剩下的叶子节点就直接阶乘就行了

Code:

#include<bits/stdc++.h>
#define int long long
#define re register
#define inl inline
#define pii pair<int,int>
using namespace std;
inl int read() {int sum=0,f=1;char c=getchar();while(!isdigit(c)) {if(c=='-') f=-1;c=getchar();}while(isdigit(c)) {sum=(sum<<3)+(sum<<1)+(c^48);c=getchar();}return sum*f;
}
const int mod=1e9+7;
const int N=2e5+10;
int fac[N];
inl void init() {fac[0]=1;for(re int i=1;i<=N-1;i++) fac[i]=fac[i-1]*i%mod;return;
}
inl void solve() {int n=read(),m=read();vector<int> g[n+10],ind(n+10,0);int ans=0;for(re int i=1;i<=m;i++) {int u=read(),v=read();g[u].push_back(v);g[v].push_back(u);ind[u]++;ind[v]++;}int tmp=1;if(m!=n-1) {puts("0");return;}for(re int i=1;i<=n;i++) {if(ind[i]>1) {tmp=i;break;}}ans=2;function<int(int, int, int)> dfs = [&](int u, int fa, int s) {int res1=0,res2=0;for(int v : g[u]) {if(v==fa) continue;res1+=dfs(v,u,1);res2++;}if(res2==0) return 0;if(res1>s){ans=0;return 1;}if(res2<=s) {ans=(ans*res2)%mod;}else {ans=(ans*fac[res2-res1])%mod;if(res1) {ans=ans*s%mod;}}return 1;};dfs(tmp,0,2);cout<<ans<<endl;
}
signed main() {init();int T=read();while(T--) {solve();}return 0;
}

E. Ancient Tree

我们贪心的去想问题,如果一个点满足有col[x]==col[y]那么,这个点最好就的选择就是等于col[x]

如果满足多个col话,那么其实这个点就一定是cute的

而如果这个点等于col[x]的话,那么对于他的祖宗节点,并不会改变答案,因为如果如果选了这个点其实就相当于选了它的子节点~~

这里是处理最小值的部分,剩下的就是染色:

我们一定要遵循一个约定——一个节点如果染色,那么它的颜色一定属于它的子树中的颜色,这样可以使它如果被祖宗节点选择的话也相当于选择了它的子节点

那么我们是不是只用跑一遍dfs就能处理出染色的情况?

答案是不可能的:考虑到有可能有子树全为0的情况,这时候,我们选择这个子树顶点祖宗的元素是符合答案构造,所以还需要再跑一遍dfs去避免这种情况,从而保证每个节点都被染色

Code:

#include<bits/stdc++.h>
#define int long long
#define re register
#define inl inline
#define pii pair<int,int>
using namespace std;
inl int read() {int sum=0,f=1;char c=getchar();while(!isdigit(c)) {if(c=='-') f=-1;c=getchar();}while(isdigit(c)) {sum=(sum<<3)+(sum<<1)+(c^48);c=getchar();}return sum*f;
}
const int mod=1e9+7;
const int N=2e5+10;
int fac[N];
inl void init() {fac[0]=1;for(re int i=1;i<=N-1;i++) fac[i]=fac[i-1]*i%mod;return;
}
inl void solve() {int n=read(),k=read();vector<int> w(n+10,0),col(n+10,0),p(n+10,0),g[n+10];int ans=0;for(re int i=1;i<=n;i++) w[i]=read();for(re int i=1;i<=n;i++) col[i]=read();set<int> cols[n+1];for(re int i=1;i<n;i++) {int u=read(),v=read();g[u].push_back(v);g[v].push_back(u);}function<void(int,int)> dfs = [&] (int u,int fa) {set<int> s;for(int v : g[u]) {if(v==fa) continue;dfs(v,u);if(cols[u].size() < cols[v].size()) {swap(cols[u], cols[v]);}for(int it : cols[v]) {if(it&&cols[u].find(it)!=cols[u].end()) {s.insert(it);}cols[u].insert(it);}}if(s.size()>=2||(s.size()==1&&col[u]!=0&&col[u]!=*s.begin())) {ans+=w[u];if(col[u]) p[u]=col[u];else p[u]=*s.begin();}else {if(s.size()==1) {if(col[u]) p[u]=col[u];else p[u]=*s.begin();}else {if(col[u]) p[u]=col[u];else {for(int it : cols[u]) {if(it) {p[u]=it;}}if(u==1&&p[u]==0) {p[u]=1;}}}}cols[u].insert(col[u]);};dfs(1,0);function<void(int,int,int)> dfs2 = [&](int u,int fa,int c) {if(p[u]) c=p[u];if(!col[u]) col[u]=c;for(int v : g[u]) {if(v==fa) continue;dfs2(v,u,c);}};dfs2(1,1,0);cout<<ans<<endl;for(re int i=1;i<=n;i++) cout<<col[i]<<" ";puts("");return;
}
signed main() {int T=read();while(T--) {solve();}return 0;
}

菜菜菜菜菜菜菜菜菜菜菜菜菜菜菜菜菜菜菜菜菜菜菜菜菜菜菜菜菜菜菜菜菜菜菜菜菜菜菜菜菜菜菜菜菜菜菜菜菜菜菜菜菜菜菜菜菜菜菜菜菜菜菜菜菜菜菜菜菜菜菜菜菜菜菜菜菜菜菜菜菜菜菜菜菜菜菜菜菜菜菜菜菜菜菜菜菜菜菜菜菜菜菜菜菜菜菜菜菜菜菜菜菜菜菜菜菜菜菜菜菜菜菜菜菜菜菜菜菜菜菜菜菜菜菜菜菜菜菜菜菜菜菜菜菜菜菜菜菜菜菜菜菜菜菜菜菜菜菜菜菜菜菜菜菜菜菜菜菜菜菜菜菜菜菜菜菜菜菜菜菜菜菜菜菜菜菜菜菜菜菜菜菜菜菜菜菜菜菜菜菜菜菜菜菜菜菜菜菜菜菜菜菜菜菜菜菜菜菜菜菜菜菜菜菜菜菜菜菜菜菜菜菜菜菜菜菜菜菜菜菜菜菜菜菜菜菜菜菜菜菜菜菜菜菜菜

http://www.dtcms.com/a/323061.html

相关文章:

  • 数码管的使用(STC8)
  • 美股高频分时Tick数据分钟级解析
  • Leetcode-19. 删除链表的倒数第 N 个结点
  • 机器学习第七课之支持向量机SVM
  • 【线性代数】线性方程组与矩阵——(3)线性方程组解的结构
  • 如何在 Windows 下使用 WSL 安装 Ubuntu 并配置国内镜像
  • 力扣前200题字符串总结
  • 差分放大电路分析与仿真
  • 阿里Qwen-Image本地部署详细指南
  • 机器翻译正则化技术详解:防止过拟合的有效方法
  • 推客系统开发全攻略:从架构设计到高并发实战
  • 【Python 高频 API 速学 ⑤】
  • 软考 系统架构设计师系列知识点之杂项集萃(120)
  • 使用jlink-gdb-server 加 gdb调试嵌软2
  • 2025年SEVC SCI2区,基于深度强化学习与模拟退火的多无人机侦察任务规划,深度解析+性能实测
  • 压力传感器选型铁三角:介质·安全·精度
  • 多模型动态路由框架实践:提升推理效率与资源利用率的技术方案
  • 数据结构5.(哈希表及数据的排序和查找算法)
  • GPT-5的4个缺点
  • 数据结构初阶(7)树 二叉树
  • 使用qemu运行与GDB调试内核
  • 解决python错误:playwright._impl._errors.TimeoutError: Timeout 30000ms exceeded.
  • STM32——时钟系统
  • BMS三大领域:电池、楼宇与业务管理系统解析
  • STranslate(翻译OCR工具) v1.5.4.801绿色版,屏幕文字秒译,OCR识别零门槛
  • C++ unordered_map 和 unordered_set 的使用
  • 神经网络-local minima and saddle point
  • 【linux基础】Linux目录和Windows目录的区别
  • ACF插件编辑器无法插入相册的原因及解决方案
  • 黑马点评07 - 附近商户/用户签到/UV统计