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 ...
随机推荐
- Socket模拟Web服务器
效果如下: 源码下载地址:https://github.com/doyoulaikeme/DotNetSample/tree/master/DotNetSample3/SocketWebServer
- JVM 专题二十二:垃圾回收(六)垃圾回收器 (三)
4. GC日志分析 4.1 日志分析 通过阅读GC日志,我们可以了解Java虚拟机内存分配与回收策略. 内存分配与垃圾回收的参数列表-XX:+PrintGC:输出GC日志.类似-verbose: gc ...
- Resource exhausted: OOM when allocating tensor with shape[3,3,384,384] and type float on /job:localhost/replica:0/task:0/device:GPU:0 by allocator GPU_0。。。。。
报错信息: OP_REQUIRES failed at assign_op.h:111 : Resource exhausted: OOM when allocating tensor with sh ...
- 项目管理:如何显性管理并提升Story分解能力
引言: 在“DevOps能力之屋(CapabilitiesHouse of DevOps)”中,华为云DevCloud提出(工程方法+最佳实践+生态)×工具平台=DevOps能力.华为云DevClou ...
- 使用数据泵(expdp、impdp)迁移数据库流程
转载原文地址为:http://blog.itpub.net/26736162/viewspace-2652256/ 使用数据泵迁移数据库流程 How To Move Or Copy A Databas ...
- Nginx使用SSL模块配置https
背景 开发微信小程序,需要https域名,因此使用Nginx的SSL模块配置https 步骤 一.去域名管理商(如腾讯云.阿里云等)申请CA证书 二.在Nginx中配置,一般情况下域名管理商会提供配置 ...
- xenomai内核解析---内核对象注册表—xnregistry(重要组件)
1. 概述 上篇文章xenomai内核解析--同步互斥机制(一)--优先级倒置讲到,对于所有内核对象: xnregistry:保存内核对象,提供内核对象存储和快速检索. xnsynch:资源抽象,提供 ...
- vscode 无法自动补全第三方库
点击Settings 找到“Extentions”下的“Python”,点击“Auto Completes: Extra Paths”的“Edit in settings.json”,如下图: 在se ...
- jenkins集群(三) -- master和slave配置git
一.Linux(master)上安装git 1.运行命令:yum -y install git 2.git的默认安装目录是: 二.给Linux下Git配置好秘钥(公钥 + 私钥) 1.添加用户和密码 ...
- F - Maximal Intersection --------暴力求解题
You are given n segments on a number line; each endpoint of every segment has integer coordinates. S ...