1 、 采矿( ( mining) )
【问题描述】
小奇飞船的钻头开启了无限耐久+精准采集模式!它想要将原矿运到泛光之
源的矿石交易市场,以便为飞船升级无限非概率引擎。
现在有 m+1 个星球,从左到右标号为 0 到 m,小奇最初在 0 号星球。
有 n 处矿体,第 i 处矿体有 ai 单位原矿,在第 bi 个星球上。
由于飞船使用的是老式的跳跃引擎,每次它只能从第 x 号星球移动到第 x+4
号星球或 x+7 号星球。每到一个星球,小奇会采走该星球上所有的原矿,求小奇
能采到的最大原矿数量。
注意,小奇不必最终到达 m 号星球。
【输入格式】
第一行 2 个整数 n,m。
接下来 n 行,每行 2 个整数 ai,bi。
【输出格式】
输出一行一个整数,表示要求的结果。
【样例输入】
3 13
100 4
10 7
1 11
【样例输出】
101
【样例解释】
第一次从 0 到 4,第二次从 4 到 11,总共采到 101 单位原矿。
【数据范 围】
对于 20%的数据 n=1,m<=10^5;
对于 40%的数据 n<=15,m<=10^5;
对于 60%的数据 m<=10^5;

对于 100%的数据 n<=10^5,m<=10^9,1<=ai<=10^4,1<=bi<=m。
[参考代码]
#include<bits/stdc++.h>
using namespace std;
struct oppo{
	int s,x;
}st[100005];
struct vivo{
	int x,all;
}hz;
int MAX;
deque< vivo > v;
int n,m,ans;
bool rule(oppo a,oppo b)
{
	return a.x<b.x;
}
int main()
{
	cin>>n>>m;
	for(int i=1;i<=n;i++)
		scanf("%d %d",&st[i].s,&st[i].x);
	sort(st+1,st+n+1,rule);
	for(int i=1;i<=n;i++)
	{
		hz.x=st[i].x;
		hz.all=0;
		while(v.size()&&st[i].x-v[v.size()-1].x>17)
		{
			MAX=max(MAX,v[v.size()-1].all);
			v.pop_back();
		}
		if(v.size())
		{
			int op=0;
			while(op<v.size())
			{
				if(st[i].x-v[op].x==0||st[i].x-v[op].x==4||st[i].x-v[op].x==7||st[i].x-v[op].x==8||st[i].x-v[op].x==11||st[i].x-v[op].x==12||st[i].x-v[op].x==14||st[i].x-v[op].x==15||st[i].x-v[op].x==16)
					hz.all=max(hz.all,v[op].all+st[i].s);
				op++;
			}
		}
		if(hz.x==0||hz.x==4||hz.x==7||hz.x==8||hz.x==11||hz.x==12||hz.x==14||hz.x==15||hz.x==16||hz.x>17)
			hz.all=max(hz.all,MAX+st[i].s);
		else
			hz.all=0;
		ans=max(ans,hz.all);
		v.push_front(hz);
	}
	cout<<ans<<endl;
	return 0;
}