hdu 5596
2015-12-12 23:19
337 查看
GTW likes math
由于是整数区间,直接枚举即可。时间复杂度O(T∗(r−l))O(T*(r-l))O(T∗(r−l))注意a可以是0.
GTW likes gt
首先这道题有一个很显然的O(n∗logn)O(n*logn)O(n∗logn)的做法,直接区间加,求区间最大值即可。但是此题还有一个O(n)O(n)O(n)的做法。我们发现b1,b2,...,bxb_1,b_2,...,b_xb1,b2,...,bx都加111就相当于bx+1,bx+2,...,bnb_{x+1},b_{x+2},...,b_nbx+1,bx+2,...,bn都减111。然后我们可以倒着做,记一下最大值,如果遇到了修改操作,就把最大值减111,然后判断一下这个人会不会被消灭掉,然后再更新一下最大值。代码:
#include <iostream> #include<algorithm> #include<stdio.h> #include<cstring> #include<string> #include<stack> #include<vector> #include<queue> using namespace std; #define LL long long const int maxn=50002; int n,t; struct point { int id,v; }a[maxn]; int add[maxn]; int main() { int m; cin>>t; int c; while(t--){ memset(add,0,sizeof(add)); scanf("%d%d",&n,&m); for(int i=0;i<n;i++) scanf("%d%d",&a[i].id,&a[i].v); for(int i=0;i<m;i++){ scanf("%d",&c); add[c]++; } int cnt=0; for(int i=0;i<n;i++){ // if(add[i+1]){ a[i].v+=m-cnt; cnt+=add[i+1]; //} } // for(int i=0;i<n;i++)cout<<a[i].v<<endl; int max1=-100000000,max0=-100000000; for(int i=n-1;i>=0;i--){ if(a[i].id){ if(a[i].v<max0)n--; max1=max(a[i].v,max1); } else{ if(a[i].v<max1)n--; max0=max(a[i].v,max0); } } printf("%d\n",n); } return 0; }
相关文章推荐
- 【LWJGL官方教程】输入处理
- 关于分布式一致性的探究
- Xcode6添加pch文件
- [CUDA]初学CUDA遇到的比较烧脑的问题
- 关于PagerAdapter的使用方法的总结
- Android面试题目整理与讲解(一)
- [hdoj试题]A+B for Input-Output Practice (V)
- java十分钟速懂知识点——System类
- Struts2技术内幕-----第七章
- 第三次冲刺阶段第五天
- servlet简单使用
- c语言:编写一个程序,它从标准输入(终端)读取C源代码,并验证所有的花括号都正确的成对出现。
- Gradle DSL method found: ‘android()’错误
- 基于Nginx服务器安装phpMyAdmin
- 第二次编程作业
- ProFTP安装及配置
- sqlserver字符串拆分(split)方法汇总
- Java构建json数据格式(利用org.json)
- 实现底部扇形展开菜单效果
- 基于客户保持率的人口特性分析