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. linux测试cpu性能的命令

    linux测试cpu性能的命令 在Linux中,可以使用多种命令来测试CPU性能.以下是一些常用的命令: stress: 一个通用的压力测试工具,可以生成CPU.内存.IO等负载. 安装: sudo ...

  2. TensorFlow图像预处理函数

    预处理图像 文件名:       cat.jpg 读取.打印图片 import matplotlib.pyplot as plt import tensorflow as tf import nump ...

  3. mybatis-plus自动生成代码

    1.背景 本教程将介绍如何使用 mybatis-plus 工具自动给我们生成 Controller.Service.Entity.Mapper.Mapper.xml 层代码; 给出一个便于于学习理解的 ...

  4. Apache DolphinScheduler 与 AWS 的 EMR/Redshift 集成实践分享

    引言 这篇文章将给大家讲解关于DolphinScheduler与AWS的EMR和Redshift的集成实践,通过本文希望大家能更深入地了解AWS智能湖仓架构,以及DolphinScheduler在实际 ...

  5. 在LCD上的任意位置显示一张任意大小的jpg图片

    /************************************************* * * file name:lcdshowjpg.c * author :momolyl@126. ...

  6. JNA使用入门

    JNA即Java Native Access. 官方主页 代码仓库 官方样例 maven中心仓库主页 官方文档 Getting Started Functional Description. Mapp ...

  7. sublime text _正则表达式01

    概述 sublime 常用正则表达式 预备工作:打开sublime之后,ctrl+h,点选使用正则表达式. (\S+) :匹配所有符号外的字符 用到的地方: 小明 小黄 小红 (构造批量插入sql语句 ...

  8. macOS 查看网络接口信息

    networksetup -listallhardwareports 执行结果: Hardware Port: Ethernet Adapter (en4) Device: en4 Ethernet ...

  9. Java并发编程之验证volatile的可见性

    Java并发编程之验证volatile的可见性 通过系列文章的学习,凯哥已经介绍了volatile的三大特性.1:保证可见性 2:不保证原子性 3:保证顺序.那么怎么来验证可见性呢?本文凯哥将通过代码 ...

  10. MyBatis 从入门到放弃 ( MyBatis基础总结 )

    目录 MyBatis历史 Mybatis特性 MyBatis下载 和其它持久化层技术对比 开发环境 创建maven工程 创建MyBatis的核心配置文件 创建mapper接口 创建MyBatis的映射 ...