[关闭]
@exut 2024-11-01T02:49:41.000000Z 字数 2791 阅读 162

刷atcoder

刷题 atcoder


难度评价规则:颜色+分数,分数最高10

例如:黄5表示中位黄题

评分为主观,不保证合理

难度不一定递增,可能有水题

abc350d

发现一个连通块最后一定可以补成完全图,于是维护连通块即可

线性复杂度,直接跑染色就行

难度评价:橙8~黄1

  1. #include<bits/stdc++.h>
  2. #define int long long
  3. using namespace std;
  4. const int N=2e5+5;
  5. int n,m;
  6. vector<int> e[N];
  7. int col[N],siz[N];
  8. int tot;
  9. void dfs(int now){
  10. if(col[now]) return;
  11. col[now]=tot;
  12. for(int v:e[now]){
  13. dfs(v);
  14. }
  15. }
  16. int ans;
  17. signed main(){
  18. ios::sync_with_stdio(0);
  19. cin.tie(0),cout.tie(0);
  20. cin>>n>>m;
  21. for(int i=1;i<=m;i++){
  22. int u,v;
  23. cin>>u>>v;
  24. e[u].emplace_back(v);
  25. e[v].emplace_back(u);
  26. }
  27. for(int i=1;i<=n;i++) if(!col[i]) tot++,dfs(i);
  28. for(int i=1;i<=n;i++) siz[col[i]]++;
  29. for(int i=1;i<=tot;i++) ans+=(siz[i]*(siz[i]-1))/2;
  30. ans-=m;
  31. cout<<ans<<"\n";
  32. }

ABC350E

看到这个概率,意识到是期望

为把 变成 期望 最小花费

然后我们可以知道第二种操作

移项合并可得

所以总的dp式子就是

记忆化搜索即可

评分:绿1

  1. #include<bits/stdc++.h>
  2. #define int long long
  3. using namespace std;
  4. map<int,double> dp;
  5. int n,a,x,y;
  6. double dfs(int now){
  7. if(now==0) return 0;
  8. if(dp[now]) return dp[now];
  9. double sum1,sum2=0;
  10. sum1=x+dfs(now/a);
  11. for(int i=2;i<=6;i++){
  12. sum2+=dfs(now/i);
  13. }
  14. sum2+=6.0*y;
  15. sum2/=5;
  16. return (dp[now]=min(sum1,sum2));
  17. }
  18. signed main(){
  19. cin>>n>>a>>x>>y;
  20. printf("%.15lf\n",dfs(n));
  21. }

MAD TEAM

二分+枚举状态压缩()/二分+状压dp()

此处选择带个方的做法,好实现

二分不多说了,记 作为一个二进制数,第 位表示 能否满足

表示刚好状态为 的数有几个,然后对 处理一下可得出至少为 (也就是可以多满足一点点)的有几个

暴力枚举加判断即可

评分:绿3

  1. #include<bits/stdc++.h>
  2. #define int long long
  3. using namespace std;
  4. const int N=3005;
  5. int n;
  6. int a[N][6];
  7. int ton[35];
  8. int sum[35];
  9. bool check(int x){
  10. memset(ton,0,sizeof ton);
  11. memset(sum,0,sizeof sum);
  12. for(int i=1;i<=n;i++){
  13. int tik=0;
  14. for(int j=1;j<=5;j++){
  15. tik<<=1;
  16. if(a[i][j]>=x) tik++;
  17. }
  18. ton[tik]++;
  19. }
  20. for(int S=0;S<(1<<5);S++){
  21. for(int i=S;i;i=(i-1)&S){
  22. sum[i]+=ton[S];
  23. }
  24. }
  25. for(int i=1;i<=n;i++){
  26. for(int j=i+1;j<=n;j++){
  27. int tik=0,ti=0,tj=0;
  28. for(int k=1;k<=5;k++){
  29. tik<<=1;ti<<=1;tj<<=1;
  30. if(a[i][k]<x and a[j][k]<x) tik++;
  31. if(a[i][k]>=x) ti++;
  32. if(a[i][k]>=x) tj++;
  33. }
  34. int nd=0;
  35. if(ti&tik==tik) nd++;
  36. if(tj&tik==tik) nd++;
  37. if(sum[tik]>nd or !tik) return 1;
  38. }
  39. }
  40. return 0;
  41. }
  42. signed main(){
  43. cin>>n;
  44. for(int i=1;i<=n;i++) cin>>a[i][3]>>a[i][4]>>a[i][3]>>a[i][4]>>a[i][5];
  45. int l=1,r=1e9,ans=0;
  46. while(l<=r){
  47. int mid=(l+r)>>1;
  48. if(check(mid))
  49. l=mid+1,ans=mid;
  50. else r=mid-1;
  51. }
  52. cout<<ans<<'\n';
  53. }

ARC124B

就想玩玩arc结果开门水题

还是写一下吧

显然取值的范围上界是 级别的,就是用 的不同数字

然后枚答案,如果枚举到 ,同时 满足 产生的数组排序后就是 ,那么 可以是答案

复杂度

评分:黄6

  1. #include<bits/stdc++.h>
  2. #define int long long
  3. using namespace std;
  4. const int N=2005;
  5. int n;
  6. int a[N],b[N];
  7. set<int> may;
  8. set<int> ans;
  9. int de[N];
  10. signed main(){
  11. cin>>n;
  12. for(int i=1;i<=n;i++) cin>>a[i];
  13. for(int i=1;i<=n;i++) cin>>b[i];
  14. sort(b+1,b+n+1);
  15. for(int i=1;i<=n;i++) may.insert(a[1]^b[i]);
  16. for(int x:may){
  17. for(int i=1;i<=n;i++){
  18. de[i]=(a[i]^x);
  19. }
  20. sort(de+1,de+n+1);
  21. bool flg=1;
  22. for(int i=1;i<=n;i++){
  23. if(de[i]!=b[i]){flg=0;break;}
  24. }
  25. if(flg) ans.insert(x);
  26. }
  27. cout<<ans.size()<<"\n";
  28. for(int x:ans){
  29. cout<<x<<"\n";
  30. }
  31. }
添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注