小   银   川,给大爷们AK穿了

比赛地址:https://www.jisuanke.com/contest/3005?view=challenges

A、(待补)

B、1e9的数据范围,一开始从1到n的所有数字都有一个标记

q个询问,去掉某个数字上的标记,询问某个数字之后最靠近它的有标记的数字,保证n一直有标记,去除了无解的情况

用一个类似于动态分配的并查集,离线处理所有询问,首先给所有询问的点分配空间,每次给某个点打上标记就相当于把这个点与这个点加一合并

用了unordered_map加快读快写,甚至关了define int long long才卡过去

代码:

#include <bits/stdc++.h>
//#define int long long
#define sc(a) scanf("%lld",&a)
#define scc(a,b) scanf("%lld %lld",&a,&b)
#define sccc(a,b,c) scanf("%lld %lld %lld",&a,&b,&c)
#define schar(a) scanf("%c",&a)
#define pr(a) printf("%lld",a)
#define fo(i,a,b) for(int i=a;i<b;++i)
#define re(i,a,b) for(int i=a;i<=b;++i)
#define rfo(i,a,b) for(int i=a;i>b;--i)
#define rre(i,a,b) for(int i=a;i>=b;--i)
#define prn() printf("\n")
#define prs() printf(" ")
#define mkp make_pair
#define pii pair<int,int>
#define pub(a) push_back(a)
#define pob() pop_back()
#define puf(a) push_front(a)
#define pof() pop_front()
#define fst first
#define snd second
#define frt front()
#define bak back()
#define mem0(a) memset(a,0,sizeof(a))
#define memmx(a) memset(a,0x3f3f,sizeof(a))
#define memmn(a) memset(a,-0x3f3f,sizeof(a))
#define debug
#define db double
#define yyes cout<<"YES"<<endl;
#define nno cout<<"NO"<<endl;
using namespace std;
typedef vector<int> vei;
typedef vector<pii> vep;
typedef map<int,int> mpii;
typedef map<char,int> mpci;
typedef map<string,int> mpsi;
typedef deque<int> deqi;
typedef deque<char> deqc;
typedef priority_queue<int> mxpq;
typedef priority_queue<int,vector<int>,greater<int> > mnpq;
typedef priority_queue<pii> mxpqii;
typedef priority_queue<pii,vector<pii>,greater<pii> > mnpqii;
const int maxn=1000005;
//const int inf=0x3f3f3f3f3f3f3f3f;
const int MOD=100000007;
const db eps=1e-10;
int qpow(int a,int b){int tmp=a%MOD,ans=1;while(b){if(b&1){ans*=tmp,ans%=MOD;}tmp*=tmp,tmp%=MOD,b>>=1;}return ans;}
int lowbit(int x){return x&-x;}
int max(int a,int b){return a>b?a:b;}
int min(int a,int b){return a<b?a:b;}
int mmax(int a,int b,int c){return max(a,max(b,c));}
int mmin(int a,int b,int c){return min(a,min(b,c));}
void mod(int &a){a+=MOD;a%=MOD;}
bool chk(int now){}
int half(int l,int r){while(l<=r){int m=(l+r)/2;if(chk(m))r=m-1;else l=m+1;}return l;}
int ll(int p){return p<<1;}
int rr(int p){return p<<1|1;}
int mm(int l,int r){return (l+r)/2;}
int lg(int x){if(x==0) return 1;return (int)log2(x)+1;}
bool smleql(db a,db b){if(a<b||fabs(a-b)<=eps)return true;return false;}
db len(db a,db b,db c,db d){return sqrt((a-c)*(a-c)+(b-d)*(b-d));}
bool isp(int x){if(x==1)return false;if(x==2)return true;for(int i=2;i*i<=x;++i)if(x%i==0)return false;return true;}
inline int read()
{char ch=getchar();int s=0,w=1;while(ch<48||ch>57){if(ch=='-')w=-1;ch=getchar();}while(ch>=48&&ch<=57){s=(s<<1)+(s<<3)+ch-48;ch=getchar();}return s*w;
}
inline void write(int x)
{if(x<0)putchar('-'),x=-x;if(x>9)write(x/10);putchar(x%10+48);
}int n,q,z[maxn],x[maxn];
unordered_map<int,int> fa;int _find(int x){if(fa[x]==0){fa[x]=x;return x;}if(x!=fa[x]) fa[x]=_find(fa[x]);return fa[x];
}signed main(){n=read(),q=read();re(i,1,q)z[i]=read(),x[i]=read(),fa[x[i]]=x[i];re(i,1,q){if(z[i]==1)fa[x[i]]=x[i]+1;else if(z[i]==2)write(_find(x[i])),prn();}return 0;
}

