A.模拟就行
#include <iostream>
#include <cstring>
#include <algorithm>
#include <vector>
#include<functional>
#include <cmath>
#include <map>
using namespace std;
const int N = 2e5+10;
typedef long long LL;
int n,m,k;
string s[N];
void solve(){
cin>>n;
int id,mn=0x3f3f3f3f;
for(int i=0;i<n;i++){
cin>>s[i];
int x;cin>>x;
if(x<mn)
{
id=i;mn=x;
}
}
for(int i=id;i<n;i++) cout<<s[i]<<"\n";
for(int i=0;i<id;i++) cout<<s[i]<<"\n";
}
signed main()
{
cin.tie(0);cout.tie(0);ios::sync_with_stdio(0);
int t=1;
//cin>>t;
while(t--) solve();
}
B.wc,真模拟,我不做了
C.看看能不能感染别人,最后问哪些人感染了,想到了并查集ahhh
但是感染有先后顺序,所以预处理每个人能到的点,然后用拓扑排序模拟即可
#include <iostream>
#include <cstring>
#include <algorithm>
#include <vector>
#include<functional>
#include <cmath>
#include <queue>
#include <map>
using namespace std;
const int N = 2010;
typedef long long LL;
int n,m,k,d;
int x[N],y[N];
int g[N][N];
int get(int x1,int y1,int x2,int y2)
{
return abs(x1-x2)*abs(x1-x2)+abs(y1-y2)*abs(y1-y2);
}
void solve(){
cin>>n>>d;
d=d*d;
vector<bool> st(n+1,0),v(n+1,0);
for(int i=1;i<=n;i++) cin>>x[i]>>y[i];
for(int i=1;i<=n;i++){
for(int j=1;j<=n;j++)
{
if(i==j) continue;
if(get(x[i],y[i],x[j],y[j])<=d) g[i][j]=1;
}
}
queue<int> q;
q.push(1);st[1]=true;
while(q.size())
{
auto t=q.front();
q.pop();
if(!st[t]||v[t]) continue;
v[t]=true;
for(int i=1;i<=n;i++){
if(g[t][i]&&!v[i]){
st[i]=true;
q.push(i);
}
}
}
for(int i=1;i<=n;i++){
if(st[i]) cout<<"Yes\n";
else cout<<"No\n";
}
}
signed main()
{
cin.tie(0);cout.tie(0);ios::sync_with_stdio(0);
int t=1;
//cin>>t;
while(t--) solve();
}
D.线是固定的,其实这个题只要把草莓放入给定的区域块里面就行,可以抽象成每个块有x,y编号
,这个编号就是由x y轴围成的,坐标轴二分即可
#include <iostream>
#include <cstring>
#include <algorithm>
#include <vector>
#include<functional>
#include <cmath>
#include <queue>
#include <map>
using namespace std;
const int N = 2e5+10;
typedef long long LL;
typedef pair<int, int> PII;
#define int long long
int n,m,k,d;
PII a[N];
int x[N],y[N];
void solve(){
cin>>n>>m>>k;
for(int i=1;i<=k;i++){
cin>>a[i].first>>a[i].second;
}
int cnta,cntb;
cin>>cnta;
for(int i=1;i<=cnta;i++) cin>>x[i];
cin>>cntb;
for(int i=1;i<=cntb;i++) cin>>y[i];
x[++cnta]=n;y[++cntb]=m;
sort(x+1,x+1+cnta);
sort(y+1,y+1+cntb);
map<PII,int> mp;
for(int i=1;i<=k;i++)
{
int p=a[i].first,q=a[i].second;
int xx=lower_bound(x+1,x+1+cnta,p)-x;
int yy=lower_bound(y+1,y+1+cntb,q)-y;
cout<<xx<<" "<<yy<<"\n";
mp[{xx,yy}]++;
}
int mx=0,mn=0x3f3f3f3f;
int cnt=0;
for(auto&[kk,v]:mp){
mx=max(mx,v);
mn=min(mn,v);
cnt++;
}
if(cnt<cnta*cntb) mn=0;
cout<<mn<<" "<<mx<<"\n";
}
signed main()
{
cin.tie(0);cout.tie(0);ios::sync_with_stdio(0);
int t=1;
//cin>>t;
while(t--) solve();
}
E.其实就问当前点的集合是不是联通,并查集然后直接模拟就行了,查询哪些集合在一起不合法就好了
#include <iostream>
#include <cstring>
#include <algorithm>
#include <vector>
#include<functional>
#include <cmath>
#include <queue>
#include <map>
#include <set>
using namespace std;
const int N = 2e5+10;
typedef long long LL;
typedef pair<int, int> PII;
int p[N];
int n,m,k;
int find(int x) // 并查集
{
if (p[x] != x) p[x] = find(p[x]);
return p[x];
}
void solve(){
cin>>n>>m;
for(int i=1;i<=n;i++) p[i]=i;
for(int i=1;i<=m;i++){
int a,b;
cin>>a>>b;
a=find(a),b=find(b);
if(a!=b){
p[a]=b;
}
}
cin>>k;
set<PII> st;
for(int i=1;i<=k;i++){
int a,b;cin>>a>>b;
a=find(a),b=find(b);
if(a>b) swap(a,b);
st.insert({a,b});
}
int q;
cin>>q;
while(q--){
int a,b;
cin>>a>>b;
a=find(a),b=find(b);
if(a>b) swap(a,b);
if(st.count({a,b})) cout<<"No\n";
else cout<<"Yes\n";
}
}
signed main()
{
cin.tie(0);cout.tie(0);ios::sync_with_stdio(0);
int t=1;
//cin>>t;
while(t--) solve();
}
F:
直接枚举n的因子即可,因子最多200多个
设x=n的因子
通过字符串去确定x个位置能填什么
如果能填. 则有两个方法当前填.或#,否则只有#
注意如果n的因子是另一个n里面的因子
则方案会重复比如s="......"
枚举1方案只有一种“######”
枚举3的方案也只有一种"######"
但是两种方案是一样的,所以会造成重复,需要计算的时候减去
别看错题目哦,虽然m不同,但是答案凑成的字符串是只计算一种
#include <iostream>
#include <cstring>
#include <algorithm>
#include <vector>
#include<functional>
#include <cmath>
#include <queue>
#include <map>
#include <set>
using namespace std;
const int N = 2e5+10,mod=998244353;
typedef long long LL;
typedef pair<int, int> PII;
int n,m,k;
void solve()
{
string s;
cin>>n>>s;
s="?"+s;
set<int> st;
vector<int> f(n+1,0);
for(int i=1;i<n;i++){
if(n%i==0) st.insert(i);
}
int res=0;
for(auto x:st){
vector<bool> v(n+1,0);
for(int i=1;i<=n;i++)
{
int tt=(i)%x;
if(tt==0) tt=x;
if(s[i]=='.') v[tt]=1;
}
f[x]=1;
for(int i=1;i<=x;i++)
{
if(v[i]==0) f[x]=f[x]*2%mod;
else f[x]=f[x]*1;
}
for(int y:st)
{
if(y>=x) break;
if(x%y==0) f[x]=(f[x]-f[y]+mod)%mod;
}
res=(res+f[x])%mod;
}
for(auto&x:st)
{
cout<<x<<" "<<f[x]<<"\n";
}
cout<<(res)%mod<<"\n";
}
signed main()
{
cin.tie(0);cout.tie(0);ios::sync_with_stdio(0);
int t=1;
//cin>>t;
while(t--) solve();
}