Strategy

1.1 Background

针针喜欢玩一款叫做 DotA (Defense of the Algorithm) 的游戏。——CTSC2018 Day1 T1 假面

1.2 Description

继 8102CSTC 之后,DotA 推出了新的游戏模式。在一场对战中,针针需要面对 \(n(1 ≤n ≤ 4000)\) 个敌人,对于第 i 个敌人针针有如下技能可以选择 (必须选择其中一种):

  • 花费 \(attack_i\) 的代价主动进攻,迫使敌人进入防御状态,使之无法进攻,但是在一场对战中只能攻击 \(k\) 次。
  • 花费 \(defend_i\) 的代价防御防御该敌人的进攻,该技能可以在对战中使用任意多次。
  • 与该敌人结盟。注意,结盟只能对 1 个敌人使用,此时既不能攻击该敌人,也不必防御该敌人的进攻。

现在给定每个敌人的 \(attack\) 和 \(defend\) , 以及最多攻击次数 \(k\), 针针想要知道, 在和第 \(i\) 个敌人结盟的情况下, 他在这一轮对战中最少花费的代价。

1.3 Input Format

第一行一个正整数 \(n(1 ≤ n ≤ 4000)\),表示敌人个数。
接下来 \(n\) 行,每行两个正整数 \(attack_i(1 ≤ attack_i ≤ 10^9)\) 和 \(defend_i(1 ≤ defend_i ≤ 10^9)\) 。

1.4 Output Format

一行 \(n\) 个整数, 第 \(i\) 个数表示和第 \(i\) 个敌人结盟时的最小代价。

1.5 Sample Input

4
1 5
2 3
2 4
3 5

1.6 Sample Output

8 8 7 6

1.7 Guarantee

\(n ≤ 4000\)

分析

贪心题。

1.\(O(n^2)\)

先设所有的全部选 \(attack\) ,再暴力枚举最优方案即可。

2.\(O(n\log n)\)

统计前缀和。
本题标程的复杂度是\(O(n^2\log n)\)……

Code

1.\(O(n^2)\)

#include<cstdio>
#include<algorithm>
#define maxn 40002
using namespace std;
template<typename tp>
tp read(){char c=getchar();bool sgn=0;tp x=0;while((c<'0'||c>'9')&&c!='-')c=getchar();if(c=='-')sgn=1,c=getchar();while(c>='0'&&c<='9'){x=(x<<3)+(x<<1)+c-'0';c=getchar();}return sgn?-x:x;
}
template<typename tp>
void write(const tp x){if(x<0)putchar('-'),write(-x);else{write(x/10);putchar(x%10+'0');}
}
int n,k;
long long a[maxn],sum;
struct data{long long val;int pos;bool operator <(const data& dat)const{return val<dat.val;}
}d[maxn];
int main(){n=read<int>(),k=read<int>();for(int i=1;i<=n;i++){a[i]=read<long long>();d[i].val=read<long long>()-a[i];d[i].pos=i;sum+=a[i];}sort(d+1,d+n+1);for(int i=1;i<=n;i++){long long res=sum-a[i];int j=1,cnt=1;for(;cnt<n-k;j++){if(d[j].pos!=i)res+=d[j].val,cnt++;}for(;j<=n;j++){if(d[j].pos!=i){if(d[j].val<0)res+=d[j].val;else break;}}printf("%lld ",res);}return 0;
}

2.\(O(n\log n)\)

#include<cstdio>
#include<algorithm>
#define maxn 4005
#define INF 100000000000000000ll
using namespace std;
long long read(){char c=getchar();bool sgn=0;long long x=0;while((c<'0'||c>'9')&&c!='-')c=getchar();if(c=='-')sgn=1,c=getchar();while(c>='0'&&c<='9'){x=(x<<3)+(x<<1)+c-'0';c=getchar();}return sgn?-x:x;
}
void write(const long long x){if(x<0)putchar('-'),write(-x);else{if(x>=10)write(x/10);putchar(x%10+'0');}
}
struct node{long long val,pos;
}a[maxn];
inline bool cmp(const node& x,const node& y){return x.val>y.val;
}
long long n,k,at[maxn],c[maxn],de[maxn],dp[maxn],sumd=0,suma=0;
bool b[maxn];
int main(){n=read(),k=read();for(int i=1;i<=n;i++){at[i]=read(),de[i]=read();a[i].val=de[i]-at[i];a[i].pos=i;c[i]=a[i].val;sumd+=de[i];}sort(a+1,a+n+1,cmp);for(int i=1;i<=k;i++){if(a[i].val>0){b[a[i].pos]=1;suma+=a[i].val;}}for(int i=1;i<=n;i++){long long ans=sumd-de[i];if(b[i])ans-=suma-c[i]+(a[k+1].val>0?a[k+1].val:0);else ans-=suma;write(ans),putchar(' ');}return 0;
}

