题目地址 http://bestcoder.hdu.edu.cn/contests/contest_show.php?cid=574
1001
首先判断长度能不能被3整除,然后字符串分成三段看每段的字母是否相同,再判断一下三段的字符是否各不相同。
#define rd(x) scanf("%d",&x)
#define rd2(x,y) scanf("%d%d",&x,&y)
#define rd3(x,y,z) scanf("%d%d%d",&x,&y,&z)
using namespace std;
typedef long long ll;
string str;
int main()
{
while(cin>>str)
{
int len=str.length();
bool ok=1;
if(len<3||len%3!=0)
{
ok=0;
cout<<"NO"<<endl;
continue;
}
int ge=len/3;
char a,b,c;
a=str[0];
b=str[ge];
c=str[2*ge];
for(int i=1;i<ge;i++)
{
if(str[i]!=str[i-1])
{
ok=0;
}
}
for(int i=ge+1;i<2*ge;i++)
{
if(str[i]!=str[i-1])
ok=0;
}
for(int i=2*ge+1;i<3*ge;i++)
if(str[i]!=str[i-1])
ok=0;
if(ok&&a!=b&&a!=c&&b!=c)
cout<<"YES"<<endl;
else
cout<<"NO"<<endl;
}
return 0;
}
1002
用map<int,int>保存高度为H的树有多少个,然后对应输出就可以了,注意每次输出后该高度的树数目清0.
输入用到了快速读入。
#define rd(x) scanf("%d",&x)
#define rd2(x,y) scanf("%d%d",&x,&y)
#define rd3(x,y,z) scanf("%d%d%d",&x,&y,&z)
using namespace std;
typedef long long ll;
const int maxn=1000100;
map<int,int>mp;
inline int read()
{
char ch=getchar();int x=0,f=1;
while(ch>'9'||ch<'0'){if(ch=='-')f=-1;ch=getchar();}
while(ch<='9'&&ch>='0'){x=x*10+ch-'0';ch=getchar();}
return x*f;
}
int n,m;
int main()
{
while(rd2(n,m)!=EOF)
{
mp.clear();
int x;
for(int i=1;i<=n;i++)
{
x=read();
mp[x]++;
}
for(int i=1;i<=m;i++)
{
x=read();
printf("%d\n",mp[x]);
mp[x]=0;
}
}
return 0;
}
1003
根据大神的思路写的,离线,首先把树按高度从大到小排好序,然后把查询按查询的高度从大到小排序,然后对于每次查询,从大到小去种树,因为前面已经排好序了,所以遍历就可以了,每次查询只要树的高度大于查询的高度就一直种树,初始块为0,当种第i棵树时,如果它的两边都为空,那么块+1,如果它的两边都不空,那么块-1.思路膜拜。
#define rd(x) scanf("%d",&x)
#define rd2(x,y) scanf("%d%d",&x,&y)
#define rd3(x,y,z) scanf("%d%d%d",&x,&y,&z)
using namespace std;
typedef long long ll;
const int maxn=50010;
struct query
{
int id;
int ans;
int q;
}Q[maxn];
struct Tree
{
int id;
int high;
}tree[maxn];
bool cmp1(Tree a,Tree b)
{
if(a.high>b.high)
return true;
return false;
}
bool cmp2(query a ,query b)
{
if(a.q>b.q)
return true;
return false;
}
int n,q;
bool has[maxn];
bool cmp3(query a,query b)
{
if(a.id<b.id)
return true;
return false;
}
int main()
{
while(rd2(n,q)!=EOF)
{
for(int i=1;i<=n;i++)
{
rd(tree[i].high);
tree[i].id=i;
}
sort(tree+1,tree+1+n,cmp1);
memset(has,0,sizeof(has));
for(int i=0;i<q;i++)
{
Q[i].id=i;
rd(Q[i].q);
}
sort(Q,Q+q,cmp2);
int cnt=0;
int r=1;
for(int i=0;i<q;i++)
{
if(i>0&&Q[i].q==Q[i-1].q)
{
Q[i].ans=Q[i-1].ans;
continue;
}
while(tree[r].high>Q[i].q&&r<=n)
{
if(!has[tree[r].id-1]&&!has[tree[r].id+1])
{
cnt++;
has[tree[r].id]=1;
}
if(has[tree[r].id-1]&&has[tree[r].id+1])
{
has[tree[r].id]=1;
cnt--;
}
has[tree[r].id]=1;
r++;
}
Q[i].ans=cnt;
}
sort(Q,Q+q,cmp3);
for(int i=0;i<q;i++)
{
printf("%d\n",Q[i].ans);
}
}
return 0;
}