这道题一看有两个出发现点,一枚举点去找边界,想了一会就Pass了...,二是枚举相框,我们最起码枚举两个边界,然后发现平行边界更好处理,然而仍然只有30分,这个时候就来到了链表的神奇应用,我们枚举上界u,下界d在u的基础之上从下往上枚举,我们每次枚举上界的开始就把上界以下的点建成链表(它的形状大概是在从左到右的基础上对于同一列的从上倒下,就是蛇形),然后让下届去逼近并结算答案,十分巧妙。

关于链表:大概有单向链表,双向链表,以及循环链表,他们作为数据结构的应用十分狭窄,只有在特定情境下才有大用处,所以在oi层面只有双向链表有一定用处,他的删除在记录位置的前提下是O(1)的,查询O(n),插入的话主要是找到合适的位置(前驱),剩下的就是O(1)了。

#include <cstdio>
#include <cstring>
#include <algorithm>
typedef long long LL;
const int N=;
int pre[N],next[N],mem[N][N],last[N];
int line,column,n,k;
LL ans;
bool ex[N];
struct Point{int x,y;}p[N];
inline bool comp(Point a,Point b){return a.y<b.y||(a.y==b.y&&a.x<b.x);}
int main(){
scanf("%d%d%d%d",&line,&column,&n,&k);
for(int i=;i<=n;++i)
scanf("%d%d",&p[i].x,&p[i].y);
std::sort(p+,p+n+,comp);
for(int i=;i<=n;++i)
mem[p[i].x][++mem[p[i].x][]]=i;
for(int u=;u<=n;++u){
int pr=;memset(ex,,sizeof(ex));
for(int i=u;i<=n;++i)
for(int j=;j<=mem[i][];++j)
ex[mem[i][j]]=true,last[mem[i][j]]=line;
for(int i=;i<=n;++i)
if(ex[i])pre[i]=pr,next[pr]=i,pr=i;
pre[n+]=pr,next[pr]=n+;
for(int i=;i<=k;++i)
pre[n+i]=n+i-,next[n+i-]=n+i;
for(int d=n;d>=u;--d){
for(int i=;i<=mem[d][];++i){
int nk=mem[d][i];
for(int j=;j<=k;++j)nk=next[nk];
if(next[mem[d][i]]<=n&&p[next[mem[d][i]]].x!=d)
ans+=(LL)(last[next[mem[d][i]]]-d+)*
(p[next[mem[d][i]]].y-p[pre[next[mem[d][i]]]].y)*
(nk>n?:column-p[nk].y+),
last[next[mem[d][i]]]=d-;
nk=pre[nk],
ans+=(LL)(last[mem[d][i]]-d+)*
(p[mem[d][i]].y-p[pre[mem[d][i]]].y)*
(nk>n?:column-p[nk].y+);
for(int j=,now=mem[d][i];j<k&&now;++j){
now=pre[now],nk=pre[nk];
if(now&&p[now].x!=d&&last[now]>=d)
ans+=(LL)(last[now]-d+)*
(p[now].y-p[pre[now]].y)*
(nk>n?:column-p[nk].y+),
last[now]=d-;
}
}
for(int i=;i<=mem[d][];++i)
next[pre[mem[d][i]]]=next[mem[d][i]],
pre[next[mem[d][i]]]=pre[mem[d][i]];
}
}
printf("%lld",ans);
}

