7月15日考试 题解(链表+状压DP+思维题)
前言:蒟蒻太弱了,全打的暴力QAQ。
---------------------
T1 小Z的求和
题目大意:求$\sum\limits_{i=1}^n \sum\limits_{j=i}^n kth\max(a_i,a_{i+1},\cdots ,a_j)+kth\min(a_i,a_{i+1},\cdots ,a_j)$。其中$kthmax$指第$k$大,$kthmin$指第$k$小。
听hs-black说是链表维护,时间复杂度是$O(nk)$。然而并不会做……听了听学长的讲解。
对于这类问题,我们肯定是考虑每个元素对于答案的贡献的。(不然绝对会T飞
考虑$a[i]$从大到小添加,那么当有新加入的元素时,数轴为这样(假设$k=4$):
红色为已经加入的元素,蓝色为新加入的元素,紫色是合法区间。

然后这个长度为$k$的区间从左到右移动,每次对于答案的贡献为$a[x]*(l-pre[l])*(nxt[r]-r)$。当所有贡献统计完后删除这个结点。
考虑到从大到小添加不易维护前驱和后缀,我们采用从小到大删除的方法,用链表维护。对于$kthmax$和$kthmin$只需相同方法求两遍就行了。时间复杂度$O(nk)$。
代码:
#include<bits/stdc++.h>
#define int long long
using namespace std;
const int mod=;
int n,k,a[],pos[],ans;
int nxt[],pre[];
inline int read()
{
int x=,f=;char ch=getchar();
while(!isdigit(ch)){if (ch=='-') f=-;ch=getchar();}
while(isdigit(ch)){x=x*+ch-'';ch=getchar();}
return x*f;
}
bool cmp(int x,int y){return a[x]<a[y];}
inline void work()
{
for (int i=;i<=n;i++) nxt[i]=i+,pre[i]=i-;
for (int i=;i<=n;i++)
{
int l=pos[i],r=pos[i],cnt=;
for (;cnt<k;cnt++)
{
if (pre[l]) l=pre[l];
else break;
}
for (;cnt<k;cnt++)
{
if (nxt[r]<=n) r=nxt[r];
else break;
}
if (cnt==k)
{
while(l<=pos[i])
{
if (r==n+) break;
ans+=a[pos[i]]*(nxt[r]-r)*(l-pre[l])%mod;
ans%=mod;
l=nxt[l],r=nxt[r];
}
}
pre[nxt[pos[i]]]=pre[pos[i]];
nxt[pre[pos[i]]]=nxt[pos[i]];
}
}
signed main()
{
n=read(),k=read();
for (int i=;i<=n;i++) a[i]=read(),pos[i]=i;
sort(pos+,pos+n+,cmp);
work();
reverse(pos+,pos+n+);
work();
printf("%lld",ans%mod);
return ;
}
T2 关押罪犯
题目大意:给定一张$n$个点,$m$条边的无向图。现在要求将这些点分成几组,每组边数不能超过$k$,且最小化分组数量。求分组最小值。
状压DP。然而我爆搜也能水不少分,$n\leq 16$。挂个$dfs$的代码吧。
代码:
#include<bits/stdc++.h>
using namespace std;
int n,m,k,a[][],ans=;
inline void dfs(int now,int cnt,int sum,int start)
{
if (now==n){
int tot=;
for (int i=start;i<n;i++) if (a[i][now]) tot++;
if (cnt+tot<=k) ans=min(ans,sum);
else ans=min(ans,sum+);
return;
}
int tot=;
for (int i=start;i<now;i++) if (a[i][now]) tot++;
dfs(now+,,sum+,now+);
if (cnt+tot<=k) dfs(now+,cnt+tot,sum,start);
}
int main()
{
cin>>n>>m>>k;
for (int i=;i<=m;i++)
{
int x,y;cin>>x>>y;
a[x][y]=a[y][x]=;
}
dfs(,,,);
cout<<ans;
return ;
}
T3 CF348D Turtles
引理:LGV定理。完全不会。听wyx大佬说可以不用定理,因为只有两条路径直接做就可以。
其实是一道思维题。
题意可以简化为从$(1,2)$到$(n-1,m)$和从$(2,1)$到$(n,m-1)$的路径不相交的方案数。然后,本题的精髓来了:
如果两条路径有相交,那么可以理解为这种情况是从$(1,2)$到$(n,m-1)$和从$(2,1)$到$(n-1,m)$的路径。这种情况是不合法的。所以我们只需要一步容斥一下,那么答案就是:
$calc(1,2,n-1,m)*calc(2,1,n,m-1)-calc(1,2,n,m-1)*clac(2,1,n-1,m)$
代码难度普及-,思维难度提高+。
代码:
//calc(1,2,n-1,m)*calc(2,1,n,m-1)-calc(2,1,n-1,m)*calc(1,2,n,m-1)
#include<bits/stdc++.h>
#define int long long
using namespace std;
const int mod=1e9+;
long long n,m,f[][];
char vis[][];
inline int calc(int a,int b,int c,int d)
{
memset(f,,sizeof(f));
for (int i=a;i<=c;i++)
for (int j=b;j<=d;j++)
{
if (vis[i][j]=='.'){
if (i==a&&j==b) f[i][j]=;
else f[i][j]=(f[i-][j]+f[i][j-])%mod;
}
}
return f[c][d];
}
signed main()
{
cin>>n>>m;
for (int i=;i<=n;i++) scanf("%s",vis[i]+);
int t1=calc(,,n-,m),t2=calc(,,n,m-);
int t3=calc(,,n,m-),t4=calc(,,n-,m);
cout<<((t1*t2%mod-t3*t4%mod)+mod)%mod;
return ;
}
7月15日考试 题解(链表+状压DP+思维题)的更多相关文章
- 3月21日考试 题解(数据结构+区间DP+贪心)
前言:T3写挂了,有点难受. --------------- T1 中位数 题意简述:给你一段长度为$n$的序列,分别输出$[1,2k-1]$的中位数$(2k-1\leq n)$. --------- ...
- bzoj 2669 题解(状压dp+搜索+容斥原理)
这题太难了...看了30篇题解才整明白到底咋回事... 核心思想:状压dp+搜索+容斥 首先我们分析一下,对于一个4*7的棋盘,低点的个数至多只有8个(可以数一数) 这样的话,我们可以进行一个状压,把 ...
- BZOJ 1087 题解【状压DP】
1087: [SCOI2005]互不侵犯King Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 3112 Solved: 1816[Submit][ ...
- noi省选 [九省联考2018]一双木棋题解(状压dp)
比浙江简单多了........ 题目转送:https://www.luogu.org/problemnew/show/P4363 分析: 我们注意到n和m都很小,考虑一下状压dp. 显然,棋子摆成的形 ...
- 【NOIP2017】宝藏 题解(状压DP)
题目描述 参与考古挖掘的小明得到了一份藏宝图,藏宝图上标出了 nnn 个深埋在地下的宝藏屋, 也给出了这 nnn 个宝藏屋之间可供开发的m mm 条道路和它们的长度. 小明决心亲自前往挖掘所有宝藏屋中 ...
- LibreOJ 6177 题解(状压DP)
题面 传送门 分析 刚看到这道题时想的是跟最短哈密顿路类似的二进制状压DP,先用floyd处理距离 但是此题用二进制不够,应该用三进制 0,1,2分别表示未送,正在送,已送完 dp[s][i]表示当前 ...
- 【FZYZOJ】愚人节礼物 题解(状压DP)
前言:麻麻我会写状压DP了! ---------------------------- 题目描述 愚人节到了!可爱的UOI小朋友要给孩子们送礼物(汗-原题不是可爱的打败图么= =..).在平面直角坐标 ...
- 【SCOI2005】互不侵犯 题解(状压DP)
前言:一道状压DP的入门题(可惜我是个DP蒟蒻QAQ) ------------------ 题意简述:求在一个$n*n$的棋盘中放$k$个国王的方案数.注:当在一个格子中放入国王后,以此格为中心的九 ...
- POJ 3254 - Corn Fields - [状压DP水题]
题目链接:http://poj.org/problem?id=3254 Time Limit: 2000MS Memory Limit: 65536K Description Farmer John ...
随机推荐
- 微信解密encryptedDataStr获取用户信息
A:<button open-type="getPhoneNumber" bindgetphonenumber="getPhoneNumber">& ...
- .NET程序运行原理及基本概念详解
一.引言 我们知道在Java中有虚拟机,代码运行时虚拟机把Java语言编译成与机器无关的字节码,然后再把字节码编译成机器指令执行,那么在.NET中程序是如何运行的呢?其实运行原理是一样的,.NET中的 ...
- Django框架05 /orm单表操作
Django框架05 /orm单表操作 目录 Django框架05 /orm单表操作 1. orm使用流程 2. orm字段 3. orm参数 4. orm单表简单增/删/改 5. orm单表查询 5 ...
- Flex移动布局中单行和双行布局的区别以及使用
这里是单行布局 使用ul>li 来布局 <ul class="local-nav"> <li> <a ...
- SonarQube+Jenkins+Cppcheck实现C++代码扫描
背景:公司部分项目是由C++进行开发,因此对此有需求. sonarqube:docker化安装(alpine系统),版本8.3.1 (build 34397) jenkins:docker化安装,版本 ...
- OGG19.1 oracle12c到oracle12c经典模式配置实施
OGG19.1 oracle12c到oracle12c经典和集成模式配置实施 目的说明 本文提供Oracle GoldenGate在Oracle db到Oracle db的数据复制安装配置指导,适用于 ...
- 手写SpringBoot自动配置及自定义注解搭配Aop,实现升级版@Value()功能
背景 项目中为了统一管理项目的配置,比如接口地址,操作类别等信息,需要一个统一的配置管理中心,类似nacos. 我根据项目的需求写了一套分布式配置中心,测试无误后,改为单体应用并耦合到项目中.项目中使 ...
- 关于maven的一份小笔记
简介 项目里一直用的 maven,几乎天天和这个"熟知"的工具打交道,但是,最近我发觉自己对 maven 了解的还不够,例如,什么是 goal?什么是 phase?等等.趁着最近有 ...
- DJANGO-天天生鲜项目从0到1-009-搜索功能实现(django-haystack+whoosh+jieba)
本项目基于B站UP主‘神奇的老黄’的教学视频‘天天生鲜Django项目’,视频讲的非常好,推荐新手观看学习 https://www.bilibili.com/video/BV1vt41147K8?p= ...
- jmeter之断言、数据提取器(正则表达式、jsonpath、beanshell)、聚合报告、参数化
ctx - ( JMeterContext) - gives access to the context vars - ( JMeterVariables) - gives read/write ac ...