牛客CSP-S提高组赛前集训营3 赛后总结
货物收集
二分答案.复杂度\(O(n\log n)\).
货物分组
用费用提前计算的思想,考虑用一个新的箱子来装货物会发生什么.
显然费用会加上后面的所有货物的总重.
\(60\)分的\(O(n^2)\)DP代码:
#include<bits/stdc++.h>
#define LL long long
const int SIZE=100005,INF=0x3F3F3F3F;
int n;
LL W,A[SIZE],sum[SIZE];
LL DP[SIZE];
using std::max;
using std::min;
struct Seg_Tree
{
#define LC(x) (x<<1)
#define RC(x) (x<<1|1)
#define Mid ((L+R)>>1)
LL Max[SIZE*4],Min[SIZE*4];
void push_up(int x)
{
Max[x]=max(Max[LC(x)],Max[RC(x)]);
Min[x]=min(Min[LC(x)],Min[RC(x)]);
}
void Build(int x,int L,int R)
{
if(L==R){Max[x]=Min[x]=A[L];return;}
Build(LC(x),L,Mid);
Build(RC(x),Mid+1,R);
push_up(x);
}
LL Query_Max(int x,int L,int R,int X,int Y)
{
if(L>Y||R<X)return -INF;
if(L>=X&&R<=Y)return Max[x];
return max(Query_Max(LC(x),L,Mid,X,Y),Query_Max(RC(x),Mid+1,R,X,Y));
}
LL Query_Min(int x,int L,int R,int X,int Y)
{
if(L>Y||R<X)return INF;
if(L>=X&&R<=Y)return Min[x];
return min(Query_Min(LC(x),L,Mid,X,Y),Query_Min(RC(x),Mid+1,R,X,Y));
}
}T;
int main()
{
scanf("%d%lld",&n,&W);
for(int i=1;i<=n;i++)
{
scanf("%lld",&A[i]);
sum[i]=sum[i-1]+A[i];
}
T.Build(1,1,n);
memset(DP,0x3F,sizeof(DP));
DP[0]=0;
for(int i=1;i<=n;i++)
for(int k=i-1;k>=0&&sum[i]-sum[k]<=W;k--)
DP[i]=min(DP[i],DP[k]+sum[n]-sum[k]+T.Query_Max(1,1,n,k+1,i)-T.Query_Min(1,1,n,k+1,i));
printf("%lld",DP[n]);
return 0;
}
地形计算
无向图三元环/四元环的套路题吧.由于我太菜了,还去现学了三/四元环.
[笔记] 三元环 && 四元环计数 - LuitaryiJack的博客园
三/四元环的统计主要思想是Meet in the Middle,也就是把一个环拆成两个部分.从一个点开始标记环的一半,然后再尝试匹配另外一半.如果在尝试匹配的过程中遇到了一个标记过的点,那么这两半就可以拼成一个环.
(此处应有BGMThe Middle)
这么来看,时间复杂度是\(O(n^2)\)的,但是如果按照某种顺序来找环的话,时间复杂度可以降到\(O(m \sqrt{m})\).
我们可以按以下规则给所有点排名:
- 度数小的节点排在度数大的节点的前面.
- 度数相同的节点,编号小的排在前面.
然后,给每一条无向边定向.
- 如果寻找三元环,从排名大的连向排名小的.
- 如果寻找四元环,从排名小的连向排名大的.
最后则统计答案,按照上面的规则定向后,每一个环只会被统计一次.
如果寻找三元环,则对于每一个\(u\),标记它的出点\(v\).然后枚举出点\(v\),再枚举\(v\)的出点\(w\),如果\(w\)被标记,则\((u,v,w)\)形成三元环.
如果寻找四元环,则对于每一个点\(u\),枚举原图中\(u\)的出点\(v\),再枚举重定向图中\(v\)的出点\(w\).标记\(w\).然后再次枚举原图中\(u\)的出点\(v\),枚举重定向图中\(v\)的出点\(w\),如果\(w\)被标记,则形成(可能不止一个)四元环.交换"原图"与"重定向图"的枚举顺序也是可以的.不过,为了保证每个四元环只被计数一次,上述操作必须要求
Rank[w]>Rank[u].
本题只是将四元环计数改成了四元环求和,算法本质没有变化,只是在"标记"的时候把个数改成权值和即可.
#include<bits/stdc++.h>
using namespace std;
const int SIZE=100005,Mod=1e9+7;
#define LL long long
#define pb push_back
LL A[SIZE];
int n,m,Deg[SIZE],ID[SIZE],Rnk[SIZE],Cnt[SIZE];
LL Ans,C[SIZE];
vector<int>G1[SIZE],G2[SIZE];
bool cmp(int A,int B)
{
return Deg[A]==Deg[B]?A<B:Deg[A]<Deg[B];
}
int main()
{
scanf("%d%d",&n,&m);
for(int i=1;i<=n;i++)
scanf("%lld",&A[i]);
int u,v;
for(int i=1;i<=m;i++)
{
scanf("%d%d",&u,&v);
G1[u].pb(v);
G1[v].pb(u);
}
for(int i=1;i<=n;i++)
{
ID[i]=i;
Deg[i]=G1[i].size();
}
sort(ID+1,ID+1+n,cmp);
for(int i=1;i<=n;i++)
Rnk[ID[i]]=i;
for(int u=1;u<=n;u++)
for(int v:G1[u])
if(Rnk[v]>Rnk[u])
G2[u].pb(v);
for(int u=1;u<=n;u++)
{
for(int v:G1[u])
for(int w:G2[v])
if(Rnk[w]>Rnk[u])
{
Ans=(Ans+C[w]+1LL*Cnt[w]*A[v])%Mod;
C[w]=(C[w]+A[u]+A[w]+A[v])%Mod;
++Cnt[w];
}
for(int v:G1[u])
for(int w:G2[v])
if(Rnk[w]>Rnk[u])
{
C[w]=0;
Cnt[w]=0;
}
}
printf("%lld",Ans);
return 0;
}
牛客CSP-S提高组赛前集训营3 赛后总结的更多相关文章
- 牛客网CSP-S提高组赛前集训营Round4
牛客网CSP-S提高组赛前集训营 标签(空格分隔): 题解 算法 模拟赛 题目 描述 做法 \(BSOJ6377\) 求由\(n\)长度的数组复制\(k\)次的数组里每个连续子序列出现数字种类的和 对 ...
- 牛客CSP-S提高组赛前集训营4 赛后总结
复读数组 分成 3 种区间算答案: 一个块内的区间 两个块交界处,长度小于块长的区间 长度不小于块长的区间 对于第三种区间,容易发现每个区间的权值一样,只需要算出个数即可. 对于前两种空间,我的思路是 ...
- 牛客CSP-S提高组赛前集训营5 赛后总结
A.无形的博弈 心理题. 答案为\(2^n\),可感性理解结论的正确性. #include<bits/stdc++.h> #define LL long long const LL Mod ...
- 牛客CSP-S提高组赛前集训营2 赛后总结
比赛链接 A.服务器需求 维护每天需要的服务器数量的全局最大值(记为\(Max\))和总和(记为\(sum\)),那么答案为: \[max(Max,\lceil\dfrac{sum}{m}\rceil ...
- 牛客CSP-S提高组赛前集训营1
牛客CSP-S提高组赛前集训营1 比赛链接 官方题解 before:T1观察+结论题,T2树形Dp,可以换根或up&down,T3正解妙,转化为图上问题.题目质量不错,但数据太水了~. A-仓 ...
- 牛客CSP-S提高组赛前集训营3
A 货物收集 显然是一个二分答案的题. #include<iostream> #include<cstdio> #include<cstring> #include ...
- 牛客CSP-S提高组赛前集训营2 ———— 2019.10.31
比赛链接 期望得分:100+20+20 实际得分:40+20+30 awa cccc T1 :基于贪心的思路,然后开始爆搜(雾 那必然是会死的,好吧他就是死了 #include<iostrea ...
- 牛客CSP-S提高组赛前集训营1———2019.10.29 18:30 至 22:00
期望得分:100+0+10 实际得分:40+0+0 考炸了... T1:题目链接 究竟为什么会这样,,, 仔细研读我的丑代码 发现... 枯辽.... #include<cstdio> # ...
- 牛客CSP-S提高组赛前集训营2 T2沙漠点列
原题链接 算法不难,比赛的时候就和cyc大佬一起yy了正解,不过因为交的时候比较急(要回寝室惹),我有两数组开错大小直接爆到50,cyc大佬则只把文件输入关了一半,直接爆零(╯ ̄Д ̄)╯┻━┻ 要尽量 ...
随机推荐
- Java日志介绍(4)-Log4j2
Log4j2是Log4j的升级版,相比其前身Log4j 1.x提供了显著的改进,并提供了在Logback中提供的许多改进,同时修复了Logback体系结构中的一些固有问题. Log4j2的内容很多,本 ...
- Java基础之六、Java编程思想(8-10)
八.多态 多态(也称作动态绑定.后期绑定或运行时绑定) 域(成员变量)是不具有多态性的,只有普通的方法调用是多态的,任何域访问操作都将由编译器解析,因此不是多态的 静态方法也是不具有多态性的 publ ...
- Explain执行计划与索引优化实践
一.何为explain执行计划? 使用explain关键字可以模拟优化器执行SQL语句,从而知道MySQL是如何使用索引来处理你的SQL查询语句以及连接表,可以分析查询语句或是结构的性能瓶颈,帮助我们 ...
- JS淘宝小广告
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8 ...
- vue实现打印功能
通过npm 安装插件 1.安装 npm install vue-print-nb --save 2.引入 安装好以后在main.js文件中引入 import Print from 'vue-pri ...
- 获取Windows平台下 安装office 版本位数信息
最近在处理客户端安装程序过程,有一个需求:需要检测Windows平台下安装office 版本信息以及获取使用的office是32 位还是64 位: 当检测出office 位数为64位时,提示当前off ...
- StackExchange.Redis 系列 1:基础使用
本系列博文已经全部完成,完整系列请访问:https://blog.zhuliang.ltd/tags/StackExchange-Redis%E7%B3%BB%E5%88%97/ 本文转自:https ...
- Selenium实战(六)——数据驱动应用
一.数据驱动 由于大多数文章和资料都把“读取数据文件”看做数据驱动的标志,下面创建一个baidu_data.csv文件: 文件第一列为测试用例名称,第二列为搜索的关键字.接下来创建test_baidu ...
- springBoot 与 springMVC的区别
springMVC 1.是基于Servlet的一个MVC框架(DispatcherServlet.ModelAndView.ViewResolver),解决web开发问题 缺点是 :配置复杂 要简化使 ...
- java 相关书籍介绍
自己做开发也有两年多了吧,其中也关注过许多大牛的博客,买过许多的书看. 自己也是个比较爱阅读的人,从小的时候被老爸逼着每次寒暑假看书,到后来慢慢长大爱上了阅读,习惯了看书. 农村的小孩吗,那时候又不像 ...