T1、商品

因为边界 l , r 是线性移动的,所以答案可以线性改变,直接用set维护连续段(小于l的和大于r的)的个数,并维护ans即可。

因为set的一个小错误调了两个小时,代码打成了一坨,结果最后改完了但是没交上。

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
#define int ll
typedef pair<int,int> pii;
#define fi first
#define se second
#define ps emplace_back
#define mk make_pair
const int N=1e6+10;
inline ll read(){
char c=getchar();ll x=0,f=1;
while(!isdigit(c))(c=='-'?f=-1:f=1),c=getchar();
while(isdigit(c))x=(x<<1)+(x<<3)+(c^48),c=getchar();
return x*f;
}
int n,d,a[N],b[N];
vector<int> v[N];
struct jj{
mutable int l,r;
inline bool operator <(const jj&x)const{return l<x.l;}
};
set<jj>s,s1;
inline void ins(int pos){
auto it=s.insert({pos,pos}).fi,man=it;
if((++man)!=s.end()){
++it;
if(it->l==pos+1){
// ans-=a[pos]-max(la,a[pos+1]);
it->l=pos;
auto i=it;
s.erase(--i);
}
else --it;
// else ans-=a[pos+1]-a[pos];
}
if(it!=s.begin()){
int r=it->r;
--it;
if(it->r==pos-1){
// ans-=a[pos]-max(la,a[pos-1]);
it->r=r;
s.erase(++it);
}
// else ans-=a[pos-1]-a[pos];
}
}
inline void del(int pos){
auto it=s1.lower_bound({pos,pos});
if(it==s1.end()||it->l>pos)--it;
if(it->l!=pos){
// ans-=min(la,a[pos-1])-a[pos];
int l=it->l;
it->l=pos,s1.insert({l,pos-1});
}
if(it->r!=pos){
// ans-=min(la,a[pos+1])-a[pos];
int r=it->r;
it->r=pos;s1.insert({pos+1,r});
}
s1.erase({pos,pos});
}
ll ans=0,anss=0;
main(){
#ifndef ONLINE_JUDGE
freopen("goods.in","r",stdin);
freopen("goods.out","w",stdout);
#endif
//ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);
n=read(),d=read();
for(int i=1;i<=n;++i){
b[i]=a[i]=read();
}
// for(int i=1;i<n;++i)
// ans+=abs(a[i]-a[i+1]);
sort(b+1,b+1+n);
int n1=unique(b+1,b+1+n)-b-1;
// cout<<b[2]<<endl;
for(int i=1;i<=n;++i){
int pos=lower_bound(b+1,b+1+n1,a[i])-b;
v[pos].ps(i);
}
s1.insert({1,n});
b[0]=b[1];
for(int i=1,k=1,l,r;i<=n1;++i){
l=b[i],r=l+d;
ans-=2ll*s.size()*(b[i]-b[i-1]);
if(s.size()){
auto it=s.begin();
if(it->l==1ll)ans+=b[i]-b[i-1];
auto itt=s.rbegin();
if(itt->r==n)ans+=b[i]-b[i-1];
}
for(auto j:v[i])ins(j);
while(k<=n1&&b[k]<=r){
ans+=2ll*s1.size()*(b[k]-b[k-1]);
if(s1.size()){
auto it=s1.begin();
if(it->l==1)ans-=b[k]-b[k-1];
auto itt=s1.rbegin();
if(itt->r==n)ans-=b[k]-b[k-1];
}
for(auto j:v[k]){
del(j);
}
++k;
}
if(k>n1){
anss=max(ans,anss);break;
}
ll ko=ans;
ko+=2ll*s1.size()*(r-b[k-1]);
if(s1.size()){
auto it=s1.begin();
if(it->l==1)ko-=r-b[k-1];
auto itt=s1.rbegin();
if(itt->r==n)ko-=r-b[k-1];
}
anss=max({ans,ko,anss});
}
s.clear(),s1.clear();
s1.insert({1,n});
b[n1+1]=b[n1];
ans=0;
for(int i=n1,l,r,k=n1;i;--i){
r=b[i],l=r-d;
ans-=2ll*s.size()*(b[i+1]-b[i]);
if(s.size()){
auto it=s.begin();
if(it->l==1ll)ans+=b[i+1]-b[i];
auto itt=s.rbegin();
if(itt->r==n)ans+=b[i+1]-b[i];
}
for(auto j:v[i])ins(j);
while(k&&b[k]>=l){
ans+=2ll*s1.size()*(b[k+1]-b[k]);
if(s1.size()){
auto it=s1.begin();
if(it->l==1)ans-=b[k+1]-b[k];
auto itt=s1.rbegin();
if(itt->r==n)ans-=b[k+1]-b[k];
}
for(auto j:v[k])del(j);
--k;
}
if(k<=0){
anss=max(ans,anss);break;
}
ll ko=ans;
ko+=2ll*s1.size()*(b[k+1]-l);
if(s1.size()){
auto it=s1.begin();
if(it->l==1)ko-=b[k+1]-l;
auto itt=s1.rbegin();
if(itt->r==n)ko-=b[k+1]-l;
}
anss=max(anss,ko);
}
cout<<anss;
}