C、签到,但是因为题意不清被吐槽为工地英语

传世经典:and each part weighs two times as much as a kilogram

实际意思是切成两半,每一半都是偶数,特判一下2完事

代码:

#include <bits/stdc++.h>
#define int long long
#define sc(a) scanf("%lld",&a)
#define scc(a,b) scanf("%lld %lld",&a,&b)
#define sccc(a,b,c) scanf("%lld %lld %lld",&a,&b,&c)
#define schar(a) scanf("%c",&a)
#define pr(a) printf("%lld",a)
#define fo(i,a,b) for(int i=a;i<b;++i)
#define re(i,a,b) for(int i=a;i<=b;++i)
#define rfo(i,a,b) for(int i=a;i>b;--i)
#define rre(i,a,b) for(int i=a;i>=b;--i)
#define prn() printf("\n")
#define prs() printf(" ")
#define mkp make_pair
#define pii pair<int,int>
#define pub(a) push_back(a)
#define pob() pop_back()
#define puf(a) push_front(a)
#define pof() pop_front()
#define fst first
#define snd second
#define frt front()
#define bak back()
#define mem0(a) memset(a,0,sizeof(a))
#define memmx(a) memset(a,0x3f3f,sizeof(a))
#define memmn(a) memset(a,-0x3f3f,sizeof(a))
#define debug
#define db double
#define yyes cout<<"YES"<<endl;
#define nno cout<<"NO"<<endl;
using namespace std;
typedef vector<int> vei;
typedef vector<pii> vep;
typedef map<int,int> mpii;
typedef map<char,int> mpci;
typedef map<string,int> mpsi;
typedef deque<int> deqi;
typedef deque<char> deqc;
typedef priority_queue<int> mxpq;
typedef priority_queue<int,vector<int>,greater<int> > mnpq;
typedef priority_queue<pii> mxpqii;
typedef priority_queue<pii,vector<pii>,greater<pii> > mnpqii;
const int maxn=500005;
const int inf=0x3f3f3f3f3f3f3f3f;
const int MOD=100000007;
const db eps=1e-10;
int qpow(int a,int b){int tmp=a%MOD,ans=1;while(b){if(b&1){ans*=tmp,ans%=MOD;}tmp*=tmp,tmp%=MOD,b>>=1;}return ans;}
int lowbit(int x){return x&-x;}
int max(int a,int b){return a>b?a:b;}
int min(int a,int b){return a<b?a:b;}
int mmax(int a,int b,int c){return max(a,max(b,c));}
int mmin(int a,int b,int c){return min(a,min(b,c));}
void mod(int &a){a+=MOD;a%=MOD;}
bool chk(int now){}
int half(int l,int r){while(l<=r){int m=(l+r)/2;if(chk(m))r=m-1;else l=m+1;}return l;}
int ll(int p){return p<<1;}
int rr(int p){return p<<1|1;}
int mm(int l,int r){return (l+r)/2;}
int lg(int x){if(x==0) return 1;return (int)log2(x)+1;}
bool smleql(db a,db b){if(a<b||fabs(a-b)<=eps)return true;return false;}
db len(db a,db b,db c,db d){return sqrt((a-c)*(a-c)+(b-d)*(b-d));}
bool isp(int x){if(x==1)return false;if(x==2)return true;for(int i=2;i*i<=x;++i)if(x%i==0)return false;return true;}int n;signed main(){ios_base::sync_with_stdio(0);cin.tie(0),cout.tie(0);cin>>n;if(n%2==0&&n!=2) cout<<"YES";else cout<<"NO";return 0;
}

D、题解写的kmp,被find过穿了,没构造的数据在find面前还是太弱了

题意是给你一个字符串s和t个字符串t,你需要判断他们的关系:

完全一样输出jntm!,长度相同但不一样输出friend!

t比s短并且t是s的子串输出my child!,否则输出oh, child!

t比s长并且s是t的子串输出my teacher!,否则输出senior!

