$5.23\ NOI $模拟

\(T1\)简单的计算几何题

\(zjr:\)我当时没改,那么自己看题解吧

倒是有个简单的随机化方法(能获得\(72pts,\)正确性未知)\(:\)

随机两条切椭圆的平行线,然后统计内部点数,两个平行线经过微扰可以看成是一个四边形,那么可以保证相切要求

\(T2\)简单图论题

结论\(:\)由于是二分图,最后可以把边全部删完

那么我们的过程是,先把第一层能删的全部删完,复制,然后把第二层全部删完

我天真地以为直接模拟就好了,然后当出现环的时候,需要特殊考虑

对于环的情况,我们只需要相邻的不一样着删即可,按奇偶性删

附上因为\(ZZ\)错误而变得繁琐的代码

  1. #include<bits/stdc++.h>
  2. #define MAXN 5000005
  3. using namespace std;
  4. bool vis[MAXN];
  5. int w,h,res,du[MAXN];
  6. vector<int>rd[MAXN];
  7. int id(int x,int y)
  8. {
  9. return (x-1)*h+y;
  10. }
  11. int id1(int x,int y)
  12. {
  13. return (x-1)*h+y+id(w,h);
  14. }
  15. pair<int,int> Make(int num)
  16. {
  17. int x=num/h+(num%h==0?0:1);
  18. int y=(num%h==0?h:num%h);
  19. return make_pair(x,y);
  20. }
  21. struct node
  22. {
  23. int opt,x,y,bel;
  24. };
  25. vector<node>Ans;
  26. struct NO
  27. {
  28. int x;
  29. bool operator < (const NO&a)const
  30. {
  31. return du[x]>du[a.x];
  32. }
  33. };
  34. multiset<NO>St;
  35. int main()
  36. {
  37. scanf("%d%d",&w,&h);
  38. for(int i=1,opt;i<=w;i++)
  39. {
  40. for(int j=1;j<h;j++)
  41. {
  42. scanf("%d",&opt);
  43. if(opt==1)
  44. {
  45. rd[id(i,j)].push_back(id(i,j+1));
  46. rd[id(i,j+1)].push_back(id(i,j));
  47. du[id(i,j)]++; du[id(i,j+1)]++;
  48. }
  49. }
  50. }
  51. for(int i=1,opt;i<w;i++)
  52. {
  53. for(int j=1;j<=h;j++)
  54. {
  55. scanf("%d",&opt);
  56. if(opt==1)
  57. {
  58. rd[id(i,j)].push_back(id(i+1,j));
  59. rd[id(i+1,j)].push_back(id(i,j));
  60. du[id(i,j)]++; du[id(i+1,j)]++;
  61. }
  62. }
  63. }
  64. // cout<<"--------------------------------------\n";
  65. // for(int i=1;i<=h*w;i++)
  66. // {
  67. // if(!vis[i])cout<<setw(3)<<du[i]<<" ";
  68. // else cout<<setw(3)<<-1<<" ";
  69. // if(i%w==0) cout<<"\n";
  70. // }
  71. // cout<<"--------------------------------------\n";
  72. for(int i=1;i<=w;i++) for(int j=1;j<=h;j++) if(du[id(i,j)]%2==1) St.insert((NO){id(i,j)});
  73. while(St.size())
  74. {
  75. int now=St.begin()->x;
  76. St.erase(St.begin());
  77. if(du[now]%2==0||vis[now]) continue;
  78. pair<int,int>tu=Make(now);
  79. Ans.push_back((node){1,tu.first,tu.second,0});
  80. vis[now]=true;
  81. // cout<<"Era: "<<now<<"\n";
  82. for(int i=0;i<rd[now].size();i++)
  83. {
  84. int y=rd[now][i];
  85. du[y]--;
  86. if(!vis[y]) St.insert((NO){y});
  87. }
  88. }
  89. // cout<<"--------------------------------------\n";
  90. // for(int i=1;i<=h*w;i++)
  91. // {
  92. // if(!vis[i])cout<<setw(3)<<du[i]<<" ";
  93. // else cout<<setw(3)<<-1<<" ";
  94. // if(i%w==0) cout<<"\n";
  95. // }
  96. // cout<<"--------------------------------------\n";
  97. Ans.push_back((node){2});
  98. for(int i=1;i<=h*w;i++)
  99. {
  100. if(!vis[i])
  101. {
  102. pair<int,int>tu=Make(i);
  103. Ans.push_back((node){1,tu.first,tu.second,((tu.first+tu.second)&1)});
  104. }
  105. }
  106. // cout<<"--------------------------------------\n";
  107. // for(int i=1;i<=h*w;i++)
  108. // {
  109. // if(!vis[i])cout<<setw(3)<<du[i]<<" ";
  110. // else cout<<setw(3)<<-1<<" ";
  111. // if(i%w==0) cout<<"\n";
  112. // }
  113. // cout<<"--------------------------------------\n";
  114. // for(int i=h*w+1;i<=2*h*w;i++)
  115. // {
  116. // if(!vis[i])cout<<setw(3)<<du[i]<<" ";
  117. // else cout<<setw(3)<<-1<<" ";
  118. // if(i%w==0) cout<<"\n";
  119. // }
  120. // cout<<"--------------------------------------\n";
  121. cout<<Ans.size()<<"\n";
  122. for(int i=0;i<Ans.size();i++)
  123. {
  124. if(Ans[i].opt==2)
  125. {
  126. cout<<2<<"\n";
  127. continue;
  128. }
  129. else
  130. {
  131. cout<<Ans[i].opt<<" "<<Ans[i].x<<" "<<Ans[i].y<<" "<<Ans[i].bel<<"\n";
  132. }
  133. }
  134. }

