题目链接:【hdu 5596】
1、求后缀数组,算出第i个一共加了多少次,倒着做
<span style="font-size:14px;">#include <iostream>
#include <algorithm>
#include <cstdio>
#include <cstring>
#include <string>
using namespace std;
struct node
{
int id, di;
}a[50010];
int time[50010];
int main()
{
int T;
cin>>T;
while(T--)
{
memset(time, 0, sizeof(time));
int n, m;
cin>>n>>m;
for(int i=1; i<=n; i++)
{
cin>>a[i].id>>a[i].di;
}
for(int i=1; i<=m; i++)
{
int id;
cin>>id;
time[id]++;
}
for(int i=n-1; i>=1; i--) time[i]+=time[i+1];
int max1=-1, max0=-1, ans=n;
for(int i=n; i>=1; i--)
{
if(a[i].id==0)
{
if(a[i].di+time[i]<max1) ans--;
max0=max(max0, a[i].di+time[i]);
}
else
{
if(a[i].di+time[i]<max0) ans--;
max1=max(max1, a[i].di+time[i]);
}
}
cout<<ans<<endl;
}
return 0;
}</span>
2、第1到第i个加了多少就相当于第i+1到第n个减了多少
(到着的)
<span style="font-size:14px;">#include <iostream>
#include <algorithm>
#include <cstdio>
#include <cstring>
#include <string>
using namespace std;
struct node
{
int id, di;
}a[50010];
int time[50010];
int main()
{
int T;
cin>>T;
while(T--)
{
memset(time, 0, sizeof(time));
int n, m;
cin>>n>>m;
for(int i=1; i<=n; i++)
{
cin>>a[i].id>>a[i].di;
}
for(int i=1; i<=m; i++)
{
int id;
cin>>id;
time[id]++;
}
int max1=-1, max0=-1, ans=n;
for(int i=n; i>=1; i--)
{
max1-=time[i];
max0-=time[i];
if(a[i].id==0)
{
if(a[i].di<max1) ans--;
max0=max(max0, a[i].di);
}
else
{
if(a[i].di<max0) ans--;
max1=max(max1, a[i].di);
}
}
cout<<ans<<endl;
}
return 0;
}</span>
(正着来的)===> 这个效率貌似是最高的
#include <iostream>
#include <algorithm>
#include <cstdio>
#include <cstring>
#include <string>
#include <vector>
using namespace std;
int a[50010], b[50010];
struct node
{
int id, x;
}p[50010];
int time[50010];
int main()
{
int T;
scanf("%d", &T);
while(T--)
{
int n, m;
memset(time, 0, sizeof(time));
scanf("%d%d", &n, &m);
for(int i=1; i<=n; i++)
{
scanf("%d%d", &p[i].id, &p[i].x);
}
for(int i=0; i<m; i++)
{
int id;
scanf("%d", &id);
time[id]++;
}
int sa=0, sb=0, la=0, lb=0;
int ans=0;
for(int i=1; i<=n ;i++)
{
p[i].x-=ans;
if(p[i].id==0)
{
for(int j=sa; j<la; j++)
{
if(a[j]<p[i].x) sa++;
else break;
}
b[lb++]=p[i].x;
sort(b+sb, b+lb);
}
else
{
for(int j=sb; j<lb; j++)
{
if(b[j]<p[i].x) sb++;
else break;
}
a[la++]=p[i].x;
sort(a+sa, a+la);
}
ans+=time[i];
}
printf("%d\n", la-sa+lb-sb);
}
return 0;
}