这种输出题最好还是复制样例,不然连oh和child之间的空格都不一定看得见

判断s是不是t的子串套用if(t.find(s)!=t.npos)即可

代码:

#include <bits/stdc++.h>
#define int long long
#define sc(a) scanf("%lld",&a)
#define scc(a,b) scanf("%lld %lld",&a,&b)
#define sccc(a,b,c) scanf("%lld %lld %lld",&a,&b,&c)
#define schar(a) scanf("%c",&a)
#define pr(a) printf("%lld",a)
#define fo(i,a,b) for(int i=a;i<b;++i)
#define re(i,a,b) for(int i=a;i<=b;++i)
#define rfo(i,a,b) for(int i=a;i>b;--i)
#define rre(i,a,b) for(int i=a;i>=b;--i)
#define prn() printf("\n")
#define prs() printf(" ")
#define mkp make_pair
#define pii pair<int,int>
#define pub(a) push_back(a)
#define pob() pop_back()
#define puf(a) push_front(a)
#define pof() pop_front()
#define fst first
#define snd second
#define frt front()
#define bak back()
#define mem0(a) memset(a,0,sizeof(a))
#define memmx(a) memset(a,0x3f3f,sizeof(a))
#define memmn(a) memset(a,-0x3f3f,sizeof(a))
#define debug
#define db double
#define yyes cout<<"YES"<<endl;
#define nno cout<<"NO"<<endl;
using namespace std;
typedef vector<int> vei;
typedef vector<pii> vep;
typedef map<int,int> mpii;
typedef map<char,int> mpci;
typedef map<string,int> mpsi;
typedef deque<int> deqi;
typedef deque<char> deqc;
typedef priority_queue<int> mxpq;
typedef priority_queue<int,vector<int>,greater<int> > mnpq;
typedef priority_queue<pii> mxpqii;
typedef priority_queue<pii,vector<pii>,greater<pii> > mnpqii;
const int maxn=500005;
const int inf=0x3f3f3f3f3f3f3f3f;
const int MOD=100000007;
const db eps=1e-10;
int qpow(int a,int b){int tmp=a%MOD,ans=1;while(b){if(b&1){ans*=tmp,ans%=MOD;}tmp*=tmp,tmp%=MOD,b>>=1;}return ans;}
int lowbit(int x){return x&-x;}
int max(int a,int b){return a>b?a:b;}
int min(int a,int b){return a<b?a:b;}
int mmax(int a,int b,int c){return max(a,max(b,c));}
int mmin(int a,int b,int c){return min(a,min(b,c));}
void mod(int &a){a+=MOD;a%=MOD;}
bool chk(int now){}
int half(int l,int r){while(l<=r){int m=(l+r)/2;if(chk(m))r=m-1;else l=m+1;}return l;}
int ll(int p){return p<<1;}
int rr(int p){return p<<1|1;}
int mm(int l,int r){return (l+r)/2;}
int lg(int x){if(x==0) return 1;return (int)log2(x)+1;}
bool smleql(db a,db b){if(a<b||fabs(a-b)<=eps)return true;return false;}
db len(db a,db b,db c,db d){return sqrt((a-c)*(a-c)+(b-d)*(b-d));}
bool isp(int x){if(x==1)return false;if(x==2)return true;for(int i=2;i*i<=x;++i)if(x%i==0)return false;return true;}string s,t;
int q;signed main(){ios_base::sync_with_stdio(0);cin.tie(0),cout.tie(0);cin>>s;cin>>q;while(q--){cin>>t;if(s.length()==t.length()){if(s==t) cout<<"jntm!"<<endl;else cout<<"friend!"<<endl;}else if(s.length()>t.length()){if(s.find(t)!=s.npos) cout<<"my child!"<<endl;else cout<<"oh, child!"<<endl;}else{if(t.find(s)!=t.npos) cout<<"my teacher!"<<endl;else cout<<"senior!"<<endl;}}return 0;
}

E、(待补)

F、(待补)

G、关于回文自动机参见:http://www.mynameisdhr.com/%e5%9b%9e%e6%96%87%e8%87%aa%e5%8a%a8%e6%9c%ba/

题面是给你一个串,每个回文子串的贡献是当中出现的不同字符个数,统计所有子串的总贡献

