我觉得,不改变也很好。

前言

这题太难了,场上竟然无人切题。。(听说别的学校切题的人不少。。

T1 选择

解题思路

范围比较小,并且每个边的度也比较小,因此考虑 树形DP+状压 。

大概就是对于每一个节点可以从它的子树连接到外面的路径显然只有一条。

他每两个儿子节点的子树中可以通过它连接的也是只有一条,

因此我们记录每一个子树中没有用过的节点,每次按上述方法匹配两个子结点的子树相连的路径。

同时也要统计子树中没有用过的节点到现在 DP 到的子树根节点是否有一条路径。

对于每一棵子树分别记录贡献就好了,对于子树内的 DP 转移可以通过枚举子集来实现。

code

#include<bits/stdc++.h>
#define int long long
#define ull unsigned long long
#define f() cout<<"Failed"<<endl
using namespace std;
inline int read()
{
int y;scanf("%lld",&y);return y;
int x=0,f=1;char ch=getchar();
while(ch>'9'||ch<'0'){if(ch=='-')f=-1;ch=getchar();}
while(ch>='0'&&ch<='9'){x=(x<<1)+(x<<3)+(ch^48);ch=getchar();}
return x*f;
}
const int N=1e3+10;
int n,ans,m,f[N][(1<<10)+10];
bool vis[N][N];
vector<int> v[N],emp[N];
void add_edge(int x,int y){v[x].push_back(y);}
void dfs(int x,int fa)
{
for(int i=0;i<v[x].size();i++) if(v[x][i]!=fa) dfs(v[x][i],x);
for(int i=0;i<v[x].size();i++)
{
int to1=v[x][i];if(to1==fa) continue;
for(int j=0;j<emp[to1].size();j++)
for(int p=i+1;p<v[x].size();p++)
{
int to2=v[x][p];if(to2==fa) continue;
for(int q=0;q<emp[to2].size();q++)
if(vis[emp[to1][j]][emp[to2][q]])
{
f[x][(1<<i)|(1<<p)]=1;
break;
}
}
}
for(int i=0;i<v[x].size();i++)
for(int j=0;j<emp[v[x][i]].size();j++)
if(vis[x][emp[v[x][i]][j]])
f[x][1<<i]=1;
int U=(1<<v[x].size())-1;
for(int sta=1;sta<=U;sta++)
for(int i=sta;i;i=(i-1)&sta)
f[x][sta]=max(f[x][sta],f[x][i]+f[x][i^sta]);
ans+=f[x][U];
for(int i=0;i<v[x].size();i++)
if(f[x][U]==f[x][U^(1<<i)])
for(int j=0;j<emp[v[x][i]].size();j++)
emp[x].push_back(emp[v[x][i]][j]);
emp[x].push_back(x);
}
signed main()
{
freopen("select.in","r",stdin); freopen("select.out","w",stdout);
n=read(); for(int i=1,x,y;i<n;i++) x=read(),y=read(),add_edge(x,y),add_edge(y,x);
m=read(); for(int i=1,x,y;i<=m;i++) x=read(),y=read(),vis[x][y]=vis[y][x]=true;
dfs(1,0); printf("%lld",ans); return 0;
}

T2 表格

解题思路

code

#include<bits/stdc++.h>
#define int long long
#define ull unsigned long long
#define f() cout<<"Failed"<<endl
using namespace std;
inline int read()
{
int x=0,f=1;char ch=getchar();
while(ch>'9'||ch<'0'){if(ch=='-')f=-1;ch=getchar();}
while(ch>='0'&&ch<='9'){x=(x<<1)+(x<<3)+(ch^48);ch=getchar();}
return x*f;
}
const int mod=1e9+7;
int n,m,ans,l,r;
struct Node{int x,y;}f[10],g[10],h[10];
int power(int x,int y){x=x%mod; y=y%(mod-1);int temp=1;while(y){if(y&1) temp=temp*x%mod;x=x*x%mod; y>>=1;}return temp;}
int F(int x){return (n-x)*(x-1)%mod;} int G(int x){return (m-x)*(x-1)%mod;}
void init_f(){f[0]=(Node){2,F(2)};for(int i=1;i<4;i++) f[i]=(Node){i+2,(f[i-1].y+F(i+2))%mod};}
void init_g(){g[0]=(Node){2,G(2)};for(int i=1;i<4;i++) g[i]=(Node){i+2,(g[i-1].y+G(i+2))%mod};}
int Gi(int x)
{
int rec=0; x=x%mod;
for(int i=0,sum=g[i].y;i<4;i++,sum=g[i].y)
{
for(int j=0;j<4;j++)
if(i!=j)
sum=sum*power(g[i].x-g[j].x+mod,mod-2)%mod*(x-g[j].x+mod)%mod;
rec=(rec+sum)%mod;
}
return rec;
}
void init_h(int x){h[0]=(Node){2,F(2)*Gi(x-2)%mod};for(int i=1;i<7;i++) h[i]=(Node){i+2,(h[i-1].y+F(i+2)*Gi(x-i-2))%mod};}
int Fi(int x)
{
int rec=0; x=x%mod;
for(int i=0,sum=f[i].y;i<4;i++,sum=f[i].y)
{
for(int j=0;j<4;j++)
if(i!=j)
sum=sum*power(f[i].x-f[j].x+mod,mod-2)%mod*(x-f[j].x+mod)%mod;
rec=(rec+sum)%mod;
}
return rec;
}
int Hi(int x)
{
int rec=0; x=x%mod;
for(int i=0,sum=h[i].y;i<7;i++,sum=h[i].y)
{
for(int j=0;j<7;j++)
if(i!=j)
sum=sum*power(h[i].x-h[j].x+mod,mod-2)%mod*(x-h[j].x+mod)%mod;
rec=(rec+sum)%mod;
}
return rec;
}
int solve(int lim)
{
ans=0; init_h(lim/2);
if(min(lim/2-m,n-1)-2>=0) ans=Fi(min(lim/2-m,n-1))*Gi(m-1)%mod;
if(max(2ll,min(lim/2-m,n-1)+1)<=min(n-1,lim/2)) ans=(ans+Hi(min(n-1,lim/2))-Hi(max(2ll,min(lim/2-m,n-1)+1)-1)+mod)%mod;
return 6*ans%mod;
}
signed main()
{
freopen("table.in","r",stdin); freopen("table.out","w",stdout);
n=read(); m=read(); l=read(); r=read(); init_f(); init_g();
printf("%lld",(solve(r)-solve(l-1)+mod)%mod);
return 0;
}

T3 黑白

大坑未补

T4 打怪

解题思路

CDQ 维护斜率

每只怪需要被攻击的时间是 \(c_i=\lfloor\dfrac{d_i-1}{b}\rfloor+1\)

如果没有秒杀操作的话显然是按照 \(\dfrac{c_i}{a_i}\) 从小到大进行攻击。

对于秒杀操作的话,如果只秒杀一只怪伤害值就会减少:

\[\displaystyle e_i=a_i\sum_{j=1}^{i-1}c_j+a_i\times(c_i-1)+c_i\sum_{j=i+1}^na_j
\]

那么我们就可以对于一只已经确定要秒杀的怪 i 而言, 再秒杀 j 比秒杀 k 更优的条件是:

\[e_i+e_j-c_j\times a_i>e_k+e_i-c_k\times a_i,(j,k<i,c_j>c_k)
\]

也就是 \(\dfrac{e_j-e_k}{c_j-c_k}<a_i\)

斜率优化,CDQ处理,左区间按照 c 排序,右区间按照 a 排序,因为要去纵截距也就是 e 最大,因此维护一个上凸包。

code

#include<bits/stdc++.h>
#define int long long
#define ull unsigned long long
#define f() cout<<"Failed"<<endl
using namespace std;
inline int read()
{
int x=0,f=1;char ch=getchar();
while(ch>'9'||ch<'0'){if(ch=='-')f=-1;ch=getchar();}
while(ch>='0'&&ch<='9'){x=(x<<1)+(x<<3)+(ch^48);ch=getchar();}
return x*f;
}
const int N=3e5+10,INF=1e18;
int n,b,ans=INF,prec[N],sufa[N],sta[N],sum;
struct Node{int a,c,d,e;bool friend operator < (Node x,Node y){return x.c*y.a<y.c*x.a;}}s[N];
bool comp1(Node x,Node y){return x.a>y.a;}
bool comp2(Node x,Node y){return x.c<y.c;}
double xl(Node x,Node y){return (1.0*x.e-1.0*y.e)/(1.0*x.c-1.0*y.c);}
void CDQ(int l,int r)
{
if(l==r) return ; int mid=(l+r)>>1,top=0;
CDQ(l,mid); CDQ(mid+1,r);
sort(s+l,s+mid+1,comp2); sort(s+mid+1,s+r+1,comp1);
for(int i=l;i<=mid;i++)
{
while(top>1&&(s[sta[top]].e-s[i].e)*(s[sta[top-1]].c-s[sta[top]].c)>=(s[sta[top-1]].e-s[sta[top]].e)*(s[sta[top]].c-s[i].c)) top--;
sta[++top]=i;
}
for(int i=mid+1,j=1;i<=r;i++)
{
while(j<top&&xl(s[sta[j+1]],s[sta[j]])>=s[i].a) j++;
ans=min(ans,sum-(s[i].e+s[sta[j]].e-s[sta[j]].c*s[i].a));
}
}
signed main()
{
freopen("fittest.in","r",stdin); freopen("fittest.out","w",stdout);
n=read(); b=read();
for(int i=1;i<=n;i++)s[i].a=read(),s[i].d=read(),s[i].c=(s[i].d-1)/b+1; sort(s+1,s+n+1);
for(int i=1;i<=n;i++) prec[i]=prec[i-1]+s[i].c;
for(int i=n;i>=1;i--) sufa[i]=sufa[i+1]+s[i].a;
for(int i=1;i<=n;i++) sum+=(prec[i]-1)*s[i].a;
for(int i=1;i<=n;i++) s[i].e=s[i].a*prec[i-1]+s[i].a*(s[i].c-1)+s[i].c*sufa[i+1];
CDQ(1,n); printf("%lld",ans); return 0;
}

NOIP模拟54的更多相关文章

  1. Noip模拟54 2021.9.16

    T1 选择 现在发现好多题目都是隐含的状压,不明面给到数据范围里,之凭借一句话 比如这道题就是按照题目里边给的儿子数量不超过$10$做状压,非常邪门 由于数据范围比较小,怎么暴力就怎么来 从叶子节点向 ...

  2. CH Round #54 - Streaming #5 (NOIP模拟赛Day1)

    A.珠 题目:http://ch.ezoj.tk/contest/CH%20Round%20%2354%20-%20Streaming%20%235%20(NOIP模拟赛Day1)/珠 题解:sb题, ...

  3. NOIP模拟17.9.22

    NOIP模拟17.9.22 前进![问题描述]数轴的原点上有一只青蛙.青蛙要跳到数轴上≥

  4. NOIP模拟 17.8.17

    NOIP模拟17.8.17 A 小 G 的字符串文件名 输入文件 输出文件 时间限制 空间限制str.pas/c/cpp str.in str.out 1s 128MB[题目描述]有一天,小 L 给小 ...

  5. NOIP 模拟4 T2

    本题属于二和一问题 子问题相互对称 考虑对于问题一:知a求b 那么根据b数组定义式 显然能发现问题在于如何求dis(最短路) 有很多算法可供选择 dijsktra,floyed,bfs/dfs,spf ...

  6. 2021.9.17考试总结[NOIP模拟55]

    有的考试表面上自称NOIP模拟,背地里却是绍兴一中NOI模拟 吓得我直接文件打错 T1 Skip 设状态$f_i$为最后一次选$i$在$i$时的最优解.有$f_i=max_{j<i}[f_j+a ...

  7. NOIP模拟赛20161022

    NOIP模拟赛2016-10-22 题目名 东风谷早苗 西行寺幽幽子 琪露诺 上白泽慧音 源文件 robot.cpp/c/pas spring.cpp/c/pas iceroad.cpp/c/pas ...

  8. contesthunter暑假NOIP模拟赛第一场题解

    contesthunter暑假NOIP模拟赛#1题解: 第一题:杯具大派送 水题.枚举A,B的公约数即可. #include <algorithm> #include <cmath& ...

  9. NOIP模拟赛 by hzwer

    2015年10月04日NOIP模拟赛 by hzwer    (这是小奇=> 小奇挖矿2(mining) [题目背景] 小奇飞船的钻头开启了无限耐久+精准采集模式!这次它要将原矿运到泛光之源的矿 ...

  10. 大家AK杯 灰天飞雁NOIP模拟赛题解/数据/标程

    数据 http://files.cnblogs.com/htfy/data.zip 简要题解 桌球碰撞 纯模拟,注意一开始就在袋口和v=0的情况.v和坐标可以是小数.为保险起见最好用extended/ ...

随机推荐

  1. 重新整理 .net core 实践篇—————应用层[三十]

    前言 简单介绍一下应用层. 正文 应用层用来做什么的呢? 应用层用来做处理api请求的. [HttpPost] public Task<long> CreateOrder([FromBod ...

  2. windows server 出现.net 3.5安装不上去

    前言 有人说为什么到了现在还有人用.net 3.5呢?其实我也不用,主要是mmsql安装的时候要用到. 正文 一般我们不同电脑在程序和功能中添加,如果添加不上会弹出一个自动获取的一个过程,这时我们点击 ...

  3. 力扣69(java&python)-x的平方根(简单)

    题目: 给你一个非负整数 x ,计算并返回 x 的 算术平方根 . 由于返回类型是整数,结果只保留 整数部分 ,小数部分将被 舍去 . 注意:不允许使用任何内置指数函数和算符,例如 pow(x, 0. ...

  4. 力扣560(java&python)-和为k的子数组(中等)

    题目: 给你一个整数数组 nums 和一个整数 k ,请你统计并返回 该数组中和为 k 的连续子数组的个数 . 示例 1: 输入:nums = [1,1,1], k = 2输出:2示例 2: 输入:n ...

  5. 行业 SaaS 微服务稳定性保障实战

    简介: 对于Tob企业而言,稳定性即是生命线.那么,面对商户数目暴增, C 端场景业务不断扩展呢,F6汽车科技又是如何搭建可观测体系呢?一线负责人深度解读实际演进过程! 很多研发人员在日常工作中经常回 ...

  6. Delta Lake在Soul的应用实践

    简介: 传统离线数仓模式下,日志入库前首要阶段便是ETL,我们面临如下问题:天级ETL任务耗时久,影响下游依赖的产出时间:凌晨占用资源庞大,任务高峰期抢占大量集群资源:ETL任务稳定性不佳且出错需凌晨 ...

  7. Inclavare Containers:云原生机密计算的未来

    ​简介:本文为你详细的梳理一次 Inclavare Containers 项目的发展脉络,解读它的核心思想和创新技术. ​ 作为业界首个面向机密计算场景的开源容器运行时,Inclavare Conta ...

  8. DLF +DDI 一站式数据湖构建与分析最佳实践

    简介: 本文由阿里云数据湖构建 DLF 团队和 Databricks 数据洞察团队联合撰写,旨在帮助您更深入地了解阿里云数据湖构建(DLF)+Databricks 数据洞察(DDI)构建一站式云上数据 ...

  9. [PHP] composer, PHP Fatal error: Allowed memory size of xx bytes exhausted

    终端执行 composer 命令时经常会遇到内存不够的情况. 视情况升级一下 composer,使用 composer self-update. 默认 php 的内存限制是 128M,临时取消 php ...

  10. OpenAI未至,Open-Sora再度升级!已支持生成16秒720p视频

    Open-Sora 在开源社区悄悄更新了!现在支持长达 16 秒的视频生成,分辨率最高可达 720p,并且可以处理任何宽高比的文本到图像.文本到视频.图像到视频.视频到视频和无限长视频的生成需求.我们 ...