前言:蒟蒻太弱了,全打的暴力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+思维题)的更多相关文章

  1. 3月21日考试 题解(数据结构+区间DP+贪心)

    前言:T3写挂了,有点难受. --------------- T1 中位数 题意简述:给你一段长度为$n$的序列,分别输出$[1,2k-1]$的中位数$(2k-1\leq n)$. --------- ...

  2. bzoj 2669 题解(状压dp+搜索+容斥原理)

    这题太难了...看了30篇题解才整明白到底咋回事... 核心思想:状压dp+搜索+容斥 首先我们分析一下,对于一个4*7的棋盘,低点的个数至多只有8个(可以数一数) 这样的话,我们可以进行一个状压,把 ...

  3. BZOJ 1087 题解【状压DP】

    1087: [SCOI2005]互不侵犯King Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 3112  Solved: 1816[Submit][ ...

  4. noi省选 [九省联考2018]一双木棋题解(状压dp)

    比浙江简单多了........ 题目转送:https://www.luogu.org/problemnew/show/P4363 分析: 我们注意到n和m都很小,考虑一下状压dp. 显然,棋子摆成的形 ...

  5. 【NOIP2017】宝藏 题解(状压DP)

    题目描述 参与考古挖掘的小明得到了一份藏宝图,藏宝图上标出了 nnn 个深埋在地下的宝藏屋, 也给出了这 nnn 个宝藏屋之间可供开发的m mm 条道路和它们的长度. 小明决心亲自前往挖掘所有宝藏屋中 ...

  6. LibreOJ 6177 题解(状压DP)

    题面 传送门 分析 刚看到这道题时想的是跟最短哈密顿路类似的二进制状压DP,先用floyd处理距离 但是此题用二进制不够,应该用三进制 0,1,2分别表示未送,正在送,已送完 dp[s][i]表示当前 ...

  7. 【FZYZOJ】愚人节礼物 题解(状压DP)

    前言:麻麻我会写状压DP了! ---------------------------- 题目描述 愚人节到了!可爱的UOI小朋友要给孩子们送礼物(汗-原题不是可爱的打败图么= =..).在平面直角坐标 ...

  8. 【SCOI2005】互不侵犯 题解(状压DP)

    前言:一道状压DP的入门题(可惜我是个DP蒟蒻QAQ) ------------------ 题意简述:求在一个$n*n$的棋盘中放$k$个国王的方案数.注:当在一个格子中放入国王后,以此格为中心的九 ...

  9. POJ 3254 - Corn Fields - [状压DP水题]

    题目链接:http://poj.org/problem?id=3254 Time Limit: 2000MS Memory Limit: 65536K Description Farmer John ...

随机推荐

  1. Python 图像处理 OpenCV (13): Scharr 算子和 LOG 算子边缘检测技术

    前文传送门: 「Python 图像处理 OpenCV (1):入门」 「Python 图像处理 OpenCV (2):像素处理与 Numpy 操作以及 Matplotlib 显示图像」 「Python ...

  2. Tomcat双击startup.bat闪退的原因及解决方式

    很久不碰Tomcat了,最近因为种种原因需要重新投入到Java Web的怀抱,所以又重新接触了Tomcat 我下载了tomcat的压缩包将其解压缩到某个位置,我这里是D盘下的tomcat文件夹中,但是 ...

  3. 数据可视化基础专题(八):Pandas基础(七) 数据清洗与预处理相关

    1.数据概览 第一步当然是把缺失的数据找出来, Pandas 找缺失数据可以使用 info() 这个方法(这里选用的数据源还是前面一篇文章所使用的 Excel ,小编这里简单的随机删除掉几个数据) i ...

  4. Activiti工作流--分布式实现方案

    一.运行环境 以下所有的描述都是基于Activiti的5.20.0.1版本 public interface ProcessEngine extends EngineServices { /** th ...

  5. unity第一人称如何设置

    关系图 红色菱形:脚本 白色矩形:组件 移动代码 //移动代码 public CharacterController controller;//角色控制器 public float speed = 1 ...

  6. 老司机带你玩转面试(2):Redis 过期策略以及缓存雪崩、击穿、穿透

    前文回顾 建议前一篇文章没看过的同学先看下前面的文章: 「老司机带你玩转面试(1):缓存中间件 Redis 基础知识以及数据持久化」 过期策略 Redis 的过期策略都有哪些? 在聊这个问题之前,一定 ...

  7. 作为程序员居然没用过这款神器?太out了吧。

    背景 工欲善其事,必先利其器.​后面我将陆陆续续推荐一些软件利器帮助大家提高效率(主要针对 Mac 电脑). 如果你在使用 Mac 电脑,并且没有如某些人那样安装并使用 Windows 系统,那么你可 ...

  8. php+mysql如何防止sql注入

    方法: 1.预处理.(预处理语句针对SQL注入是非常有用的,因为参数值发送后使用不同的协议,保证了数据的合法性.) 2.mysql_real_escape_string -- 转义 SQL 语句中使用 ...

  9. ajax根据坐标查询WMS地图服务属性信息

    <html lang="en"> <head> <meta charset="UTF-8"> <meta name=& ...

  10. 为什么SpringBoot项目里引入其他依赖不要写版本号

    <dependencies> <dependency> <groupId>org.springframework.boot</groupId> < ...