[Scoi2010]游戏

时间限制: 1 Sec  内存限制: 128 MB

Description

lxhgww最近迷上了一款游戏,在游戏里,他拥有很多的装备,每种装备都有2个属性,这些属性的值用[1,10000]之间的数表示。当他使用某种装备时,他只能使用该装备的某一个属性。并且每种装备最多只能使用一次。 游戏进行到最后,lxhgww遇到了终极boss,这个终极boss很奇怪,攻击他的装备所使用的属性值必须从1开始连续递增地攻击,才能对boss产生伤害。也就是说一开始的时候,lxhgww只能使用某个属性值为1的装备攻击boss,然后只能使用某个属性值为2的装备攻击boss,然后只能使用某个属性值为3的装备攻击boss……以此类推。 现在lxhgww想知道他最多能连续攻击boss多少次?

Input

输入的第一行是一个整数N,表示lxhgww拥有N种装备 接下来N行,是对这N种装备的描述,每行2个数字,表示第i种装备的2个属性值

Output

输出一行,包括1个数字,表示lxhgww最多能连续攻击的次数。

Sample Input

3
1 2
3 2
4 5

Sample Output

2

HINT

【数据范围】
对于30%的数据,保证N < =1000
对于100%的数据,保证N < =1000000

题解

      在yzh大佬提醒下发现这题几乎和好几个月以前做过的一道二分图题意完全一样,但是二分图的复杂度是O(nm)的,这题理论上讲绝对过不了,但是用了十分神奇的卡常方法之后却真的能过。

正解是并查集,把每个装备看作一条边,把属性看成点。一个环里面一定都能满足,一棵树里只有一个点不满足。用并查集维护点的连通性,如果一个联通块里有点数-1条边就让最大的不满足,通过标记集合来确定有多少点是可行的。

#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
const int sj=1000010;
const int sj1=10005;
int n,h[sj+sj1],e,jg,l[sj+sj1],a1,a2,f[sj+sj1],id;
struct B
{int ne,v;
}b[sj<<1];
void add(int x,int y)
{b[e].ne=h[x],b[e].v=y,h[x]=e++;
}
bool find(int x)
{for(int i=h[x];i!=-1;i=b[i].ne){e=b[i].v;if(f[e]!=id){f[e]=id;if(l[e]==-1||find(l[e])){l[e]=x;return 1;}}}return 0;
}
int main()
{scanf("%d",&n);memset(h,-1,sizeof(h));memset(l,-1,sizeof(l));for(int i=1;i<=n;i++){scanf("%d%d",&a1,&a2);add(a1,sj1+i),add(a2,sj1+i);}for(int i=1;i<=sj1;i++){id=i;if(find(i))  jg++;else break;}printf("%d",jg);return 0;
}

game

#include<iostream>
#include<cstring>
#include<cstdio>
using namespace std;
const int sj=10005;
int n,a1,a2,f[sj];
bool v[sj];
int find(int x)
{if(f[x]==-1)  return x;f[x]=find(f[x]);return f[x];
}
void hb(int x,int y)
{if(x>y)  swap(x,y);f[x]=y;if(!v[x]) v[x]=1;else v[y]=1;
}
int main()
{scanf("%d",&n);memset(f,-1,sizeof(f));for(int i=1;i<=n;i++){scanf("%d%d",&a1,&a2);a1=find(a1),a2=find(a2);if(a1==a2)  v[a1]=1;else hb(a1,a2);}        for(int i=1;i<=sj;i++)if(!v[i]){printf("%d",i-1);break;}return 0;
}

game2

JC loves Mkk

时间限制: 1 Sec  内存限制: 64 MB

输入

第1行,包含三个整数。n,L,R。
第2行n个数,代表a[1..n]。

输出

仅1行,表示询问答案。
如果答案是整数,就输出整数;否则,输出既约分数“P/Q”来表示。

样例输入

5 3 4
3 1 2 4 5

样例输出

7/2HINT
1≤L≤R≤n≤10^5,0≤ai≤10^9,保证问题有解,数据随机生成

题解神奇的二分……我明知道平均值问题我只会二分,但是看到输出精确结果还是很不敢想,初次之外又一筹莫展。确实是需要实数二分,精度问题需要long double。把每一个a[i]都减去mid,那么问题就在于找到一个满足条件的区间,使区间和大于0。区间和转化为前缀和是司空见惯的,环拆成链也是自然。怎样确保选偶数个呢?维护一个单调队列,在奇数中和偶数中各找递增的前缀和。i和r作为维护单调队列的标准,每次检查是否有递增的前缀和,即满足条件的区间和,这两个前缀和之间的差就是我们需要的答案的分母。分子/分母=二分结果,通过分母×二分结果向上取整得到整数形式的分子。

