地址:点击打开链接
这个相对简单,自己做了3题。
#include <iostream>
#include <stdio.h>
#include <string.h>
#include <algorithm>
using namespace std;
int n,m,a[105];
int main()
{
while(cin>>n>>m){
memset(a,0,sizeof(a));
int x;
for(int i=0;i<m;i++){
int maxn=0,pos=0;
for(int j=0;j<n;j++){
scanf("%d",&x);
if(maxn<x){
maxn=x;
pos=j;
}
}
a[pos]++;
}
int maxv=0,pos;
for(int i=0;i<n;i++){
if(maxv<a[i]){
maxv=a[i];
pos=i;
}
}
cout<<pos+1<<endl;
}
return 0;
}
分析:这个直接计算就可以了,根据m的在中点的左边还是右边来确定a
#include <iostream>
#include <stdio.h>
#include <string.h>
#include <algorithm>
using namespace std;
int n,m,a;
int main()
{
while(cin>>n>>m){
int may=n/2+1;
if(may>m)a=m+1;
else if(may<m)a=m-1;
else{
int mod=n%2;
if(mod)a=m-1;
else a=m-1;
}
if(a<=0)a=1;
cout<<a<<endl;
}
return 0;
}
分析:因为每次替换m可能300000,如果每次都查询一遍,肯定会超时,我们可以第一次查询一遍‘ . ',以后根据要替换的位置来确定sum的情况
#include <iostream>
#include <stdio.h>
#include <string.h>
#include <algorithm>
using namespace std;
int n,m,x;
char c;
char s[300005];
int main()
{
while(cin>>n>>m){
for(int i=1;i<=n;i++)
cin>>s[i];
int sum=0;
cin>>x>>c;
m--;
s[x]=c;
for(int i=1;i<=n;i++){
if(s[i]=='.'&&s[i+1]=='.')sum++;
}
cout<<sum<<endl;
while(m--){
cin>>x>>c;
if(c=='.'&&s[x]!='.'){
if(s[x-1]=='.')sum++;
if(s[x+1]=='.')sum++;
}
else if(c!='.'&&s[x]=='.'){
if(s[x-1]=='.'&&s[x+1]=='.')sum-=2;
else if(s[x-1]!='.'&&s[x+1]!='.')sum=sum;
else sum--;
}
s[x]=c;
cout<<sum<<endl;
}
}
return 0;
}
不会做,以后研究一下:点击打开链接
#include <iostream>
#include <stdio.h>
#include <string.h>
#include<vector>
#include <algorithm>
using namespace std;
vector<int>f[555555][27];
vector<int>g[555555];
int m,n;
char s[555555];
int tim,fst[555555],nxt[555555];
int x,y;
int d[555555];
void dfs(int u,int dis)
{
tim++;
fst[u]=tim;
d[u]=dis;
// cout<<u<<' '<<tim<<' ';
f[dis][s[u]-'a'].push_back(tim);
// cout<<dis<<' '<<s[u]-'a'<<' '<<tim<<endl;
for(int i=0;i<g[u].size();i++)
dfs(g[u][i],dis+1);
nxt[u]=tim;
// cout<<u<<' '<<tim<<endl;
}
int main()
{
scanf("%d%d",&m,&n);
char kkk;
for(int i=2;i<=m;i++){
scanf("%d",&x);
g[x].push_back(i);
}
getchar();
for(int i=1;i<=m;i++){
scanf("%c",&s[i]);
}
dfs(1,1);
for(int t=1;t<=n;t++){
int has=0;
scanf("%d%d",&x,&y);
int l=fst[x],r=nxt[x];
for(int i=0;i<26;i++){
int num=upper_bound(f[y][i].begin(),f[y][i].end(),r)-lower_bound(f[y][i].begin(),f[y][i].end(),l);
// cout<<"num is "<<num<<endl;
if(num%2==1)has++;
}
if(has<2)printf("Yes\n");
else printf("No\n");
}return 0;
}