NOI2016
luoguP1712 [NOI2016]区间
这是一道送分题.
对于我这种每天抄题解不动脑子思维僵化得厉害的智障选手就是送命题.
一直在想端点排序各种Treap搞...
正解:
已知一些区间,如何判断是否满足条件?满足条件是有一个点被覆盖的次数大于m,那么用线段树可以解决这个问题.
把区间按长度排序,从小往大考虑答案中选中最长区间的最大值.加入一个新的区间,线段树上区间加,当最大值仍大于m时,按加入时间删去最早的区间即可.
//Achen
#include<algorithm>
#include<iostream>
#include<cstring>
#include<cstdlib>
#include<vector>
#include<cstdio>
#include<queue>
#include<cmath>
#include<set>
#include<map>
#define inf 0x7fffffff
#define For(i,a,b) for(int i=(a);i<=(b);i++)
#define Rep(i,a,b) for(int i=(a);i>=(b);i--)
const int N=;
typedef long long LL;
typedef double db;
using namespace std;
int n,m,ls[N],sz,ans; template<typename T> void read(T &x) {
char ch=getchar(); x=; T f=;
while(ch!='-'&&(ch<''||ch>'')) ch=getchar();
if(ch=='-') f=-,ch=getchar();
for(;ch>=''&&ch<='';ch=getchar()) x=x*+ch-''; x*=f;
} struct node {
int l,r,ll,rr;
friend bool operator <(const node&A,const node&B) {
return A.r-A.l<B.r-B.l;
}
}p[N]; #define lc x<<1
#define rc ((x<<1)|1)
#define mid ((l+r)>>1)
int sg[N<<],lz[N<<];
void down(int x,int l_len,int r_len) {
if(!lz[x]) return;
if(l_len) sg[lc]+=lz[x],lz[lc]+=lz[x];
if(r_len) sg[rc]+=lz[x],lz[rc]+=lz[x];
lz[x]=;
} void update(int x,int l,int r,int ql,int qr,int v) {
if(l>=ql&&r<=qr) {
sg[x]+=v; lz[x]+=v; return;
}
down(x,mid-l+,r-mid);
if(ql<=mid) update(lc,l,mid,ql,qr,v);
if(qr>mid) update(rc,mid+,r,ql,qr,v);
sg[x]=max(sg[lc],sg[rc]);
} //#define DEBUG
int main() {
#ifdef DEBUG
freopen("1.in","r",stdin);
//freopen(".out","w",stdout);
#endif
read(n); read(m);
For(i,,n) {
read(p[i].l); read(p[i].r);
ls[++ls[]]=p[i].l; ls[++ls[]]=p[i].r;
}
sort(ls+,ls+ls[]+);
sz=unique(ls+,ls+ls[]+)-(ls+);
sort(p+,p+n+);
ans=inf; int pos=;
For(i,,n) {
p[i].ll=lower_bound(ls+,ls+sz+,p[i].l)-ls;
p[i].rr=lower_bound(ls+,ls+sz+,p[i].r)-ls;
update(,,sz,p[i].ll,p[i].rr,);
while(sg[]>=m) {
ans=min(ans,(p[i].r-p[i].l)-(p[pos].r-p[pos].l));
update(,,sz,p[pos].ll,p[pos].rr,-); pos++;
}
}
if(ans==inf) ans=-;
printf("%d\n",ans);
return ;
}
luoguP1173 [NOI2016]网格
对于细节苦手考虑问题永远没法全面连Noipdtt2傻逼模拟题都写挂的智障选手又是一道送命题.
一开始以为大力特判一波就可以,发现很多情况没考虑到.
要离散求割点.
答案显然只有 -1,0,1,2
若跳蚤个数小于等于2且联通则为-1
图不联通则为0
否则有割点则为1
否则为2
关键就是离散求割点.
我是把每个蛐蛐周围一圈24个跳蚤拿下来,再把他们对应的上下左右贴着边界的跳蚤拿出来建图,然后跑tarjan
没有看懂只用24个跳蚤和只用8个跳蚤再往外一圈的题解
我直接跑tarjan的话,如果只拿8个跳蚤或者不拿最外面一圈,可以卡掉的数据:
4 1 1
1 1
还有注意特判n,m乘积的时候要开LL.......
//Achen
#include<algorithm>
#include<iostream>
#include<cstring>
#include<cstdlib>
#include<vector>
#include<cstdio>
#include<queue>
#include<cmath>
#include<set>
#include<map>
#define inf 0x7fffffff
#define For(i,a,b) for(int i=(a);i<=(b);i++)
#define Rep(i,a,b) for(int i=(a);i>=(b);i--)
const int N=;
typedef long long LL;
typedef double db;
using namespace std;
int n,m,ls[N],sz,ans; template<typename T> void read(T &x) {
char ch=getchar(); x=; T f=;
while(ch!='-'&&(ch<''||ch>'')) ch=getchar();
if(ch=='-') f=-,ch=getchar();
for(;ch>=''&&ch<='';ch=getchar()) x=x*+ch-''; x*=f;
} struct node {
int l,r,ll,rr;
friend bool operator <(const node&A,const node&B) {
return A.r-A.l<B.r-B.l;
}
}p[N]; #define lc x<<1
#define rc ((x<<1)|1)
#define mid ((l+r)>>1)
int sg[N<<],lz[N<<];
void down(int x,int l_len,int r_len) {
if(!lz[x]) return;
if(l_len) sg[lc]+=lz[x],lz[lc]+=lz[x];
if(r_len) sg[rc]+=lz[x],lz[rc]+=lz[x];
lz[x]=;
} void update(int x,int l,int r,int ql,int qr,int v) {
if(l>=ql&&r<=qr) {
sg[x]+=v; lz[x]+=v; return;
}
down(x,mid-l+,r-mid);
if(ql<=mid) update(lc,l,mid,ql,qr,v);
if(qr>mid) update(rc,mid+,r,ql,qr,v);
sg[x]=max(sg[lc],sg[rc]);
} //#define DEBUG
int main() {
#ifdef DEBUG
freopen("1.in","r",stdin);
//freopen(".out","w",stdout);
#endif
read(n); read(m);
For(i,,n) {
read(p[i].l); read(p[i].r);
ls[++ls[]]=p[i].l; ls[++ls[]]=p[i].r;
}
sort(ls+,ls+ls[]+);
sz=unique(ls+,ls+ls[]+)-(ls+);
sort(p+,p+n+);
ans=inf; int pos=;
For(i,,n) {
p[i].ll=lower_bound(ls+,ls+sz+,p[i].l)-ls;
p[i].rr=lower_bound(ls+,ls+sz+,p[i].r)-ls;
update(,,sz,p[i].ll,p[i].rr,);
while(sg[]>=m) {
ans=min(ans,(p[i].r-p[i].l)-(p[pos].r-p[pos].l));
update(,,sz,p[pos].ll,p[pos].rr,-); pos++;
}
}
if(ans==inf) ans=-;
printf("%d\n",ans);
return ;
}
[NOI2016]国王饮水记
真 送命题
感觉70分可以连蒙带猜瞎那啥伪证一波,话说回来我也不会用高精小数库呀
我就靠llj和sxy了
[NOI2016]优秀的拆分
听说是送分题
当时的我没做出来
感觉现在的我不知道题解仍然做不来
不过95分暴力倒是美滋兹
好心累啊,不想写题解,放个传送门
听说这是一道模板题
为什么你们家的模板题都这么难的呀
我怎么做模板题做一天呀
不知道是不是太久没做数学题了,半天连个柿子都列不出来
等到终于知道自己要干啥子了,然后看着k^x=1(mod j)很久很久
愣是没看出来gcd(k,j)==1
我是猪头吗(
然后开始推一个伪柿子
又推了很久
打出来调过了样例
试了几个小数据发现柿子萎了,得做成40*nlog,试图挣扎.无果
抄题解
发现完全忘了有可以从和前i个质因子互质dp转移这种事情
真是菜得抠脚
前几天一上午or一下午or一晚上做一道题,现在是一天做一道题,我怕不是要与太阳肩并肩
NOI2016的更多相关文章
- UOJ#219. 【NOI2016】优秀的拆分 [后缀数组 ST表]
#219. [NOI2016]优秀的拆分 题意:求有多少AABB样子的子串,拆分不同的同一个子串算多个 一开始一直想直接求,并不方便 然后看了一眼Claris的题解的第一行就有思路了 如果分开,求\( ...
- 【BZOJ4650】【NOI2016】优秀的拆分(后缀数组)
[BZOJ4650][NOI2016]优秀的拆分(后缀数组) 题面 BZOJ Uoj 题解 如果我们知道以某个位置为开始/结尾的\(AA\)串的个数 那就直接做一下乘法就好 这个怎么求? 枚举一个位置 ...
- 【BZOJ4653】【NOI2016】区间(线段树)
[BZOJ4653][NOI2016]区间(线段树) 题面 BZOJ 题解 \(NOI\)良心送分题?? 既然是最大长度减去最小长度 莫名想到那道反复减边求最小生成树 从而求出最小的比值 所以这题的套 ...
- BZOJ_4653_[Noi2016]区间_线段树+离散化+双指针
BZOJ_4653_[Noi2016]区间_线段树+离散化+双指针 Description 在数轴上有 n个闭区间 [l1,r1],[l2,r2],...,[ln,rn].现在要从中选出 m 个区间, ...
- 「NOI2016」优秀的拆分 解题报告
「NOI2016」优秀的拆分 这不是个SAM题,只是个LCP题目 95分的Hash很简单,枚举每个点为开头和末尾的AA串个数,然后乘一下之类的. 考虑怎么快速求"每个点为开头和末尾的AA串个 ...
- [NOI2016]优秀的拆分&&BZOJ2119股市的预测
[NOI2016]优秀的拆分 https://www.lydsy.com/JudgeOnline/problem.php?id=4650 题解 如果我们能够统计出一个数组a,一个数组b,a[i]表示以 ...
- [Noi2016]区间[离散化+线段树维护+决策单调性]
4653: [Noi2016]区间 Time Limit: 60 Sec Memory Limit: 256 MBSubmit: 621 Solved: 329[Submit][Status][D ...
- [NOI2016]区间 线段树
[NOI2016]区间 LG传送门 考虑到这题的代价是最长边减最短边,可以先把边按长度排个序,双指针维护一个尺取的过程,如果存在包含某个点的区间数\(\ge m\),就更新答案并把左指针右移,这样做的 ...
- luogu1117 [NOI2016]优秀的拆分
luogu1117 [NOI2016]优秀的拆分 https://www.luogu.org/problemnew/show/P1117 后缀数组我忘了. 此题哈希可解决95分(= =) 设\(l_i ...
- 【BZOJ4560】[NOI2016]优秀的拆分
[BZOJ4560][NOI2016]优秀的拆分 题面 bzoj 洛谷 题解 考虑一个形如\(AABB\)的串是由两个形如\(AA\)的串拼起来的 那么我们设 \(f[i]\):以位置\(i\)为结尾 ...
随机推荐
- nginx 简单使用
一,下载 http://nginx.org/en/download.html 这个是我下载的windows版本 二,解压后目录 三,修改配置文件 (由于80端口很可能被 SQL Server Repo ...
- 伪类元素before&after
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...
- idea-----idea中“cannot resolve symbol servlet”的解决
原文章链接: 传送器>>>>>>>>>>>>>>>>. 第一次使用IntelliJ IDEA时我遇到了& ...
- centos7 dns(bind)安装配置
yum install -y bind bind-chroot bind-utils chroot是通过相关文件封装在一个伪根目录内,已达到安全防护的目的,一旦程序被攻破,将只能访问伪根目录内的内容, ...
- redis数据备份还原
安装ruby yum install ruby rubygems ruby-devel -y 安装rvm gpg2 --keyserver hkp://pool.sks-keyservers.net ...
- C#中反射的基础基础基础
class Program { static void Main(string[] args) { Type t = typeof(Student);//typeof(类) 取类的类型 并且存储在Ty ...
- BeanFactory 和 ApplicationContext 区别
区别 BeanFactory: Spring里面最低层的接口,提供了最简单的容器的功能,只提供了实例化对象和拿对象的功能 BeanFactory在启动的时候不会去实例化Bean,中有从容器中拿Bean ...
- php面向对象深入理解(二)
一个简单的小程序: 配置 config.ini <?php //项目的根目录 define("ROOT","F:/文件夹的名字/oop/"); //数 ...
- 单调栈(最大子矩形强化版)——牛客多校第八场A
求01矩阵里有多少个不同的1矩阵 首先预处理出pre[i][j]表示i上面连续的1个数,对每行的高度进行单调栈处理 栈里的元素维护两个值:pre[i][j]和向前延伸最多能维护的位置pos 然后算贡献 ...
- NX二次开发-UFUN已知两个向量方向求夹角角度UF_VEC3_angle_between
NX9+VS2012 #include <uf.h> #include <uf_ui.h> #include <uf_vec.h> #include <uf_ ...