hdu 5596GTW likes gt(最好倒着思考)

来源:互联网 发布:s7 200 编程电缆 原装 编辑:程序博客网 时间:2024/06/05 09:46

题目链接:【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;}


0 0
原创粉丝点击