• 好题分享


    1.Problem - G - Codeforces

            (1)题意

            (2)思路

                    因为最多13次,那么不如我们就问13次,然后考虑把每一个位置重新按二进制拆分成一个下标,因为C(13,6) > 1000,因此在数量上是满足得,我们考虑询问每一次在第i位上为1全部放入询问,那么最终得到得答案就是在第i位上不为1得集合得或,最后我们对于每一个位置按重新拆分得下标得0得位置全部或起来就是这个位置去除后的答案。

                    比如说我们得第j个位置拆分成得新二进制位置为0000111111000,那么在第[5,10]位我们不计算贡献,那么会漏掉一些集合嘛?答案是不会得,因为第除了这个位置本身外,其他位置会在总会在他的某一个为0得位置被计算贡献,因此是不会漏掉得。

            (3)代码实现

    1. #include
    2. #define rep(i,z,n) for(int i = z;i <= n; i++)
    3. #define per(i,n,z) for(int i = n;i >= z; i--)
    4. #define PII pair
    5. #define fi first
    6. #define se second
    7. #define vi vector
    8. #define vl vector
    9. #define pb push_back
    10. #define sz(x) (int)x.size()
    11. #define all(x) (x).begin(),(x).end()
    12. using namespace std;
    13. using ll = long long;
    14. const int N = 2e5 + 10;
    15. ll w[N];
    16. void solve()
    17. {
    18. int n;
    19. cin >> n;
    20. vector<int> v;
    21. rep(i,0,(1<<13)-1) {
    22. if(__builtin_popcount(i) == 6) v.pb(i);
    23. if(sz(v)>=n) break;
    24. }
    25. rep(i,0,12) {
    26. vector<int> z;
    27. rep(j,0,n - 1) {
    28. if(v[j] >> i & 1) z.pb(j + 1);
    29. }
    30. if(!sz(z)) continue;
    31. cout << "? " << sz(z);
    32. for(auto x : z) cout << ' ' << x;
    33. cout << endl;
    34. cin >> w[i];
    35. }
    36. cout << "! ";
    37. rep(i,1,n) {
    38. ll Ans = 0;
    39. rep(j,0,12) {
    40. if(!(v[i - 1] >> j & 1)) Ans |= w[j];
    41. }
    42. cout << Ans << ' ';
    43. }
    44. cout << endl;
    45. }
    46. int main()
    47. {
    48. ios::sync_with_stdio(false);
    49. cin.tie(0),cout.tie(0);
    50. int T = 1;
    51. // cin >> T;
    52. while(T --) solve();
    53. return 0;
    54. }

    2.Problem - E - Codeforces

            (1)题意

                    给你一个有向图n个点m条边,每条边的权值为1-m,且一定不重复,每个点的出度最多为k,问你有多少个k元组[c1-ck],使得出度为i的点会选择价值低ci小的边走,并且每一个点最后都回到自己。

            (2)思路

                    根据每一个点最后都会回到自己,可以推断出这个图最后一定是一个有环图,并且每一个点都属于一个环内,我们考虑枚举Ci的排列,考虑如何快速check,考虑到最后的答案一定会是一个1-n的排列,我们考虑预处理出每一个ci为多少的时候的点集为多少,那么check的时候会是一个bitset/w的复杂度,也接受不了,考虑把点集hash掉,那么check的时候验证是否是全集将会是O(1)的,即可完成。

            (3)代码

    1. #include
    2. #define rep(i,z,n) for(int i = z;i <= n; i++)
    3. #define per(i,n,z) for(int i = n;i >= z; i--)
    4. #define PII pair
    5. #define fi first
    6. #define se second
    7. #define vi vector
    8. #define vl vector
    9. #define pb push_back
    10. #define sz(x) (int)x.size()
    11. #define all(x) (x).begin(),(x).end()
    12. using namespace std;
    13. using ll = long long;
    14. const int N = 2e5 + 10;
    15. vectorint,int>> g[N];
    16. using ull = unsigned long long;
    17. ull hsv[N],pr[N],bse = 13331;
    18. ull s[10][10],lst = 0;
    19. int n,m,k;
    20. int Ans = 0;
    21. inline void dfs(int f,ull hv)
    22. {
    23. if(f == 0) {
    24. if(hv == lst) Ans ++;
    25. return;
    26. }
    27. rep(i,1,f) {
    28. dfs(f - 1,hv + s[f][i]);
    29. }
    30. }
    31. void solve()
    32. {
    33. cin >> n >> m >> k;
    34. ull pw = 1;
    35. rep(i,1,n) {
    36. pr[i] = pw * (rand() * 1000);
    37. pw *= bse;
    38. }
    39. rep(i,1,m) {
    40. int u,v,w;
    41. cin >> u >> v >> w;
    42. g[u].pb({w,v});
    43. }
    44. rep(i,1,n) {
    45. sort(all(g[i]));
    46. rep(j,1,sz(g[i])) {
    47. s[sz(g[i])][j] += pr[g[i][j - 1].se];
    48. }
    49. }
    50. rep(i,1,n) lst += pr[i];
    51. dfs(k,0);
    52. cout << Ans;
    53. }
    54. int main()
    55. {
    56. ios::sync_with_stdio(false);
    57. cin.tie(0),cout.tie(0);
    58. int T = 1;
    59. // cin >> T;
    60. while(T --) solve();
    61. return 0;
    62. }

  • 相关阅读:
    推送多架构镜像到同一仓库
    重构本地聊天程序
    django请求生命周期流程图 路由匹配 无名分组 有名分组 反向解析 无名有名反向解析 路由分发 名称空间
    基于javaweb的农业信息管理系统(java+ssm+jsp+js+html+mysql)
    输电线路的继电保护整定计算及装置
    python模型训练
    核心实验16_端口镜像_ENSP
    Kafka的存储机制和可靠性
    探索神经网络架构教程视频,设计神经网络的步骤
    玩转亚马逊 AWS IoT(3): SpringBoot 2.7 集成 AWS IoT 服务
  • 原文地址:https://blog.csdn.net/scanner___yw/article/details/133468086