#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
const int sj=200010;
const long double eps=1e-6;
int n,l,r,q[2][sj],h[2],t[2];
long long fz,fm,a[sj],gc;
long double mid,zj,yj,sum[sj];
bool op;
bool check(long double x)
{for(int i=1;i<=n;i++)  sum[i]=sum[i-1]+a[i]-x;h[1]=h[0]=t[1]=t[0]=1;for(int i=l;i<=n;i++){int j=i-l,op=i&1;while(h[op]<t[op]&&sum[j]-sum[q[op][t[op]-1]]<0)  t[op]--;q[op][t[op]++]=j;if(q[op][h[op]]<i-r)  h[op]++;if(sum[i]-sum[q[op][h[op]]]>0) {fm=i-q[op][h[op]];return 1;}}return 0;
}
long long gcd(long long x,long long y)
{if(y==0)  return x;return gcd(y,x%y);
}
int main()
{scanf("%d%d%d",&n,&l,&r);for(int i=1;i<=n;i++){ scanf("%lld",&a[i]);if(a[i]>yj)  yj=a[i];}for(int i=1;i<n;i++)   a[i+n]=a[i];l+=l&1,r-=r&1,n<<=1;while(zj<yj-eps){mid=(zj+yj)/2;if(check(mid))  zj=mid;else yj=mid;}mid=(zj+yj)/2;fz=(long long)(mid*fm+0.5);gc=gcd(fz,fm);fz/=gc,fm/=gc;printf("%lld",fz);if(fm!=1) printf("/%lld",fm);return 0;
}

candy

[Usaco2013 Open]Photo

时间限制: 1 Sec  内存限制: 128 MB

题目描述

Farmer John has decided to assemble a panoramic photo of a lineup of his N cows (1 <= N <= 200,000), which, as always, are conveniently numbered from 1..N. Accordingly, he snapped M (1 <= M <= 100,000) photos, each covering a contiguous range of cows: photo i contains cows a_i through b_i inclusive. The photos collectively may not necessarily cover every single cow. After taking his photos, FJ notices a very interesting phenomenon: each photo he took contains exactly one cow with spots! FJ was aware that he had some number of spotted cows in his herd, but he had never actually counted them. Based on his photos, please determine the maximum possible number of spotted cows that could exist in his herd. Output -1 if there is no possible assignment of spots to cows consistent with FJ"s photographic results.

给你一个n长度的数轴和m个区间,每个区间里有且仅有一个点,问能有多少个点

输入

* Line 1: Two integers N and M.

* Lines 2..M+1: Line i+1 contains a_i and b_i.

输出

* Line 1: The maximum possible number of spotted cows on FJ"s farm, or -1 if there is no possible solution.

样例输入

5 3
1 4
2 5
3 4INPUT DETAILS: There are 5 cows and 3 photos. The first photo contains cows 1 through 4, etc.

样例输出

1OUTPUT DETAILS: From the last photo, we know that either cow 3 or cow 4 must be spotted. By choosing either of these, we satisfy the first two photos as well. 

题解久违的单调队列优化dp!题目叙述有点像小暑假考试的《守卫》,但是那题我至今没有改出来,而且《守卫》凡是没有看到的地方都可能有,和这题有所区别。还是就题论题吧,每一个区间里必须有点,所以从某一点向前最远到不包括它的一个区间左端点至少要有一个点,这是可行解的左端点;每个区间里只有一个,所以从包含它的区间左端点再向左才有点,这是可行解的右端点。左端点取max,右端点取min,我们就得到了可行的转移区域。对于每个点来说可行区域是单调向右滑动的,可以用单调队列优化。对于每个点,我们把队列更新到r[i],再把l[i]之前的删除出队列,就可以取队首转移了。f[i]=max{f[j],l[i]<=j<=r[i]}+1

#include<cstdio>
#include<cstring>
#include<iostream>
using namespace std;
const int sj=200010;
int n,m,f[sj],q[sj],h,t,l[sj],r[sj],a1,a2,ans,te;
void getlr()
{for(int i=1;i<=n+1;i++)  r[i]=i-1;for(int i=1;i<=m;i++)  {scanf("%d%d",&a1,&a2);if(a1>l[a2+1])  l[a2+1]=a1;if(a1-1<r[a2])  r[a2]=a1-1;}for(int i=2;i<=n+1;i++)    l[i]=max(l[i-1],l[i]);for(int i=n;i>=1;i--)      r[i]=min(r[i+1],r[i]);
}
int main()
{  scanf("%d%d",&n,&m);getlr();h=t=te=1,q[1]=0;for(int i=1;i<=n+1;i++){while(te<=r[i]){if(f[te]==-1){te++;continue;}while(h<=t&&f[q[t]]<f[te]) t--;q[++t]=te;te++; }while(h<=t&&q[h]<l[i])    h++;if(h<=t) {f[i]=f[q[h]]+1;if(i==n+1)  f[i]--;}else f[i]=-1;}printf("%d",f[n+1]);return 0;
}  

photo

转载于:https://www.cnblogs.com/moyiii-/p/7588568.html

