• 2021 CCPC 威海 A J G D(树,计算几何,组合数,字符串哈希)


     Problem - A - Codeforces

    A. Goodbye, Ziyin!        【树】

    题意:给出一颗无根树,询问有多少个点以它为根时是棵二 叉树。

    思路:首先,只有度小于等于3的结点才能算入答案;同时,如果有结点度数为大于等于4,那么不可能为二叉树,直接输出0。

    注意:快读输入,不然会超时

    代码:

    1. #include
    2. using namespace std;
    3. vector<int> vec[1000006];
    4. inline int read(){
    5. int x=0,f=1;
    6. char ch=getchar();
    7. while(ch<'0'||ch>'9'){
    8. if(ch=='-')
    9. f=-1;
    10. ch=getchar();
    11. }
    12. while(ch>='0'&&ch<='9'){
    13. x=(x<<1)+(x<<3)+(ch^48);
    14. ch=getchar();
    15. }
    16. return x*f;
    17. }
    18. int main()
    19. {
    20. int n;n=read();int ans=0;
    21. for(int i=1;i
    22. int u,v;u=read();v=read();
    23. vec[u].push_back(v);
    24. vec[v].push_back(u);
    25. }
    26. bool flag=0;
    27. for(int i=1;i<=n;i++){
    28. if(vec[i].size()>=4){flag=1;break;}
    29. if(vec[i].size()<3)ans++;
    30. }
    31. if(flag)cout<<0<<'\n';
    32. else cout<'\n';
    33. return 0;
    34. }

    J. Circular Billiard Table        【计算几何 数学】

    Problem - J - Codeforces

    思路:从样例可以得出,目标是 180*x=a/b*y, 求的是y,y是整数,所以x最小,且使得y是整数。y=180*b*x/a,可以看出,为了使y是整数,x=a/__gcd(180b,a),所以y=180b/__gcd(180b,a)。最后输出答案y-1。

    1. #include
    2. using namespace std;
    3. #define int long long
    4. signed main()
    5. {
    6. int T;cin>>T;
    7. while(T--){
    8. int n,m;cin>>n>>m;
    9. m=180*m;
    10. cout<-1<
    11. }
    12. }

    Problem - G - Codeforces

    G. Shinyruo and KFC        【组合数】

    思路:目标是求出ni(mjai),输出mj在[1,j]的所有情况

    初步设想是先把所有阶乘求出来,求出 所有ai的阶乘 的乘积的逆元,然后再每一个mj的情况下,用快速幂求出m的阶乘的n次方,之后n次乘法求出(mj-ai)的阶乘。但是时间复杂度是O(mn),会超时。

    优化一下,发现a的总和是1e5,所以有很多重复的a[i]值,用map存一下,最后用快速幂乘起来就可以了

    代码:

    1. #include
    2. using namespace std;
    3. #define int long long
    4. int pre[100005];
    5. int a[50005];
    6. map<int,int>mp;
    7. const int mod=998244353;
    8. long long binpow(long long a, long long b, long long m) {
    9. a %= m;
    10. long long res = 1;
    11. while (b > 0) {
    12. if (b & 1) res = (__int128)res * a % m;
    13. a = (__int128)a * a % m;
    14. b >>= 1;
    15. }
    16. return res;
    17. }
    18. signed main()
    19. {
    20. pre[0]=1;
    21. int n,m;cin>>n>>m;
    22. for(int i=1;i<=1e5;i++){pre[i]=pre[i-1]*i%mod;}
    23. int maxx=0;int fb=1;
    24. for(int i=1;i<=n;i++){
    25. cin>>a[i];maxx=max(maxx,a[i]);
    26. fb=fb*pre[a[i]]%mod;mp[a[i]]++;
    27. }//分母z
    28. int nfb=binpow(fb,mod-2,mod);
    29. for(int i=1;i<=m;i++){
    30. if(i0<<'\n';continue;}
    31. int za=binpow(pre[i],n,mod);
    32. int fa=1;
    33. //优化部分:
    34. for(auto v:mp){
    35. fa=fa*binpow(pre[i-v.first],v.second,mod);
    36. fa=fa%mod;
    37. }
    38. int nfa=binpow(fa,mod-2,mod);
    39. cout<'\n';
    40. }
    41. return 0;
    42. }

    Problem - D - Codeforces

    D. Period

    题意:给你一个字符串,q次查询,每次查询会将字符串中的一个字符修改为#,求在新串中可以选出几种长度不同的前后缀,使得前后缀相同

    注意:输入取消同步,不然会超时

    思路:用字符串哈希直接暴力比较前后缀是否相同

    代码:

    1. #include
    2. using namespace std;
    3. const int N = 1e6 + 5;
    4. const unsigned long long base = 13331;
    5. string s;int n;
    6. unsigned long long has[N];
    7. unsigned long long p[N];
    8. void init(){
    9. p[0]=1;has[0]=0;
    10. n=s.size()-1;
    11. for(int i=1;i<=n;i++){
    12. p[i]=p[i-1]*base;
    13. has[i]=has[i-1]*base+(s[i]-'a');
    14. }
    15. }
    16. unsigned long long get(int l, int r, unsigned long long g[]){
    17. return g[r]-g[l-1]*p[r-l+1];
    18. }
    19. int ans[1000006]={0};
    20. int main()
    21. {
    22. ios::sync_with_stdio(0);cin.tie(0);
    23. cin>>s;s=" "+s;init();
    24. int q;cin>>q;
    25. for(int i=1;i<=n/2;i++){
    26. if(get(1,i,has)==get(n-i+1,n,has)) ans[i]=ans[i-1]+1;
    27. else ans[i]=ans[i-1];
    28. }
    29. for(int i=1;i<=q;i++){
    30. int pos;cin>>pos;
    31. if(pos<=n/2)cout<-1]<<'\n';
    32. else {
    33. pos=n-pos;cout<'\n';
    34. }
    35. }
    36. return 0;
    37. }

  • 相关阅读:
    【苹果iMessage家庭推送】软件安装群发推送通过HealthKit API访问NikeFuel
    爬虫获取静态网页数据
    sql操作
    【第56篇】GhostNet:廉价操作得到更多的特征
    布隆过滤器(Bloom Filter)初学习
    「MACOS限定」 如何将文件上传到GitHub仓库
    SmartX 超融合 5.1 版本有哪些新特性和技术提升?
    简单理解函数f(x;θ)中分号的含义
    Java基于B/S架构,包括PC后台管理端、APP移动端、可视化数据大屏的智慧工地源码
    leetcode - 学习计划之动态规划入门
  • 原文地址:https://blog.csdn.net/zy98zy998/article/details/127714653