[关闭]
@exut 2024-10-15T01:29:18.000000Z 字数 1682 阅读 172

noip真题选做

刷题


P9118 [春季测试 2023] 幂次

  1. 特判掉。

  2. 注意到 的时候只需要枚举到 ,这是完全承担的起的。

然后你就有 分了

单独考虑平方,答案先加上 ,如果一个数在 做法里有贡献的数是完全平方数就减去他的贡献,注意 的判断。

然后搞定了xd

这道题精度很坑,注意点。

  1. #include<bits/stdc++.h>
  2. using namespace std;
  3. #define int long long
  4. int n,k;
  5. int ans;
  6. map<int,bool> _is;
  7. int __;
  8. signed main(){
  9. cin>>n>>k;
  10. if(k==1){
  11. cout<<n;
  12. return 0;
  13. }
  14. else if(k>=2){
  15. ans=1;
  16. for(int i=2;i*i*i<=n;i++){
  17. for(int j=i*i,op=2;;){
  18. if(j>n/i) break;
  19. j*=i,op++;
  20. if(j>n) break;
  21. if(op<k)continue;
  22. if(_is[j])continue;
  23. _is[j]=1;
  24. ans++;
  25. if((int)sqrtl(j)*(int)sqrtl(j)==j) __--;
  26. }
  27. }
  28. if(k>=3) cout<<ans;
  29. else cout<<(int)(sqrtl(n))+ans+__-1;
  30. }
  31. }

P9869 [NOIP2023] 三值逻辑

记一个初始值和一个真实值,然后并查集一下。

  1. #include<bits/stdc++.h>
  2. using namespace std;
  3. // #define int long long
  4. int c,t,n,m;
  5. int fa[200005],fir[200005],val[200005];
  6. int find(int x){
  7. return (fa[x]==x?x:fa[x]=find(fa[x]));
  8. }
  9. int siz[200005];
  10. void merge(int x,int y){
  11. x=find(x),y=find(y);
  12. if(x==y) return;
  13. fa[x]=y;
  14. }
  15. signed main(){
  16. cin>>c>>t;
  17. while(t--){
  18. cin>>n>>m;
  19. for(int i=1;i<=n*2;i++) fir[i]=i,fa[i]=i,siz[i]=(i<=n),val[i]=INT_MAX;
  20. while(m--){
  21. char opt;
  22. cin>>opt;
  23. if(opt=='+'){
  24. int a,b;
  25. cin>>a>>b;
  26. if(val[b]!=INT_MAX)
  27. {
  28. fir[a]=a;
  29. val[a]=val[b];
  30. }
  31. else{
  32. fir[a]=fir[b];
  33. val[a]=INT_MAX;
  34. }
  35. }
  36. else if(opt=='-'){
  37. int a,b;
  38. cin>>a>>b;
  39. if(val[b]!=INT_MAX)
  40. {
  41. fir[a]=a;
  42. val[a]=-val[b];
  43. }
  44. else{
  45. fir[a]=-fir[b];
  46. val[a]=INT_MAX;
  47. }
  48. }
  49. else if(opt=='T'){
  50. int x;cin>>x;
  51. fir[x]=x;
  52. val[x]=1;
  53. }
  54. else if(opt=='F'){
  55. int x;cin>>x;
  56. fir[x]=x;
  57. val[x]=-1;
  58. }
  59. else{
  60. int x;cin>>x;
  61. fir[x]=x;
  62. val[x]=0;
  63. }
  64. }
  65. for(int i=n+1;i<=2*n;i++)
  66. {
  67. if(val[i-n]!=INT_MAX)
  68. val[i]=-val[i-n];
  69. }
  70. for(int i=1;i<=n;i++)
  71. {
  72. if(fir[i]<0)
  73. merge(i,-fir[i]+n),merge(i+n,-fir[i]);
  74. else
  75. merge(i,fir[i]),merge(i+n,n+fir[i]);
  76. }
  77. for(int i=1;i<=n;i++)
  78. {
  79. if(find(i)==find(n+i))
  80. val[find(i)]=0;
  81. }
  82. int ans=0;
  83. for(int i=1;i<=n;i++){
  84. if(val[find(i)]==0) ans++;
  85. }
  86. cout<<ans<<"\n";
  87. for(int i=1;i<=n*2+3;i++) fa[i]=i;
  88. }
  89. }
添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注