回文自动机裸题,建出PAM之后dfs搜答案即可,注意对答案的贡献要乘以本质相同的回文串个数

代码:

#include <bits/stdc++.h>
#define int long long
#define sc(a) scanf("%lld",&a)
#define scc(a,b) scanf("%lld %lld",&a,&b)
#define sccc(a,b,c) scanf("%lld %lld %lld",&a,&b,&c)
#define schar(a) scanf("%c",&a)
#define pr(a) printf("%lld",a)
#define fo(i,a,b) for(int i=a;i<b;++i)
#define re(i,a,b) for(int i=a;i<=b;++i)
#define rfo(i,a,b) for(int i=a;i>b;--i)
#define rre(i,a,b) for(int i=a;i>=b;--i)
#define prn() printf("\n")
#define prs() printf(" ")
#define mkp make_pair
#define pii pair<int,int>
#define pub(a) push_back(a)
#define pob() pop_back()
#define puf(a) push_front(a)
#define pof() pop_front()
#define fst first
#define snd second
#define frt front()
#define bak back()
#define mem0(a) memset(a,0,sizeof(a))
#define memmx(a) memset(a,0x3f3f,sizeof(a))
#define memmn(a) memset(a,-0x3f3f,sizeof(a))
#define debug
#define db double
#define yyes cout<<"YES"<<endl;
#define nno cout<<"NO"<<endl;
using namespace std;
typedef vector<int> vei;
typedef vector<pii> vep;
typedef map<int,int> mpii;
typedef map<char,int> mpci;
typedef map<string,int> mpsi;
typedef deque<int> deqi;
typedef deque<char> deqc;
typedef priority_queue<int> mxpq;
typedef priority_queue<int,vector<int>,greater<int> > mnpq;
typedef priority_queue<pii> mxpqii;
typedef priority_queue<pii,vector<pii>,greater<pii> > mnpqii;
const int maxn=500005;
const int inf=0x3f3f3f3f3f3f3f3f;
const int MOD=100000007;
const db eps=1e-10;
int qpow(int a,int b){int tmp=a%MOD,ans=1;while(b){if(b&1){ans*=tmp,ans%=MOD;}tmp*=tmp,tmp%=MOD,b>>=1;}return ans;}
int lowbit(int x){return x&-x;}
int max(int a,int b){return a>b?a:b;}
int min(int a,int b){return a<b?a:b;}
int mmax(int a,int b,int c){return max(a,max(b,c));}
int mmin(int a,int b,int c){return min(a,min(b,c));}
void mod(int &a){a+=MOD;a%=MOD;}
bool chk(int now){}
int half(int l,int r){while(l<=r){int m=(l+r)/2;if(chk(m))r=m-1;else l=m+1;}return l;}
int ll(int p){return p<<1;}
int rr(int p){return p<<1|1;}
int mm(int l,int r){return (l+r)/2;}
int lg(int x){if(x==0) return 1;return (int)log2(x)+1;}
bool smleql(db a,db b){if(a<b||fabs(a-b)<=eps)return true;return false;}
db len(db a,db b,db c,db d){return sqrt((a-c)*(a-c)+(b-d)*(b-d));}
bool isp(int x){if(x==1)return false;if(x==2)return true;for(int i=2;i*i<=x;++i)if(x%i==0)return false;return true;}struct PAM{
int tot,last,n,cur;
int fail[maxn],len[maxn],cnt[maxn],son[maxn][26],num[maxn];
char s[maxn];
int get(int p,int x){while(s[x-len[p]-1]!=s[x])p=fail[p];return p;}
int newnode(int x){len[tot]=x;return tot++;}
void build(){
scanf("%s",s+1);
s[0]=-1,fail[0]=1,last=0;
newnode(0),newnode(-1);
for(n=1;s[n];++n){
s[n]-='a';
cur=get(last,n);
if(!son[cur][s[n]]){
int now=newnode(len[cur]+2);
fail[now]=son[get(fail[cur],n)][s[n]];
num[now]=num[fail[now]]+1;//
son[cur][s[n]]=now;
}
cnt[last=son[cur][s[n]]]++;
}
for(int i=tot-1;i>=0;--i)
cnt[fail[i]]+=cnt[i];
}
}pam;int v[26],ans=0;void dfs(int x,int k){if(pam.len[x]>0) ans+=k*pam.cnt[x];fo(i,0,26){if(pam.son[x][i]!=0){if(!v[i]){v[i]=1;dfs(pam.son[x][i],k+1);v[i]=0;}else dfs(pam.son[x][i],k);}}
}signed main(){ios_base::sync_with_stdio(0);cin.tie(0),cout.tie(0);pam.build();dfs(0,0);dfs(1,0);pr(ans);return 0;
}

