• 按权值建树,平面几何


    14天阅读挑战赛

     MEX vs MED 

    可以发现只有当序列中的中位数等于\frac{len-1}{2}时才会满足条件,也就是中位数之前的那些数也必须在序列中才可以,那我们就可以从0~n-1的顺序来枚举,用l和r来表示前i个数出现的范围,根据上面的那个公式其实也可以看出每个i可以满足的区间是2*(i+1)-1和2*(i+1),然后根据这个来看看有多少区间合法就可以,其实最后这一步很简单,但是我老是把控不好区间的边界,最后才想明白原来这么简单,,,

    1. #include
    2. #define int long long
    3. #define lowbit(x) ((x)&(-x))
    4. #define endl '\n'
    5. #define double long double
    6. using namespace std;
    7. const int mod=999911659;
    8. const int inf=1e9-1;
    9. const int N=1e6+7;
    10. int qpow(int a,int b)
    11. {
    12. int res=1;
    13. while(b)
    14. {
    15. if(b&1) res=res*a%mod;
    16. a=a*a%mod;
    17. b>>=1;
    18. }
    19. return res;
    20. }
    21. int getinv(int a){return qpow(a,mod-2);}
    22. int t,n,p[200005],pos[200005];
    23. int cal(int l,int r,int len)
    24. {
    25. int res=0;
    26. int ml=max(r-len+1,1LL),mr=min(n-len+1,l);
    27. if(mr>=ml) res=mr-ml+1;
    28. return res;
    29. }
    30. signed main()
    31. {
    32. cin.tie(0);cout.tie(0);ios::sync_with_stdio(0);
    33. //freopen("in.txt", "r", stdin);
    34. cin>>t;
    35. while(t--)
    36. {
    37. cin>>n;
    38. for(int i=1;i<=n;i++)
    39. {
    40. cin>>p[i];
    41. pos[p[i]]=i;
    42. }
    43. int ans=0,l=pos[0],r=pos[0];
    44. for(int i=0;i
    45. {
    46. l=min(pos[i],l);r=max(pos[i],r);
    47. int len1=2*(i+1)-1,len2=2*(i+1);
    48. int res=0;
    49. res+=cal(l,r,len1);
    50. res+=cal(l,r,len2);
    51. ans+=res;
    52. // cout<
    53. if(l==1&&r==n&&res>0) break;
    54. }
    55. cout<
    56. }
    57. return 0;
    58. }
    59. /*
    60. 5
    61. 0 4 3 2 1
    62. 2
    63. */

    Mex Tree 河南省赛 J 按权值建树

    按照普通的思路来之后发现子树的mex很难统计,然后就做不出来了,,,但是要是按权值建树之后,按0为根节点,就不会出现子树的mex等于根节点的情况了,所以这题就很好做了

    1. #include
    2. #define int long long
    3. #define lowbit(x) ((x)&(-x))
    4. #define endl '\n'
    5. #define double long double
    6. using namespace std;
    7. const int mod=999911659;
    8. const int inf=1e9-1;
    9. const int N=1e6+7;
    10. int qpow(int a,int b)
    11. {
    12. int res=1;
    13. while(b)
    14. {
    15. if(b&1) res=res*a%mod;
    16. a=a*a%mod;
    17. b>>=1;
    18. }
    19. return res;
    20. }
    21. int getinv(int a){return qpow(a,mod-2);}
    22. int head[2000006],cnt;
    23. struct Edge
    24. {
    25. int to,next;
    26. }e[2000006];
    27. void addedge(int from,int to)
    28. {
    29. e[++cnt].to=to;
    30. e[cnt].next=head[from];
    31. head[from]=cnt;
    32. }
    33. int n,a[1000006],siz[1000006],ans[1000006];
    34. int dfs(int u,int fa)
    35. {
    36. siz[u]=1;
    37. int minn=u,maxx=0;
    38. for(int i=head[u];i;i=e[i].next)
    39. {
    40. int j=e[i].to;
    41. if(j==fa) continue;
    42. int tmp=dfs(j,u);
    43. minn=min(minn,tmp);
    44. maxx=max(maxx,siz[j]);
    45. siz[u]+=siz[j];
    46. }
    47. if(u>minn) ans[u]=0;
    48. else ans[u]=n-siz[u];
    49. if(u==0) ans[u]=max(ans[u],maxx);
    50. return minn;
    51. }
    52. signed main()
    53. {
    54. cin.tie(0);cout.tie(0);ios::sync_with_stdio(0);
    55. //freopen("in.txt", "r", stdin);
    56. cin>>n;
    57. for(int i=1;i<=n;i++) cin>>a[i];
    58. for(int i=0;i<=n;i++) ans[i]=0;
    59. for(int i=2;i<=n;i++)
    60. {
    61. int u;cin>>u;
    62. addedge(a[u],a[i]);
    63. addedge(a[i],a[u]);
    64. }
    65. dfs(0,-1);
    66. ans[n]=n;
    67. for(int i=0;i<=n;i++) cout<" ";
    68. cout<
    69. return 0;
    70. }
    71. /*
    72. 5
    73. 0 4 3 2 1
    74. 2
    75. */

    Keiichi Tsuchiya the Drift King 焦作 D 

    一般的情况就是w=\sqrt{(r+a)^2+b}-r

    但是如果d很小的话,那么车尾还是在平路上,那就要求出他在弯路上的长度,车的实际的角度是arctan(\frac{b}{a+r}),然后用这个度数du减去d后这个角度所对应的边就是那个答案的边,再用w*cos(du)就得到答案了

    1. #include
    2. using namespace std;
    3. #define int long long
    4. const int N = 1e5+100;
    5. const double eps=1e-8;
    6. const double pi=acos(-1);
    7. double a,b,r,d;
    8. signed main()
    9. {
    10. // ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);
    11. int t;
    12. cin>>t;
    13. while(t--)
    14. {
    15. cin>>a>>b>>r>>d;
    16. d=d/180*pi;
    17. double du=atan(b/(a+r));
    18. double ans=sqrt((r+a)*(r+a)+b*b);
    19. if(d
    20. {
    21. du=du-d;
    22. ans=ans*cos(du);
    23. }
    24. ans-=r;
    25. cout<setprecision(10)<
    26. }
    27. return 0;
    28. }
    29. //

    P2518 [HAOI2010]计数 - 全排列

    不会有前导0其实也就是把0放前面,0012和12是同样大小的,这样就转化成了求n个数的排列数,这些排列都符合小于给出的那个数,回想一下康托展开求一个排列是第几个排列的时候,比如4231,第一个数可以选1,2,3有三种选择,后面的位可以随便选,那就是3*3!,第二位选的话有1种选择,后面的位可以随便选就是2!,这样依次推下去,但这个题是数可以重复的,那样的话也是可以用组合数来算的,比如后面还有m个空,从0开始,tx[0]表示0的个数,那么放0的话就有c[m][tx[0]]种,之后还剩下m-tx[0]个空,那么放1的话就有c[m-tx[0]][tx[1]]种,这样依次推下去也会得到全排列

    题解 P2518 【[HAOI2010]计数】 - C3H5ClO的博客 - 洛谷博客

    题解 P2518 【[HAOI2010]计数】 - 巨型方块 的博客 - 洛谷博客

    1. #include
    2. using namespace std;
    3. #define int long long
    4. const int N = 1e5+100;
    5. const double eps=1e-8;
    6. const double pi=acos(-1);
    7. int tx[11],c[55][55];
    8. char n[55];
    9. int cal(int l)
    10. {
    11. int res=1;
    12. for(int i=0;i<=9;i++)
    13. {
    14. res*=c[l][tx[i]];
    15. l-=tx[i];
    16. }
    17. return res;
    18. }
    19. signed main()
    20. {
    21. // ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);
    22. cin>>n+1;
    23. c[0][0]=1;
    24. for(int i=1;i<=50;i++)
    25. {
    26. c[i][0]=c[i][i]=1;
    27. for(int j=1;j-1][j]+c[i-1][j-1];
    28. }
    29. int nn=strlen(n+1),ans=0;
    30. for(int i=1;i<=nn;i++) tx[n[i]-'0']++;
    31. for(int i=1;i<=nn;i++)
    32. {
    33. int x=n[i]-'0';
    34. for(int j=0;j
    35. {
    36. if(tx[j])
    37. {
    38. tx[j]--;
    39. ans+=cal(nn-i);
    40. tx[j]++;
    41. }
    42. }
    43. tx[x]--;
    44. }
    45. cout<
    46. return 0;
    47. }
    48. //

  • 相关阅读:
    解决vscode保存时,代码自动格式化问题
    数据结构开门篇
    Vue 中使用事件总线来进行组件间通信($emit()、$on() 和 $off())
    【会议征稿通知】第二届数字化经济与管理科学国际学术会议(CDEMS 2024)
    使用supervisor管理你的进程
    spring bean生命周期三---Spring Bean populateBean阶段
    数据校验(初级篇)
    ZEMAX | 在OpticStudio中通过几何光线追迹来模拟杨氏双缝干涉实验
    前端学习 node 快速入门 系列 —— 事件循环
    提升品牌形象:利用OLED透明拼接屏进行品牌展示
  • 原文地址:https://blog.csdn.net/weixin_52621204/article/details/127411329