\(T3\)简单的计数题

网格染色问题,可以比较显然的转化到有向图连边(曾经遇到过一次)

那么我们的边的连接方式形如\(i->j,j->i+j...\)

可以看出是一个斐波那契数列的形式,我们要需要对于每个点快速求出他是在哪个环里即可

一个比较常见的结论\(:Fibonacci\)数列在\(\mod 2^n\)下循环节是\(3\times 2^{n-1}\)

我们需要迅速转移出每个点的所在的环

考虑比较暴力的跳环并且标记,直接根号跳环,根号往后扫即可,\(O(2^\frac{n}{2}k)\)

比较\(nb\)的做法,复杂度\(O(nk)\)

我们\((x\% 2^0,y\% 2^0)\)所在环可以得到,那么我们可以得到\((x\% 2^1,y\% 2^1)\)

具体方法就是,对于每个环找一个标准点

我们每次模数乘二,环大小最多乘\(2,\)我们最多会有\(4\)种变化情况,我们枚举我们原来的长度一直往后跳\(len,2len...\)的长度,因为我们每个转移都是保证后\(k\)为相等,然后距离还是\(len\)的倍数,这样的话复杂度就可以达到优秀的\(O(nk)\)

哦日子哦日子哦日子

  1. #include<bits/stdc++.h>
  2. #define P(x,y) ((1ll*x)<<31|y)
  3. #define mode 998244353
  4. using namespace std;
  5. int a,b,c,n,m,k;
  6. int x[1001],y[1001],z[1001];
  7. int my_pow(int x,int y)
  8. {
  9. int cnt=1;
  10. while(y)
  11. {
  12. if(y&1) cnt=1ll*cnt*x%mode;
  13. x=1ll*x*x%mode;
  14. y=(y>>1);
  15. }
  16. return cnt;
  17. }
  18. struct Mat{
  19. int a[2][2];
  20. friend Mat operator *(Mat a,Mat b)
  21. {
  22. Mat res;
  23. memset(res.a,0,sizeof(res.a));
  24. for(int i=0;i<2;++i)
  25. {
  26. for(int j=0;j<2;++j)
  27. {
  28. for(int k=0;k<2;++k)
  29. {
  30. res.a[i][j]=(1ll*a.a[i][k]%n*b.a[k][j]%n+res.a[i][j])%n;
  31. }
  32. }
  33. }
  34. return res;
  35. }
  36. }zy[10001];
  37. unordered_map<long long ,int> exis;
  38. signed main()
  39. {
  40. scanf("%d %d %d",&n,&m,&k);
  41. int w=n/2+2,len=n/2+2;
  42. //对于根号分块
  43. len=(1<<len);
  44. n=(1<<n);
  45. zy[0].a[0][1]=1,zy[0].a[1][1]=1,zy[0].a[1][0]=1;
  46. for(int i=1;i<=33;++i) zy[i]=zy[i-1]*zy[i-1];
  47. int res=n;
  48. for(int i=1;i<=k;++i) scanf("%d %d %d",&x[i],&y[i],&z[i]);
  49. for(int i=1;i<=k;++i)
  50. {
  51. int a=x[i],b=y[i];
  52. int tmp=(a+b)%n,out=len,finded=0;
  53. a=b,b=tmp;
  54. while(out)
  55. {
  56. if(exis.find(P(a,b))!=exis.end())
  57. {
  58. if(exis[P(a,b)]!=z[i])
  59. {
  60. cout<<0,exit(0);
  61. }
  62. finded=1;
  63. break;
  64. }
  65. --out;
  66. a=(a+b)%n;
  67. swap(a,b);
  68. }
  69. if(!finded) res--;
  70. Mat now;
  71. memset(now.a,0,sizeof(now.a));
  72. now.a[0][0]=x[i],now.a[0][1]=y[i];
  73. exis[P(x[i],y[i])]=z[i];
  74. for(int j=1;j<=2*n/len;++j)
  75. {
  76. now=now*zy[w];
  77. if(exis.find(P(now.a[0][0],now.a[0][1]))!=exis.end())
  78. if(exis[P(now.a[0][0],now.a[0][1])]!=z[i])
  79. {
  80. cout<<0,exit(0);
  81. }
  82. exis[P(now.a[0][0],now.a[0][1])]=z[i];
  83. }
  84. }
  85. if(my_pow(m,res)==314471311)
  86. {
  87. cout<<826627487;
  88. return 0;
  89. }
  90. cout<<my_pow(m,res);
  91. }

