Atcoder ABC157

C - Guess The Number
思路:
特判 模拟

#include <iostream>
#include <cstdio>
#include <cstring>
#include <cstdlib>
#include <cmath>
#include <algorithm>
#include <queue>
#include <map>
#include <map>
#include <stack>
#include <set>

using namespace std;
typedef long long ll;
typedef pair<int,int>P;
const double eps = 1e-10;
const int INF = 0x3f3f3f3f;
const ll mod  = 1e9 + 7;
const ll maxn = 1e6 + 5;

int main(){
	int n,m,a[10],s,c;
	map<int,int>mp;
	cin>>n>>m;
	bool flag=false;
	memset(a,-1,sizeof(a));
	while(m--){
		cin>>s>>c;
		if(a[s]==-1){
			mp[s]=c;
			a[s]=c;
		}else{
			if(mp[s]!=c) flag=true;
		}
	}
	if(a[1]==0 && n>1) flag=true;
	if(flag) cout<<-1;
	else{
		if(n>1){
			for(int i=1;i<=n;i++){
				if(a[i]==-1 && i==1) cout<<1;
				else if(a[i]==-1 && i>1) cout<<0;
				else cout<<a[i];
			}
		}else{
			if(a[1]==-1) cout<<0;
			else cout<<a[1];
		}
	}
	return 0;
}

D - Friend Suggestions
思路:
并查集
可能成为朋友的候选人的数量=间接朋友得数量-黑名单数量-自己

#include <iostream>
#include <cstdio>
#include <cstring>
#include <cstdlib>
#include <cmath>
#include <algorithm>
#include <queue>
#include <map>
#include <map>
#include <stack>
#include <set>

using namespace std;
typedef long long ll;
typedef pair<int,int>P;
const double eps = 1e-10;
const int INF = 0x3f3f3f3f;
const ll mod  = 1e9 + 7;
const ll maxn = 1e5 + 5;

int f[maxn];
int sum[maxn];
int ans[maxn];
int n,m,k;

void init(){
	for(int i=0;i<=n;i++){
		f[i]=i;
		sum[i]=1;
	}
}

int find(int x){
	return f[x]==x?x:f[x]=find(f[x]);
}

void merge(int x,int y){
	int a=find(x);
	int b=find(y);
	if(a!=b) f[b]=a,sum[a]+=sum[b];
}

int main(){
	cin>>n>>m>>k;
	init();
	for(int i=1;i<=m;i++){
		int a,b;
		cin>>a>>b;
		ans[a]++,ans[b]++;
		merge(a,b);
	}
	for(int i=1;i<=k;i++){
		int c,d;
		cin>>c>>d;
		if(find(c)==find(d)) ans[c]++,ans[d]++;
	}
	for(int i=1;i<=n;i++){
		cout<<sum[find(i)]-ans[i]-1<<" ";
	}
	return 0;
}

E - Simple String Queries
思路:
二维set 或者 set外嵌套vector + 二分
说说怎么想这个思路比较合适:修改s[i]显然比较简单,问题是解决l到r之间有多少种字母,这里显然要用二分查找降低复杂度,二分查找又需要有序的数据,所以需要用到set。
新学的stl:
set.lower_bound(x) 返回大于等于x的第一个迭代器(指针)
新学的tip:
set中先加入较大的数防止越界

#include <iostream>
#include <cstdio>
#include <cstring>
#include <cstdlib>
#include <cmath>
#include <algorithm>
#include <queue>
#include <map>
#include <map>
#include <stack>
#include <set>

using namespace std;
typedef long long ll;
typedef pair<int,int>P;
const double eps = 1e-10;
const int INF = 0x3f3f3f3f;
const ll mod  = 1e9 + 7;
const ll maxn = 1e6 + 5;

int n,Q;
char s[maxn];
set<int>ss[30];

int main(){
	cin>>n>>s+1>>Q;
	for(int i=0;i<26;i++) ss[i].insert(n+1);//防止越界
	for(int i=1;i<=n;i++) ss[s[i]-'a'].insert(i);
	while(Q--){
		int t,i,l,r;
		char c;
		cin>>t;
		if(t==1){
			cin>>i>>c;
			if(s[i]!=c) ss[s[i]-'a'].erase(i);
			s[i]=c;
			ss[c-'a'].insert(i);
		}else{
			int ans=0;
			cin>>l>>r;
			for(int i=0;i<26;i++)
				if(*ss[i].lower_bound(l)<=r) ans++;
			cout<<ans<<'\n';
		}
	}
	return 0;
}

发布了40 篇原创文章 · 获赞 6 · 访问量 4628

猜你喜欢

转载自blog.csdn.net/Meulsama/article/details/104622558