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;
}