Description
Input
Output
Sample Input
7 6 1 6 13 E 6 3 9 E 3 5 7 S 4 1 3 N 2 4 20 W 4 7 2 S 3 1 6 1 4 2 6
Sample Output
13 3 36
Hint
Farms 2 and 6 are 20+3+13=36 apart.
ACcode:
#pragma warning(disable:4786)//使命名长度不受限制 #pragma comment(linker, "/STACK:102400000,102400000")//手工开栈 #include <map> #include <set> #include <queue> #include <cmath> #include <stack> #include <cctype> #include <cstdio> #include <cstring> #include <stdlib.h> #include <iostream> #include <algorithm> #define rd(x) scanf("%d",&x) #define rd2(x,y) scanf("%d%d",&x,&y) #define rds(x) scanf("%s",x) #define rdc(x) scanf("%c",&x) #define ll long long int #define maxn 8005 #define mod 1000000007 #define INF 0x3f3f3f3f //int 最大值 #define FOR(i,f_start,f_end) for(int i=f_start;i<=f_end;++i) #define MT(x,i) memset(x,i,sizeof(x)) #define PI acos(-1.0) #define E exp(1) using namespace std; int tree[maxn<<2],c[maxn<<2],cnt[maxn<<2],ans[maxn<<2]; inline void pushdown(int st){ int temp=st<<1; c[temp]=c[temp+1]=c[st]; c[st]=-1; } void updata(int st,int left,int right,int L,int R,int id){ if(L<=left&&R>=right){ c[st]=id; return ; } if(c[st]==id)return; if(c[st]!=-1)pushdown(st); int m=(left+right)>>1; int temp=st<<1; if(L<=m) updata(temp,left,m,L,R,id); if(R>m) updata(temp+1,m+1,right,L,R,id); } void qurey(int st,int left,int right){ if(c[st]>=0){ FOR(i,left,right) cnt[i]=c[st]; return; } if(left!=right&&c[st]==-1){ int m=(right+left)>>1; int temp=st<<1; qurey(temp,left,m); qurey(temp+1,m+1,right); } } int main(){ int n; while(rd(n)!=EOF){ MT(c,-1); int a,b,c; FOR(i,1,n){ rd2(a,b);rd(c); if(a>=b)continue; updata(1,1,8000,a+1,b,c); } MT(cnt,-1); qurey(1,1,8000); MT(ans,0); int i=1; while(i<maxn){ int cc=cnt[i],j=i+1; if(cc==-1){++i;continue;} while(cnt[j]!=-1&&cnt[j]==cc&&j<maxn)++j; ++ans[cc]; i=j; } FOR(i,0,maxn) if(ans[i]) printf("%d %d\n",i,ans[i]); printf("\n"); } return 0; } /* 5 0 4 4 0 3 1 3 4 2 0 2 2 0 2 3 4 0 1 1 3 4 1 1 3 2 1 3 1 6 0 1 0 1 2 1 2 3 1 1 2 0 2 3 0 1 2 1 */