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分暴力倒是美滋兹

[NOI2016]循环之美

好心累啊,不想写题解,放个传送门

听说这是一道模板题

为什么你们家的模板题都这么难的呀

我怎么做模板题做一天呀

不知道是不是太久没做数学题了,半天连个柿子都列不出来

等到终于知道自己要干啥子了,然后看着k^x=1(mod j)很久很久

愣是没看出来gcd(k,j)==1

我是猪头吗(

然后开始推一个伪柿子

又推了很久

打出来调过了样例

试了几个小数据发现柿子萎了,得做成40*nlog,试图挣扎.无果

抄题解

发现完全忘了有可以从和前i个质因子互质dp转移这种事情

真是菜得抠脚

前几天一上午or一下午or一晚上做一道题,现在是一天做一道题,我怕不是要与太阳肩并肩

												

最新文章

  1. 【Oracle】oracle利用正则表达式拆分IP地址
  2. hdu 1241 Oil Deposits (一次dfs搞定有某有)
  3. 自定义安装php开发环境(1)--apache和php整合
  4. HDOJ三部曲-DP-1017-pearls
  5. java web环境配置类型问题
  6. java 中读取本地文件中字符
  7. 生命周期-初识IOS
  8. 灵玖Nlpir Parser智能挖掘汉语精准分词
  9. Xamarin安卓开发:去掉Activity的头部标题栏及全屏显示
  10. 简述在javascript和jquery中cookie的使用
  11. Spring Boot 2 + MariaDB + HikariCP基础实例
  12. unity重写软键盘for Android NGUI
  13. css实现圆形倒计时效果
  14. 【洛谷P2585】三色二叉树
  15. 富文本编辑器Django-ckeditor
  16. 利用CCS3渐变实现条纹背景
  17. 背水一战 Windows 10 (82) - 用户和账号: 获取用户的信息, 获取用户的同意
  18. Time range (447392) for take &#39;Take 001&#39; is larger than maximum allowed(100000).
  19. 页面中的删除确认(ajax)、输入框中确认信息是否可用(ajax)的jquery代码
  20. opencv-Getting Started with Images

热门文章

  1. pandas--层次化索引
  2. Dockfile中的命令如何在.sh中执行
  3. 使用sql对比Mysql中数据库2个表结构
  4. Python语法学习记录之tuple该如何使用?
  5. delphi 安卓开发常用
  6. bzoj1051题解
  7. delphi编程实现为Windows窗口标题栏添加新按钮
  8. weblux上传图片
  9. NX二次开发-UFUN点收集器UF_UI_select_point_collection
  10. 如何将Canvas中内容保存为图片