Easy LCA (easy.cpp)

2.1 Background

问: 如何评价 WC2018 和 CTSC2018?
曰: 猫喜欢上树找 LCA。
猫: 我这次有备而来。

2.2 Description

猫喜欢上了你家的苹果树。你家的苹果树是一个以 \(1\) 号点为根的,节点数为 \(n(n ≤ 6*10^5)\)
的有根树。猫想要把树上所有 \(\text{LCA}\) 抓下来,但是他答应,只要你能回答他的一个问题,他就放过你的苹果树。
猫会给你一个长度为 \(n\) 的 \(1\) 到 \(n\) 的排列 \(p\),定义连续子段 \(p[l, r]\) 的权值如下:
\[val[l, r] = depth[lca(pl, pl+1, . . . , pr)]\] 也就是 \(pl, pl+1, . . . , pr\) 的 \(\text{LCA}\) 的深度。他希望求出所有 \(n(n+1)/2\) 个连续子段的权值和 (i.e. \(\sum^n_{i=1}\sum^n_{j=i}val[i, j]\) )。根节点深度为 \(1\)
你正要用苹果树出一道题,所以为了防止猫弄坏你精心设计的苹果树,你决定回答这个问题。

2.3 Input Format

第一行一个正整数 \(n(1 ≤ n ≤ 6*10^5)\) 。
接下来 \(n - 1\) 行,每行两个正整数 \(u_i, v_i(1 ≤ u_i, v_i ≤ n)\) ,代表树上的一条边 \((u, v)\) 。
数据保证输入的是一棵合法的树。
接下来一行包含 \(n\) 个正整数,代表一个 \(1\) 到 \(n\) 的排列 \(p\) 。

2.4 Output Format

输出一行一个整数,表示所求的所有连续子段的权值和。

2.5 Sample Input

6
1 2
2 6
6 3
3 4
6 5
1 2 3 4 5 6

2.6 Sample Output

51

2.7 Guarantee

\(n ≤ 6*10^5\)

分析

观察样例,我们先把相邻点的 \(\text{LCA}\) 求出:
节点 1 2 3 4 5 6
\(\text{LCA}\) 1 2 3 6 6
设求出的序列为 \(l\) ,则 \(l_i\) 表示 \(\text{LCA}_{a_i,a_{i+1}}\) 。\(dep\) 表示节点深度序列。
对于其中任意三个连续节点 \(a_i,a_{i+1},a_{i+2}\) ,我们发现它们的 \(\text{LCA}\) 就是 \[dep[\text{LCA}_{a_i,a_{i+1}}]<dep[\text{LCA}_{a_{i+1},a_{i+2}}]\;?\;\text{LCA}_{a_i,a_{i+1}}:\text{LCA}_{a_{i+1},a_{i+2}}\]
同样,对于任意的 \(k\) 个连续节点,它们的 \(\text{LCA}\) 也可以用类似的方法求出。
于是,我们枚举每一个 \(l_i\) ,算出它左边第一个深度小于它的节点 \(l_j\) 和右边第一个深度小于它的节点 \(l_k\) ,则以 \(l_i\) 为 \(\text{LCA}\) 的所有区间的答案为 \((l_i-l_j+1)*(l_k-l_i+1)*dep[l_i]\) 。
我没发现上面的问题其实就是求一个最大子矩形,用单调栈或其他一些方法 \(O(n)\) 求解即可。
总时间复杂度 \(O(n\log n)\),瓶颈在求 \(\text{LCA}\) 。空间复杂度 \(O(n)\) 。