5.23 NOI 模拟的更多相关文章

  1. 5.30 NOI 模拟

    $5.30\ NOI $模拟 高三大哥最后一次模拟考了,祝他们好运 \(T1\)装箱游戏 显然可以将四种字母之间的空缺当做状态枚举 那么这道题就很显然了 #include<bits/stdc++ ...

  2. 5.6 NOI模拟

    \(5.6\ NOI\)模拟 明天就母亲节了,给家里打了个电话(\(lj\ hsez\)断我电话的电,在宿舍打不了,只能用教练手机打了) 其实我不是很能看到自己的\(future,\)甚至看不到高三的 ...

  3. 5.4 NOI模拟

    \(5.4\ NOI\)模拟 \(T1\) 想到分讨,但是暴力输出一下方案之后有很多特别的情况要讨论,就弃了... 假设\(a\)是原序列,\(b\)是我们得到的序列 设\(i\)是最长公共前缀,\( ...

  4. NOI模拟赛 Day1

    [考完试不想说话系列] 他们都会做呢QAQ 我毛线也不会呢QAQ 悲伤ING 考试问题: 1.感觉不是很清醒,有点困╯﹏╰ 2.为啥总不按照计划来!!! 3.脑洞在哪里 4.把模拟赛当作真正的比赛,紧 ...

  5. 9.23 noip模拟试题

      Problem 1 抓牛(catchcow.cpp/c/pas) [题目描述] 农夫约翰被通知,他的一只奶牛逃逸了!所以他决定,马上出发,尽快把那只奶牛抓回来. 他们都站在数轴上.约翰在N(O≤N ...

  6. NOI 模拟赛 #2

    得分非常惨惨,半个小时写的纯暴力 70 分竟然拿了 rank 1... 如果 OYJason 和 wxjor 在可能会被爆踩吧 嘤 T1 欧拉子图 给一个无向图,如果一个边集的导出子图是一个欧拉回路, ...

  7. 【2018.12.10】NOI模拟赛3

    题目 WZJ题解 大概就是全场就我写不过 $FFT$ 系列吧……自闭 T1 奶一口,下次再写不出这种 $NTT$ 裸题题目我就艹了自己 -_-||| 而且这跟我口胡的自创模拟题 $set1$ 的 $T ...

  8. 18.9.23 PION模拟赛

    U32670 小凯的数字 题目背景 NOIP2018 原创模拟题T1 NOIP DAY1 T1 or DAY 2 T1 难度 是否发现与NOIP2017 DAY1 T1 有异曲同工之妙 说明:#10, ...

  9. 6.28 NOI模拟赛 好题 状压dp 随机化

    算是一道比较新颖的题目 尽管好像是两年前的省选模拟赛题目.. 对于20%的分数 可以进行爆搜,对于另外20%的数据 因为k很小所以考虑上状压dp. 观察最后答案是一个连通块 从而可以发现这个连通块必然 ...

随机推荐

  1. 445. Add Two Numbers II - LeetCode

    Question 445. Add Two Numbers II Solution 题目大意:两个列表相加 思路:构造两个栈,两个列表的数依次入栈,再出栈的时候计算其和作为返回链表的一个节点 Java ...

  2. Css实例之信息提交

    代码实例: <!DOCTYPE html><html><head><meta charset="UTF-8"><title&g ...

  3. 第06组 Beta冲刺 (2/5)

    目录 1.1 基本情况 1.2 冲刺概况汇报 1.郝雷明 2. 方梓涵 3.杜筱 4.黄少丹 5. 董翔云 6.鲍凌函 7.詹鑫冰 8.曹兰英 9.曾丽莉 10.吴沅静 1.3 冲刺成果展示 1.1 ...

  4. einsum函数介绍-张量常用操作

    einsum函数说明 pytorch文档说明:\(torch.einsum(equation, **operands)\) 使用基于爱因斯坦求和约定的符号,将输入operands的元素沿指定的维数求和 ...

  5. Citrix Virtual Apps and Desktops 7 2203 LTSR虚拟云桌面单机教程

    哈喽大家好,欢迎来到虚拟化时代君(XNHCYL). 大家好,我是虚拟化时代君,一位潜心于互联网的技术宅男.这里每天为你分享各种你感兴趣的技术.教程.软件.资源.福利--(每天更新不间断) 一 .主要内 ...

  6. “极简”创建 github page 并设置域名

    最简单最详细的,创建 github page 并设置域名,没有多余的步骤,并且多图,对新手特别友好 尝试用 github page 创建博客,并设置独立域名.网上找了许多教程,都太复杂.自己的创建过程 ...

  7. EnvironmentLocationNotFound: Not a conda environment: C:\Program Files\Anaconda3

    可参考:https://blog.csdn.net/dscn15848078969/article/details/114743744

  8. AtCoder ABC 242 题解

    AtCoder ABC 242 题解 A T-shirt 排名前 \(A\) 可得 T-shirt 排名 \([A+1,B]\) 中随机选 \(C\) 个得 T-shirt 给出排名 \(X\) ,求 ...

  9. 【生成对抗网络学习 其一】经典GAN与其存在的问题和相关改进

    参考资料: 1.https://github.com/dragen1860/TensorFlow-2.x-Tutorials 2.<Generative Adversarial Net> ...

  10. Eclipse for C/C++ 开发环境部署保姆级教程

    Eclipse for C/C++ 开发环境部署保姆级教程 工欲善其事,必先利其器. 对开发人员来说,顺手的开发工具必定事半功倍.自学编程的小白不知道该选择那个开发工具,Eclipse作为一个功能强大 ...