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 ...
随机推荐
- 从0开始,手把手教你用Vue开发一个答题App
项目演示 项目演示 项目源码 项目源码 教程说明 本教程适合对Vue基础知识有一点了解,但不懂得综合运用,还未曾使用Vue从头开发过一个小型App的读者.本教程不对所有的Vue知识点进行讲解,而是手把 ...
- AutoJS 实现QQ小游戏胡莱三国爬塔
AutoJS 开发文档参考 环境 安卓QQ 胡莱三国小游戏 AutoJS APP 使用方法 安装AutoJs,打开无障碍模式,进入到胡莱三国小游戏,在Autojs中执行脚本 代码 "auto ...
- redis cluster info显示cluster_state:fail解决方案
1.查看错误信息: 1.1 错误信息(1) 127.0.0.1:7000> get name (error) CLUSTERDOWN The cluster is down 127.0.0.1: ...
- javascript基础(六): 获取节点实例 jquery获取当前节点的前一个节点
jquery获取当前节点的前一个节点步骤如下: 1.打开html开发工具,新建一来个html代码页面. 2.在html页面创建三个p标签,然后给这三个p标签设置不同的2113内容. 3.引入jquer ...
- Django 【基础篇】
前戏 python Web程序 众所周知,对于所有的Web应用,本质上其实就是一个socket服务端,用户的浏览器其实就是一个socket客户端. #!/usr/bin/env python #cod ...
- 迎难而上ArrayList,源码分析走一波
先看再点赞,给自己一点思考的时间,思考过后请毫不犹豫微信搜索[沉默王二],关注这个长发飘飘却靠才华苟且的程序员.本文 GitHub github.com/itwanger 已收录,里面还有技术大佬整理 ...
- J.U.C体系进阶(四):juc-sync 同步器框架
Java - J.U.C体系进阶 作者:Kerwin 邮箱:806857264@qq.com 说到做到,就是我的忍道! juc-sync 同步器框架 同步器名称 作用 CountDownLatch 倒 ...
- 数据结构C语言实现----出栈操作
代码如下: #include<stdio.h> #include<stdlib.h> typedef struct { char *base; char *top; int s ...
- 史上最全SpringBoot整合Mybatis案例
摘要:如果小编说,SpringBoot是目前为止最好的框架,应该没有人会反驳吧?它的出现使得我们很容易就能搭建一个新应用.那么,SpringBoot与其他第三方框架的整合必定是我们需要关注的重点. 开 ...
- JVM——内存区域:运行时数据区域详解
关注微信公众号:CodingTechWork,一起学习进步. 引言 我们经常会被问到一个问题是Java和C++有何区别?我们除了能回答一个是面向对象.一个是面向过程编程以外,我们还会从底层内存管理 ...