H、(待补)

I、给你一个n(n<=1e5)个数字的排列,m个询问,询问在[l,r]区间中有多少个i<j使得min(p[i],p[j])=gcd(p[i],p[j])

条件化简一下实际上就是p[i]是p[j]的倍数或者p[j]是p[i]的倍数

考虑到n不太大,也许所有合法的(i,j)可以预先处理好,然后把询问离线,按照右端点大小进行排序,看看有多少个(i,j)落在询问的区间内

到这儿已经基本得到雏形了,一个稍加修改的二维偏序

可以维护关于左端点的权值树状数组,在保证右端点满足大小关系的情况下在左端点位置加一

跟cdq分治不同的是,本题不需要在每次更换询问的时候清空树状数组

代码:

#include <bits/stdc++.h>
using namespace std;
const int maxn=100005;
inline int read()
{char ch=getchar();int s=0,w=1;while(ch<48||ch>57){if(ch=='-')w=-1;ch=getchar();}while(ch>=48&&ch<=57){s=(s<<1)+(s<<3)+ch-48;ch=getchar();}return s*w;
}
inline void write(int x)
{if(x<0)putchar('-'),x=-x;if(x>9)write(x/10);putchar(x%10+48);
}
//
int n,m,l,r,p[maxn],rp[maxn],ans[maxn];
struct node{int l,r;node(int L,int R):l(L),r(R){}bool operator < (const node& o)const{if(r!=o.r) return r<o.r;else return l<o.l;}
};
struct query{int l,r,id;query(int L,int R,int I):l(L),r(R),id(I){}bool operator < (const query& o)const{if(r!=o.r) return r<o.r;else return l<o.l;}
};
vector<node> pir;
vector<query> ask;
//
int tr[maxn];
inline int lowbit(int x){return x&-x;}
inline void add(int x,int y){for(;x<=n;x+=lowbit(x)) tr[x]+=y;
}
inline int sum(int x){int res=0;for(;x>0;x-=lowbit(x)) res+=tr[x];return res;
}int main(){n=read(),m=read();for(int i=1;i<=n;++i)p[i]=read(),rp[p[i]]=i;for(int i=1;i<=n;++i){int cnt=2;while(p[i]*cnt<=n){pir.push_back(node(min(i,rp[p[i]*cnt]),max(i,rp[p[i]*cnt])));cnt++;}}sort(pir.begin(),pir.end());
//    for(int i=0;i<pir.size();++i) cout<<pir[i].l<<' '<<pir[i].r<<endl;for(int i=1;i<=m;++i){l=read(),r=read();ask.push_back(query(l,r,i));}sort(ask.begin(),ask.end());int tmp=0;for(int i=0;i<ask.size();++i){while(pir[tmp].r<=ask[i].r&&tmp<pir.size()){
//            cout<<pir[tmp].l<<' '<<pir[tmp].r<<endl;add(pir[tmp].l,1);tmp++;}ans[ask[i].id]=sum(n)-sum(ask[i].l-1);}for(int i=1;i<=m;++i)write(ans[i]),printf("\n");return 0;
}
/*
6 3
1 5 6 2 4 3
3 5
2 3
1 3
*/

J、一棵树,默认1为树根

假设当前节点x有k个孩子,那么会在该节点等概率地选择k次,每次选择一个孩子继续dfs,每次dfs都更新最大树高,问你最后正确得到树高的概率是多少

答案以逆元形式输出一个分数即可

考虑树形dp向上转移,不为最大深度的叶子节点概率为0,为最大深度的叶子节点概率为1

一次选择中每个孩子被选中的概率是1/k,选择k次,一开始我以为选择k次是假的,果然WA了

实际上应该考虑在某一次选择中走不到正确位置的概率,为:

sigma((1-dp[son])/k)

那么k次选择之后走不到的概率就是上式的k次方,最后走到的概率就用1减去走不到的概率即可。