T2、价值

\[\Huge 学会读题
\]

首先第一句话可以保证每两颗相邻的树之间的标号是连续的,所以对于叶子节点来说只需要关注最小的和最大的。

那么dp数组只记相关节点的状态即可。f[i][0/1][0/1][0/1]表示对于以i点为根节点的子树内i、最小的叶子节点、最大的叶子节点选没选就可以转移了。

然后就是大力分讨,但分了一个下午也没分出来,最后发现直接递推无需分讨。

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef pair<int,int> pii;
#define fi first
#define se second
#define ps emplace_back
#define mk make_pair
const int N=1e5+10;
const ll mod=998244353;
inline ll read(){
char c=getchar();ll x=0,f=1;
while(!isdigit(c))(c=='-'?f=-1:f=1),c=getchar();
while(isdigit(c))x=(x<<1)+(x<<3)+(c^48),c=getchar();
return x*f;
}
ll f[100005][2][2][2],n,xiao[N],da[N];
vector<int> son[N];
ll man[2][2][2];
int main(){
#ifndef ONLINE_JUDGE
freopen("value.in","r",stdin);
freopen("value.out","w",stdout);
#endif
//ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);
n=read();
for(int i=2;i<=n;++i){
son[read()].ps(i);
}
for(int i=n;i;--i){
if(!son[i].size())
xiao[i]=da[i]=i;
else {
xiao[i]=n+1;
for(auto j:son[i])
xiao[i]=min(xiao[i],xiao[j]),da[i]=max(da[i],da[j]);
}
}
for(int i=n;i;--i){
if(!son[i].size())f[i][0][0][0]=1;
else{
int j=son[i][0];
for(int l1=0;l1<2;++l1)
for(int l2=0;l2<2;++l2){
f[i][0][l1][l2]=(f[j][0][l1][l2]+f[j][1][l1][l2])%mod;
if(j!=xiao[i])f[i][1][l1][l2]=f[j][0][l1][l2];
}
if(j==da[j])(f[i][1][1][1]+=f[j][0][0][0])%=mod;
for(int k=1;k<son[i].size();++k){
int j=son[i][k];
memcpy(man,f[i],sizeof(man));
f[i][0][0][0]=f[i][0][0][1]=f[i][0][1][0]=f[i][0][1][1]=f[i][1][0][0]=f[i][1][0][1]=f[i][1][1][0]=f[i][1][1][1]=0;
bool f1=(k==1&&xiao[son[i][0]]==da[son[i][0]]),f2=(xiao[j]==da[j]),f3=(j==da[j]);
for(int l1=0;l1<2;++l1){
for(int l2=0;l2<2;++l2){
for(int l3=0;l3<2;++l3){
for(int r1=0;r1<2;++r1){
for(int r2=0;r2<2;++r2){
for(int r3=0;r3<2;++r3){
int i1,i2,i3;
//0 0
i1=l1,i2=l2,i3=r3;
(f[i][i1][i2][i3]+=(man[l1][l2][l3]*f[j][r1][r2][r3])%mod)%=mod;
//0 1
if(!l3&&!r2){
i1=l1,i2=l2|f1,i3=r3|f2;
(f[i][i1][i2][i3]+=(man[l1][l2][l3]*f[j][r1][r2][r3]%mod))%=mod;
}
//1 0
if(!l1&&!r1){
i1=1,i2=l2,i3=r3|f3;
(f[i][i1][i2][i3]+=(man[l1][l2][l3]*f[j][r1][r2][r3]%mod))%=mod;
}
//1 1
if(!l1&&!r1&&!l3&&!r2&&!f3){
i1=1,i2=l2|f1,i3=r3|f2|f3;
(f[i][i1][i2][i3]+=(man[l1][l2][l3]*f[j][r1][r2][r3]%mod))%=mod;
}
}
}
}
}
}
}
}
}
}
ll ans=0;
for(int i=0;i<2;++i)
for(int j=0;j<2;++j)
for(int k=0;k<2;++k)
ans+=f[1][i][j][k];
if(da[1]!=xiao[1])ans+=f[1][0][0][0]+f[1][1][0][0];
cout<<ans%mod; }

T3、货币

题解说是网络流的切糕模型板子,没学呢,先挂个标记。

T4、资本

生成函数。(我要是把网络流和多项式弄懂了就学这个)

[========]

[========]

今天也被薄纱了,开题策略确实有问题,可能看题不够深吧,patience。

