标签:nbsp ret max algorithm 输入 来源 技术 等于 img
琉璃在撕书。
书总共有n页,都悬浮在数轴上,第i页的位置为,上面写着一个数字。
琉璃从右往左撕书。假如看到了第i页,就把在第i页左边,且与之距离<=的书都撕掉。(第i页本身不撕)
夜子为了尽量地保全魔法书,决定偷偷在琉璃开始撕之前,增加一页。增加的这一页必须在所有书页的右边,数字随意。
夜子想知道,最少会有多少页书被撕毁。
第一行一个整数n,表示书页数。
接下来n行,第i行的俩整数分别为和。
一个整数,表示最少被撕毁的书页数。
4 1 9 3 1 6 1 7 4
1
cf原题
错在位置等于0时树状数组没有特判掉QAQ 最后坐标全部+1就是答案了
————————————————————————————————————————
这道题很容易想到那个可以多加一页就是可以消去最后的某一段以实现答案的最优
所以我们只需要考虑每个点 如果他要保留 那么他要撕掉多少页 记录一答案就行辣
#include<cstdio> #include<cstring> #include<algorithm> #define LL long long using namespace std; const int M=1e6+7; int read(){ int ans=0,f=1,c=getchar(); while(c<‘0‘||c>‘9‘){if(c==‘-‘) f=-1; c=getchar();} while(c>=‘0‘&&c<=‘9‘){ans=ans*10+(c-‘0‘); c=getchar();} return ans*f; } int ans,n,sum[M],s[M],mx; struct node{int x,c;}e[M]; bool cmp(node a,node b){return a.x<b.x;} int lowbit(int x){return x&-x;} int query(int x){ int sum=0; while(x>0){sum+=s[x]; x-=lowbit(x);} return sum; } void insert(int x){ while(x<=mx){ s[x]++; x+=lowbit(x); } } int main() { n=read(); for(int i=1;i<=n;i++) e[i].x=read()+1,e[i].c=read(),mx=max(mx,e[i].x); sort(e+1,e+1+n,cmp); for(int i=1;i<=n;i++){ int k=query(e[i].x-e[i].c-1); sum[i]=sum[k]+1; ans=max(sum[i],ans); insert(e[i].x); } printf("%d\n",n-ans); return 0; }
标签:nbsp ret max algorithm 输入 来源 技术 等于 img
原文地址:http://www.cnblogs.com/lyzuikeai/p/7282566.html