注意对于1减去一个大逆元,可以用1减去大逆元再加上模数的方式

代码:

#include <bits/stdc++.h>
#define int long long
#define sc(a) scanf("%lld",&a)
#define scc(a,b) scanf("%lld %lld",&a,&b)
#define sccc(a,b,c) scanf("%lld %lld %lld",&a,&b,&c)
#define schar(a) scanf("%c",&a)
#define pr(a) printf("%lld",a)
#define fo(i,a,b) for(int i=a;i<b;++i)
#define re(i,a,b) for(int i=a;i<=b;++i)
#define rfo(i,a,b) for(int i=a;i>b;--i)
#define rre(i,a,b) for(int i=a;i>=b;--i)
#define prn() printf("\n")
#define prs() printf(" ")
#define mkp make_pair
#define pii pair<int,int>
#define pub(a) push_back(a)
#define pob() pop_back()
#define puf(a) push_front(a)
#define pof() pop_front()
#define fst first
#define snd second
#define frt front()
#define bak back()
#define mem0(a) memset(a,0,sizeof(a))
#define memmx(a) memset(a,0x3f3f,sizeof(a))
#define memmn(a) memset(a,-0x3f3f,sizeof(a))
#define debug
#define db double
#define yyes cout<<"YES"<<endl;
#define nno cout<<"NO"<<endl;
using namespace std;
typedef vector<int> vei;
typedef vector<pii> vep;
typedef map<int,int> mpii;
typedef map<char,int> mpci;
typedef map<string,int> mpsi;
typedef deque<int> deqi;
typedef deque<char> deqc;
typedef priority_queue<int> mxpq;
typedef priority_queue<int,vector<int>,greater<int> > mnpq;
typedef priority_queue<pii> mxpqii;
typedef priority_queue<pii,vector<pii>,greater<pii> > mnpqii;
const int maxn=1000005;
const int inf=0x3f3f3f3f3f3f3f3f;
const int MOD=1000000007;
const db eps=1e-10;
int qpow(int a,int b){int tmp=a%MOD,ans=1;while(b){if(b&1){ans*=tmp,ans%=MOD;}tmp*=tmp,tmp%=MOD,b>>=1;}return ans;}
int lowbit(int x){return x&-x;}
int max(int a,int b){return a>b?a:b;}
int min(int a,int b){return a<b?a:b;}
int mmax(int a,int b,int c){return max(a,max(b,c));}
int mmin(int a,int b,int c){return min(a,min(b,c));}
void mod(int &a){a+=MOD;a%=MOD;}
bool chk(int now){}
int half(int l,int r){while(l<=r){int m=(l+r)/2;if(chk(m))r=m-1;else l=m+1;}return l;}
int ll(int p){return p<<1;}
int rr(int p){return p<<1|1;}
int mm(int l,int r){return (l+r)/2;}
int lg(int x){if(x==0) return 1;return (int)log2(x)+1;}
bool smleql(db a,db b){if(a<b||fabs(a-b)<=eps)return true;return false;}
db len(db a,db b,db c,db d){return sqrt((a-c)*(a-c)+(b-d)*(b-d));}
bool isp(int x){if(x==1)return false;if(x==2)return true;for(int i=2;i*i<=x;++i)if(x%i==0)return false;return true;}int n,x,y;
vei tr[maxn];
int dep[maxn],mx=-inf;
int dp[maxn];void dfs1(int x,int f){dep[x]=dep[f]+1;mx=max(mx,dep[x]);fo(i,0,tr[x].size()){if(tr[x][i]!=f)dfs1(tr[x][i],x);}
}void dfs2(int x,int f){int k=0,sum=0;fo(i,0,tr[x].size()){if(tr[x][i]!=f) k++;}fo(i,0,tr[x].size()){if(tr[x][i]!=f){dfs2(tr[x][i],x);sum+=(1-dp[tr[x][i]]+MOD)%MOD,sum%=MOD;}}sum=sum*qpow(k,MOD-2)%MOD;sum=qpow(sum,k)%MOD;if(k==0&&dep[x]==mx)dp[x]=1;else if(k==0&&dep[x]!=mx)dp[x]=0;elsedp[x]=(1-sum+MOD)%MOD;
}signed main(){ios_base::sync_with_stdio(0);cin.tie(0),cout.tie(0);sc(n);re(i,1,n-1) scc(x,y),tr[x].pub(y),tr[y].pub(x);dfs1(1,1);dfs2(1,1);pr(dp[1]);return 0;
}