9.24 csp(没学会的网络流)的更多相关文章

  1. Libre 6012 「网络流 24 题」分配问题 (网络流,费用流)

    Libre 6012 「网络流 24 题」分配问题 (网络流,费用流) Description 有n件工作要分配给n个人做.第i个人做第j件工作产生的效益为\(c_{ij}\).试设计一个将n件工作分 ...

  2. Libre 6011 「网络流 24 题」运输问题 (网络流,最小费用最大流)

    Libre 6011 「网络流 24 题」运输问题 (网络流,最小费用最大流) Description W 公司有m个仓库和n个零售商店.第i个仓库有\(a_i\)个单位的货物:第j个零售商店需要\( ...

  3. LibreOJ 6004. 「网络流 24 题」圆桌聚餐 网络流版子题

    #6004. 「网络流 24 题」圆桌聚餐 内存限制:256 MiB时间限制:5000 ms标准输入输出 题目类型:传统评测方式:Special Judge 上传者: 匿名 提交提交记录统计讨论测试数 ...

  4. liberOJ#6006. 「网络流 24 题」试题库 网络流, 输出方案

    #6006. 「网络流 24 题」试题库     题目描述 假设一个试题库中有 n nn 道试题.每道试题都标明了所属类别.同一道题可能有多个类别属性.现要从题库中抽取 m mm 道题组成试卷.并要求 ...

  5. [网络流24题] COGS 750 栅格网络流

    750. 栅格网络流 ★★☆   输入文件:flowa.in   输出文件:flowa.out   简单对比时间限制:1 s   内存限制:128 MB [问题描述] Bob 觉得一般图的最大流问题太 ...

  6. [cogs736][网络流24题#13]星际转移[网络流,网络判定]

    将一个空间站分为天数个点,每次枚举天数,每增加一天就把对应天数的边连上,用网络流判定可行性,即-判断最大流是否不小于k,注意编号不要错位.通过此题,可见一些网络流题目需要用到网络判定方法,但虽然答案具 ...

  7. Qt 状态机框架学习(没学会)

    Qt状态机框架是基于状态图XML(SCXML) 实现的.从Qt4.6开始,它已经是QtCore模块的一部分.尽管它本身是蛮复杂的一套东西,但经过和Qt的事件系统(event system).信号槽(s ...

  8. 学了3天EOS, 其它没学会,就学会了发私人数字币

    关于 EOS的 铸币及发币(以下是精华)                                                                    张永@CoinXP 以下 ...

  9. [cogs396] [网络流24题#4] 魔术球 [网络流,最大流,最小路径覆盖]

    本题枚举每多一个球需要多少个柱子,可以边加边边计算,每次只需要判断$i-Dinic()$即可:特别注意边界. #include <iostream> #include <algori ...

  10. [cogs729] [网络流24题#5] 圆桌聚餐 [网络流,最大流,多重二分图匹配]

    建图:从源点向单位连边,边权为单位人数,从单位向圆桌连边,边权为1,从圆桌向汇点连边,边权为圆桌容量. #include <iostream> #include <algorithm ...

随机推荐

  1. 【FastDFS】环境搭建 03 FastDFS & Nginx整合

    FastDFS & Nginx整合: 跟踪器结合Nginx,目的是为了负载均衡和高可用,只有一台Track可以不配置Nginx 安装FastDFS-Nginx-Module到服务器上面: ta ...

  2. NVIDIA公司在实体机器人上的第一步尝试 —— Nova Cater AMR —— 九号机器人与英伟达联合开发的自动驾驶研发平台“Nova Cater AMR(简称:NC)”

    相关: https://www.leiphone.com/category/robot/Hgy9i8azqGncESIB.html Nova Cater AMR是一款仓储运货机器人,可以应用在仓储物流 ...

  3. 【转载】 你真的理解Python中MRO算法吗?

    来自:www.xymlife.com 作者: XYM 链接:http://www.xymlife.com/2016/05/22/python_mro/ (点击阅读原文前往) ------------- ...

  4. CF1992场题解

    Only Pluses 算法:数学. 题意简述:有三个数,每次选择一个数 \(x\),使得 \(x\) 增加一,至多操作 \(5\) 次,最后求出这三个数的乘积最大值. 简单题,一眼秒了.考虑把这 \ ...

  5. Tesla 开发者 API 指南:BLE 密钥 – 身份验证和车辆命令

    注意:本工具只能运行于 mac 或者 linux, win下不支持. 1. 克隆项目到本地 https://github.com/teslamotors/vehicle-command.git 2. ...

  6. uni-app 小程序 前置摄像头

    在小程序拍照的话,uni.chooseImage()可以直接调取摄像头拍照,而如果要调用前置摄像头,这个api就没有提供了. 在查找官方文档发现,可以通过camera有提供这么一个组件,页面内嵌的区域 ...

  7. WSL2

    Ref: Windows Subsystem for Linux Installation Guide for Windows 10 Windows Subsystem for Linux 2: Th ...

  8. 消息队列为什么选用redis?聊聊如何做技术方案选型?

    消息队列为什么选用redis?聊聊如何做技术方案选型? 老生常谈,消息队列主要有几大用途: 解耦:下单完成之后,需要订单服务去调用库存服务减库存,调用营销服务加营销数据. 引入消息队列,可以把订单完成 ...

  9. in notin exists not exists 性能优化算法总结

    in notin exists not exists 性能优化算法总结 1.1. in 和 exists 区别 1.2. not in 能不能走索引 1.3. not in 和 join 的关系 1. ...

  10. Zabbix-(1)安装

    环境: VMware Workstation Pro 16.0 版本 系统 Centos7 内存 2G 处理器 1G 硬盘 20G 网络适配器 NAT 服务器地址:192.168.220.40 1.安 ...