Code

#include<cstdio>
#include<algorithm>
#define maxn 1200010
using namespace std;
namespace FASTIO{int read(){char c=getchar();bool sgn=0;int x=0;while((c<'0'||c>'9')&&c!='-')c=getchar();if(c=='-')sgn=1,c=getchar();while(c>='0'&&c<='9'){x=(x<<3)+(x<<1)+c-'0';c=getchar();}return sgn?-x:x;}void write(const long long x){if(x<0)putchar('-'),write(-x);else{if(x>=10)write(x/10);putchar(x%10+'0');}}
}
namespace TREE{struct edge{int to,next;};edge e[maxn<<1];int head[maxn],cnte;void add(int u,int v){e[++cnte].to=v;e[cnte].next=head[u];head[u]=cnte;}int n;
}
using TREE::n;
namespace LCA{int lg[maxn],fa[maxn][30],dep[maxn];void initlg(){for(int i=1;i<=n;i++)lg[i]=lg[i-1]+((1<<lg[i-1])==i);}void initdfs(int u,int last){dep[u]=dep[last]+1;fa[u][0]=last;for(int i=1;(1<<i)<dep[u];i++){fa[u][i]=fa[fa[u][i-1]][i-1];}for(int i=TREE::head[u];i;i=TREE::e[i].next){int v=TREE::e[i].to;if(v==last)continue;initdfs(v,u);}}int lca(int x,int y){if(dep[x]<dep[y])swap(x,y);while(dep[x]>dep[y]){x=fa[x][lg[dep[x]-dep[y]]-1];}if(x==y)return x;for(int i=lg[dep[x]];i>=0;i--){if(fa[x][i]!=fa[y][i]){x=fa[x][i];y=fa[y][i];}}return fa[x][0];}
}
namespace STACK{int l[maxn],top,left[maxn],right[maxn],st[maxn];void work1(){top=0;for(int i=1;i<n;i++){while(top&&l[i]<=l[st[top]]){right[st[top]]=i-1;top--;}st[++top]=i;}while(top){right[st[top]]=n-1;top--;}}void work2(){top=0;for(int i=n-1;i>=1;i--){while(top&&l[i]<l[st[top]]){left[st[top]]=i+1;top--;}st[++top]=i;}while(top){left[st[top]]=1;top--;}}
}
int a[maxn];
int main(){n=FASTIO::read();for(int i=1;i<n;i++){int u=FASTIO::read(),v=FASTIO::read();TREE::add(u,v);TREE::add(v,u);}for(int i=1;i<=n;i++)a[i]=FASTIO::read();LCA::initlg();LCA::initdfs(1,0);for(int i=1;i<n;i++)STACK::l[i]=LCA::dep[LCA::lca(a[i],a[i+1])];STACK::work1();STACK::work2();long long ans=0;for(int i=1;i<n;i++)ans+=(long long)(i-STACK::left[i]+1)*(STACK::right[i]-i+1)*STACK::l[i];for(int i=1;i<=n;i++)ans+=LCA::dep[a[i]];FASTIO::write(ans);return 0;
}

转载于:https://www.cnblogs.com/BlogOfchc1234567890/p/9924201.html