K、给你至多1000个点的集合,你需要找到一个中心点并且加入一些点,使得所有点的对称点都在集合中

你只需要找到最少需要加入的点数,而不需要找到那个中心点。

由于点数较少,考虑n方枚举,首先猜测一个结论,答案构成的中心点一定在某两点的对称中心上,这样才能最小化加入的点数

那么枚举所有两个点,利用map存储它们的中心点出现的次数,答案就是n-最多中心点出现的次数

考虑到n方枚举实际上把每个点对枚举了两次,所以用map维护的时候每次只需要加一即可

代码:

#include <bits/stdc++.h>
#define int long long
#define sc(a) scanf("%lld",&a)
#define scc(a,b) scanf("%lld %lld",&a,&b)
#define sccc(a,b,c) scanf("%lld %lld %lld",&a,&b,&c)
#define schar(a) scanf("%c",&a)
#define pr(a) printf("%lld",a)
#define fo(i,a,b) for(int i=a;i<b;++i)
#define re(i,a,b) for(int i=a;i<=b;++i)
#define rfo(i,a,b) for(int i=a;i>b;--i)
#define rre(i,a,b) for(int i=a;i>=b;--i)
#define prn() printf("\n")
#define prs() printf(" ")
#define mkp make_pair
#define pii pair<int,int>
#define pub(a) push_back(a)
#define pob() pop_back()
#define puf(a) push_front(a)
#define pof() pop_front()
#define fst first
#define snd second
#define frt front()
#define bak back()
#define mem0(a) memset(a,0,sizeof(a))
#define memmx(a) memset(a,0x3f3f,sizeof(a))
#define memmn(a) memset(a,-0x3f3f,sizeof(a))
#define debug
#define db double
#define yyes cout<<"YES"<<endl;
#define nno cout<<"NO"<<endl;
using namespace std;
typedef vector<int> vei;
typedef vector<pii> vep;
typedef map<int,int> mpii;
typedef map<char,int> mpci;
typedef map<string,int> mpsi;
typedef deque<int> deqi;
typedef deque<char> deqc;
typedef priority_queue<int> mxpq;
typedef priority_queue<int,vector<int>,greater<int> > mnpq;
typedef priority_queue<pii> mxpqii;
typedef priority_queue<pii,vector<pii>,greater<pii> > mnpqii;
const int maxn=500005;
const int inf=0x3f3f3f3f3f3f3f3f;
const int MOD=100000007;
const db eps=1e-10;
int qpow(int a,int b){int tmp=a%MOD,ans=1;while(b){if(b&1){ans*=tmp,ans%=MOD;}tmp*=tmp,tmp%=MOD,b>>=1;}return ans;}
int lowbit(int x){return x&-x;}
int max(int a,int b){return a>b?a:b;}
int min(int a,int b){return a<b?a:b;}
int mmax(int a,int b,int c){return max(a,max(b,c));}
int mmin(int a,int b,int c){return min(a,min(b,c));}
void mod(int &a){a+=MOD;a%=MOD;}
bool chk(int now){}
int half(int l,int r){while(l<=r){int m=(l+r)/2;if(chk(m))r=m-1;else l=m+1;}return l;}
int ll(int p){return p<<1;}
int rr(int p){return p<<1|1;}
int mm(int l,int r){return (l+r)/2;}
int lg(int x){if(x==0) return 1;return (int)log2(x)+1;}
bool smleql(db a,db b){if(a<b||fabs(a-b)<=eps)return true;return false;}
db len(db a,db b,db c,db d){return sqrt((a-c)*(a-c)+(b-d)*(b-d));}
bool isp(int x){if(x==1)return false;if(x==2)return true;for(int i=2;i*i<=x;++i)if(x%i==0)return false;return true;}int n;
int x[maxn],y[maxn];
mpii cnt;signed main(){ios_base::sync_with_stdio(0);cin.tie(0),cout.tie(0);sc(n);re(i,1,n) scc(x[i],y[i]),x[i]*=10,y[i]*=10;int mx=-inf;re(i,1,n){re(j,1,n){cnt[(x[i]+x[j])/2*10000000+(y[i]+y[j])/2]++;mx=max(mx,cnt[(x[i]+x[j])/2*10000000+(y[i]+y[j])/2]);}}pr(n-mx);return 0;
}