联赛前(伪)数据结构专题总结相关推荐

  1. 【算法数据结构专题】「延时队列算法」史上手把手教你针对层级时间轮(TimingWheel)实现延时队列的开发实战落地(下)

    承接上文 承接上一篇文章[算法数据结构专题]「延时队列算法」史上手把手教你针对层级时间轮(TimingWheel)实现延时队列的开发实战落地(上)]我们基本上对层级时间轮算法的基本原理有了一定的认识, ...

  2. 数据结构专题-学习笔记:李超线段树

    数据结构专题 - 学习笔记:李超线段树 1. 前言 2. 详解 3. 应用 4. 总结 5. 参考资料 1. 前言 本篇博文是博主学习李超线段树的学习笔记. 2020/12/21 的时候我在 线段树算 ...

  3. NOIp 数据结构专题总结 (1):STL、堆、并查集、ST表、Hash表

    系列索引: NOIp 数据结构专题总结 (1) NOIp 数据结构专题总结 (2) STL structure std::vector #include <vector> std::vec ...

  4. 数据结构专题—计算机中常用的数据结构

    前言: 在学习 java 相关技术或者学习mysql 存储引擎 InnoDB 的时候,会发现其底层运用了大量的数据结构.之所以不从java这门语言来展开讲数据结构是因为:数据结构是不分语言不分平台的. ...

  5. 数据结构专题 -- 哈希思想详解

    代码会存放在: https://github.com/sjmshsh/Data-Struct-HandWriting 通过阅读本篇文章,你可以学到: 哈希思想及其本质 使用C++实现简易的哈希表 哈希 ...

  6. 2014 UESTC暑前集训搜索专题解题报告

    A.解救小Q BFS.每次到达一个状态时看是否是在传送阵的一点上,是则传送到另一点即可. 代码: #include <iostream> #include <cstdio> # ...

  7. 数据结构专题(二):2.7顺序表反转

    思想: 单链表中体现数据结构学习中的一个重要的算法操作思想.就是要学习这些数据元素的联系规律,如何传递结点中的next域,在单链表中,有且只有一个作用记录了联系,这个就是当前结点的next存储了下一个 ...

  8. 数据结构专题二:2.6链表删除结点

    ///删除,删除指定位置的值,或者删除给定的值 //情形一:删除指定结点的后继结点 //情形二:删除第i个结点,假定头结点的i=0 //删除返回这个目标结点的地址,并不涉及到动态空间的回收 //在动态 ...

  9. 数据结构专题(二):2.5在链表指定位置插入元素

    如下代码: ///插入元素,在指定位置插入给定的值 //在指定位置之后插入 void insert_After_LkList(LinkListNode *ptr,ElemType x) {LinkLi ...

最新文章

  1. javascript元素跟随鼠标在指定区域运动
  2. 软件工程第二次作业完整版
  3. JSON Web Token(缩写 JWT) 目前最流行、最常见的跨域认证解决方案,前端后端都需要会使用的东西
  4. TypeError系列之:TypeError: conv2d(): argument 'input' (position 1) must be Tensor, not NoneType
  5. 怎么抓取屏幕截图计算机考试时间,定时抓屏快照(电脑截屏工具)V4.8 最新版
  6. Android官方开发文档Training系列课程中文版:键盘输入处理之控制输入法的显示方式
  7. dos系统重启计算机名,dos系统重启的命令是是
  8. 2022年企业微信生态研究报告
  9. github 参与开源_开源桥吸引了独特的演讲者和参与者
  10. php jquery选中提交,如何使用jquery提交php发布数据
  11. java mapper.readtree_java - 杰克逊的readValue和readTree:何时使用哪个? - 堆栈内存溢出...
  12. 【CF 543D】Road Improvement,树形DP
  13. 一个用python写的从数字高程格式文件(DEM)中提取水系的模块
  14. fun的用法c语言,fun的用法_fun的用法
  15. 你是否也陷入了《能力陷阱》?
  16. JVM致命错误日志详解
  17. tokenize java,Java split string - Java tokenize string examples - 入门小站-rumenz.com
  18. onos中引入外部依赖
  19. 哪个安卓模拟器比较好用 2023年好用的安卓模拟器推荐
  20. 程序员面试常见的10个问题,非常实用的面试技巧,收藏一下

热门文章

  1. 并发编程-11线程安全策略之线程封闭
  2. Redis-13Redis发布订阅
  3. python 常用内置函数_Python小白必备的8个最常用的内置函数(推荐)
  4. 汇编编程计算机流程图,汇编程序怎么做流程图?
  5. c 获取char*的长度_最大的 String 字符长度是多少?
  6. python期末考试编程题_智慧树知到_Python程序设计基础_期末考试答案
  7. 2021-05-10 linux中的find命令——查找文件名
  8. 计算机的来源知识,如何理解计算机知识及计算机发展史
  9. mybatis学习7之动态sql
  10. python函数名字_Python每日3题-为什么函数名字可以当做参数用?