【TMD模拟赛】上低音号 链表的更多相关文章

  1. 【TMD模拟赛】黄金拼图 Cao

    正解:Cao 据说这样的题是用来骗丛林生物上树的...... 这样的题除了考观察力之外还.........我们发现他异或了opt,恩,就这样,用离线推答案..... #include <cstd ...

  2. 2014.7.8模拟赛【笨笨当粉刷匠】|bzoj1296 [SCOI]粉刷匠

    笨笨太好玩了,农田荒芜了,彩奖用光了,笨笨只好到处找工作,笨笨找到了一份粉刷匠的工作.笨笨有n条木板需要被粉刷.每条木板被分成m个格子,每个格子要被刷成红色或蓝色.笨笨每次粉刷,只能选择一条木板上一段 ...

  3. 模拟赛QAQ

    100 + 30 + 0 T1 叉叉 题目描述 现在有一个字符串,每个字母出现的次数均为偶数.接下来我们把第一次出现的字母a和第二次出现的a连一条线,第三次出现的和四次出现的字母a连一条线,第五次出现 ...

  4. NOIP模拟赛 by hzwer

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

  5. 小奇模拟赛9.13 by hzwer

    2015年9月13日NOIP模拟赛 by hzwer    (这是小奇=> 小奇挖矿(explo) [题目背景] 小奇要开采一些矿物,它驾驶着一台带有钻头(初始能力值w)的飞船,按既定路线依次飞 ...

  6. [GRYZ]寒假模拟赛

    写在前面 这是首次广饶一中的OIERS自编自导,自出自做(zuo)的模拟赛. 鉴于水平气压比较低,机(wei)智(suo)的WMY/XYD/HYXZC就上网FQ下海找了不少水(fei)题,经过他们优( ...

  7. 『2019/4/9 TGDay2模拟赛 反思与总结』

    2019/4/9 TGDay2模拟赛 今天是\(TG\)模拟赛的第二天了,试题难度也是相应地增加了一些,老师也说过,这就是提高组的难度了.刚开始学难的内容,一道正解也没想出来,不过基本的思路也都是对了 ...

  8. 『2019/4/8 TGDay1模拟赛 反思与总结』

    2019/4/8 TGDay1模拟赛 这次是和高一的学长学姐们一起参加的\(TG\)模拟考,虽然说是\(Day1\),但是难度还是很大的,感觉比\(18\)年的\(Day1\)难多了. 还是看一下试题 ...

  9. DP 01背包 七夕模拟赛

    问题 D: 七夕模拟赛 时间限制: 1 Sec  内存限制: 128 MB提交: 60  解决: 23[提交][状态][讨论版] 题目描述 " 找啊找啊找GF,找到一个好GF,吃顿饭啊拉拉手 ...

随机推荐

  1. scala映射和元组

    scala映射,是一对键值对,相当于java中的Map 对偶:由两个值构成的组,形式 : 值1->值2,值1和值2类型不一定要相同,可以理解为对偶就是一个key/value 映射就是对偶的集合 ...

  2. Leecode刷题之旅-C语言/python-26.删除数组中的重复项

    /* * @lc app=leetcode.cn id=26 lang=c * * [26] 删除排序数组中的重复项 * * https://leetcode-cn.com/problems/remo ...

  3. PAT-B1032

    1032 挖掘机技术哪家强(20) 输入格式: 输入在第1行给出不超过10^5^的正整数N,即参赛人数.随后N行,每行给出一位参赛者的信息和成绩,包括其所代表的学校的编号(从1开始连续编号).及其比赛 ...

  4. stm32+lwip(二):UDP测试

    我是卓波,很高兴你来看我的博客. 系列文章: stm32+lwip(一):使用STM32CubeMX生成项目 stm32+lwip(二):UDP测试 stm32+lwip(三):TCP测试 stm32 ...

  5. Git更改远程仓库地址

    最近在开发一个公司内部的公共组件库.老大整理了git仓库里的一些项目,其中就包括这个项目. 项目git地址变了,于是我本地的代码提交成功后push失败. 查看远程地址 git remote -v 更改 ...

  6. C# Winform 实现屏蔽键盘的win和alt+F4的实现代码

    最近在做一个恶搞程序,就是打开后,程序获得桌面的截图然后,然后全屏显示在屏幕上,用户此时则不能进行任何操作. 此时希望用户不能通过键盘alt+F4来结束程序及通过Win的组合键对窗口进行操作.我在网上 ...

  7. cmd中可以运行java,但不能运行javac命令

    在cmd中可以运行java,但运行javac命令时提示:'javac' 不是内部或外部命令,也不是可运行的程序或批处理文件. 原因:安装java时把jdk的路径和jre的路径选择成一样,就造成覆盖了. ...

  8. Log4net的一个小例子

    最近想学习下log4net,写了个很简短的使用例子.用少的代码,可以保证程序运行起来. 配置文件: <configSections> <section name="log4 ...

  9. OpenCV入门:(四:混合两张图片)

    1. 原理 对两张图片使用如下公式可以得到两张图片的混合图片, 其中f0(x),f1(x)分别是图片1和图片2同一位置的像素点. 2. OpenCV中的AddWeight函数 函数和参数说明: ) s ...

  10. ES6 语法糖

    重新认识ES6中的语法糖:https://segmentfault.com/a/1190000010159725