L、(待补)

M、(待补)

转载于:https://www.cnblogs.com/oneman233/p/11483306.html

The Preliminary Contest for ICPC Asia Xuzhou 2019相关推荐

  1. The Preliminary Contest for ICPC Asia Xuzhou 2019 徐州网络赛 XKC's basketball team

    XKC , the captain of the basketball team , is directing a train of nn team members. He makes all mem ...

  2. The Preliminary Contest for ICPC Asia Xuzhou 2019 - C Buy Watermelon | 读题

    They want to cut the watermelon in two parts, and each part weighs two times as much as a kilogram . ...

  3. The Preliminary Contest for ICPC Asia Xuzhou 2019【B. so easy】(set 解法 与正解 unordered_map+并查集)

    so easy 题目大意 给你两个操作,op=1时,将那个数不可用,op=2时进行查询功能 找到从x开始第一个存在的数 非官方题解 set 内置红黑树,有默认从小到大排序功能,所以我们可以暴力一发,不 ...

  4. [The Preliminary Contest for ICPC Asia Xuzhou 2019 - 徐州网络赛E] XKC's basketball team

    XKC's basketball team XKC , the captain of the basketball team , is directing a train of nn team mem ...

  5. The Preliminary Contest for ICPC Asia Nanjing 2019 B. super_log (广义欧拉降幂)

    In Complexity theory, some functions are nearly O(1)O(1), but it is greater then O(1)O(1). For examp ...

  6. H. Holy Grail(The Preliminary Contest for ICPC Asia Nanjing 2019题解)

    题目链接 As the current heir of a wizarding family with a long history,unfortunately, you find yourself ...

  7. The Preliminary Contest for ICPC Asia Shanghai 2019 B. Light bulbs(卡了线段树空间的思维题)

    传送门:https://nanti.jisuanke.com/t/41399 题目描述 There are NNN light bulbs indexed from 000 to N−1N−1N−1. ...

  8. The Preliminary Contest for ICPC Asia Shanghai 2019 Light bulbs

    https://nanti.jisuanke.com/t/41399 离散差分 #include <iostream> #include <cstring> #include ...

  9. The Preliminary Contest for ICPC Asia Shanghai 2019 BDL

    传送门 B:离散化+差分 #include <bits/stdc++.h> using namespace std; typedef long long ll; struct node{i ...

最新文章

  1. OpenCV下车牌定位算法实现代码
  2. BCH网络成功发布第一个商业级别的Token
  3. Prism V2之旅(1)
  4. 陶哲轩实分析 习题 13.5.6
  5. 在叠堆及虚拟化的今天生成树存在的理由
  6. minhash pyspark 源码分析——hash join table是关键
  7. php curl post 文件_php curl文件上传$_FILES为空,只有$_POST有值,如何兼容php5.0~5.6各版本...
  8. Java程序员面试中的多线程问题
  9. 怎么样武直不打_打HPV疫苗期间意外怀孕?怎么办?
  10. java中try 与catch的使用
  11. python opencv轮廓检测_OpenCV 轮廓检测的实现方法
  12. 数据清洗-python实践
  13. Auto login to your computer
  14. nginx curl linux,linux nginx 下通过curl url方式,符以后的参数无效
  15. 计算机设备序列号都一样,如何使用adb工具
  16. Vue报错,[WDS] Disconnected!
  17. java编码规范试题_java编码规范考试题答案完整版.doc
  18. 《Linux驱动:DM9000网卡驱动分析》
  19. 利用python在excel中画图
  20. 短时傅里叶变换STFT(非使用fft函数)

热门文章

  1. 云开发:微信小程序开发-组件化开发
  2. 46個不可不知的常識
  3. HTML中给div加超链接
  4. 高通7x27a平台UART配置
  5. (八)苏世民:我的经验和教训:决策(567)
  6. win10彻底关闭更新
  7. MFC下载—时间记录
  8. java计算机毕业设计智慧防疫上报系统服务端源码+数据库+系统+lw文档
  9. Python Keras ValueError: Layer sequential expects 1 input(s), but it received 2 input tensors. 解决方法
  10. 锐龙R5 4500 怎么样 相当于什么水平