xj膜你赛(n-1)相关推荐

  1. cdcqの省选膜你赛

    cdcqの省选膜你赛 比赛当天因为在杠hnoi2016的大数据结构没有参加,今天补了一下.挺好玩的虽然不看一句话题意的话真的卡读题 此生无悔入东方,来世愿生幻想乡 2651. 新史「新幻想史 -现代史 ...

  2. 2017sc 膜你赛9 比赛笔记

    START 这次比赛,应该是倒数第二次吧--[总测试不要来啦~] 一开始看到P1,乍一看没懂.转看P2,发现就是组合数.然而题目数据量很大,怎么办?我想到了公式变形,C(n,m)=A(n,m) /m! ...

  3. 1114-1115膜你赛

    day1: T1: Jzyz的信息学竞赛带动五科竞赛的发展,202x年暑期举行大规模的竞赛招新活动. 现在有N组学生要参加学科竞赛,现在已经知道每组学生的学生个数,学校要求每组的人数不能超过R,不得低 ...

  4. 2019山东夏令营摸鱼记

    Day 0 早上九点赶到学校,发现直接从门口出发--结果没有拿学习的书,尴尬 坐上车之后就直接出发了,发现有几个博园的小朋友,他们一路上闹得真欢,连睡觉都睡不着 下午一点,到达了山外--山东外国语职业 ...

  5. genicam 相机java,机器视觉必知-GenICam相机通用接口标准

    机器视觉必知-GenICam相机通用接口标准 GenICam(相机通用接口): 一种通用软件接口 通用相机接口标准 目前机器视觉行业所使用的相机几乎均以相同方式来进行配置,即:---通过在注册表中的读 ...

  6. ただの南條きみつだ。

    标题借用了 南條愛乃 的 Twitter ID 格式,旨在记录 NOIp 2018 前后一个多月的事情-- 已经好久没写日记了,和自己的约定也所剩无几了,要说心血来潮于是便去做的事情有很多,但做到最后 ...

  7. 只是为了纪念机房颓废的日子

    #2018.7.14 嗯,今天放暑假.早晨跑操的时候被老爸接走了,还以为我可以放暑假.结果九点就把我送回来了.看着他们一个个的拖着箱子,真是羡慕. 回到机房,听说一二区放假,原本以为我们也会放假,内心 ...

  8. 2021.7 纪中快乐游记(上)

    DayDayDay 0:0:0: 7.117.117.11 早上睡个懒觉起来发现没球看,有点不爽. 然后瞎晃了一会收拾了一下行李. 吃饭前弹了会琴,假装保持一下手感. 吃完饭又睡大觉,下午两点就起来了 ...

  9. [BZOJ5224]毁灭

    菜的真实,今天打膜泥赛,想了半天只想到了 ( T n 2 ) (Tn^2) (Tn2)的暴力做法,30分本来觉得还可以了,神仙直接 A A A了,自闭了. 30分:我们发现 O r z Orz Orz ...

最新文章

  1. 解决了一个遗留的Portlet奇怪问题
  2. FaceBook AI大牛贾扬清传离职,将加入中国公司
  3. Gabor滤波器的特征提取C++实现
  4. STM32开发 -- 低功耗模式详解(1)
  5. android设置通知在屏幕横幅显示,Android推送通知横幅未显示在某些设备中
  6. android通讯录简单的_安卓手机删了联系人怎么恢复?超简单的恢复方法,一看就懂!...
  7. 终极人机大战要来了?AI打星际2即将直播,DeepMind暴雪发出神秘预告
  8. 二十七、K8s最小服务漏洞1-PSP
  9. yarn 安装使用小记
  10. denoiser插件_最新版AE/PR红巨人调色降噪插件合集 Magic Bullet Suite 13.0.9 Win/Mac
  11. python实现邮件客户端_SMTP邮件客户端Python
  12. JAVA计算机毕业设计中药分类管理系统Mybatis+源码+数据库+lw文档+系统+调试部署
  13. WWW2022推荐系统/计算广告论文集锦
  14. 一起来学习网站SEO优化工作流程到底怎么做?
  15. Excel2010中安装MegaStat插件 MegaStat for Excel2010(2007也适用)
  16. php去除首尾符号,PHP如何去除头尾字符
  17. n叉树的遍历递归实现
  18. 利用TrinityCore 框架的搭建魔兽世界私服
  19. python三国演义人物出场统计_Python分析《三国演义》人物出场次数,孔明第二,赵云第五...
  20. idea打断点变成灰色斜杠

热门文章

  1. 关于阿里云视频点播出现的问题
  2. 【资源汇总】OpenGL
  3. 区块链、NFT与元宇宙中的稀缺性技术
  4. 手机上怎么将图片转换成PDF
  5. 智慧小区智慧物业管理系统一体化解决方案
  6. unity全局总的音频管理器
  7. React学习的小总结(一)
  8. 英语六级试卷软件测试,背单词软件_2018年12月英语六级考试真题测试(11)含答案_沪江英语...
  9. 安卓投屏神器scrcpy
  10. 2021-05-20英文科技论文写作与学术报告Lecture 3习题答案