首页 > 其他分享 >AtCoder 题目集2

AtCoder 题目集2

时间:2023-08-20 16:37:07浏览次数:32  
标签:AtCoder 题目 val ... int ans dis fo

AtCoder 题目集2

终于迈入了一个新的阶段,接下来希望质量能高一点吧。

现在我主要刷的是1600左右的题,毕竟实力太拉,只能按照 ”分上200“ 的策略。

(我觉得类型标个 “思维” 貌似没啥意义,毕竟AT几乎全是思维啊...)

编号(NO.) 题目 难度 类型
1 ABC201E 1694,medium 思维,XOR
2 ABC243E 1637,medium 最短路
3 ABC083D 1646,hard- 思维
4 ABC092D 1445,hard- 构造
5 ABC081D 1567,hard- 前缀和
6 ABC185E 1468,medium DP
7 ARC102D 1810,easy 构造
8 AGC016B 1626,easy 分类讨论,思维
9
10

NO.1 ABC201E

有关 \(XOR\) 的题目很多都考察了按位解决的思想...确实,很常见的一种解决办法。

所以对于这道题,只要能发现按位解决就OK了。

最后复杂度(我写的) 是 \(O(60n)\) 左右...但是慢的一比...不知道为啥...

const int N=200010,mod=1e9+7;

int n,cnt,head[N];
struct Edge{
  int to,nxt; ll val;
}edge[N<<1];
void Add(int fo,int to,ll val){
  edge[++cnt]={to,head[fo],val};
  head[fo]=cnt;
}

ll f[N][60],ans,sz[N];

void dfs(int pos,int fa,ll dis){
  sz[pos]=1;
  for(int i=0;i<60;++i) f[pos][i]=!!(dis&(1ll<<i));
  for(int i=head[pos];i;i=edge[i].nxt){
    int &to=edge[i].to;
    if(to^fa){
      dfs(to,pos,dis^edge[i].val);
      for(int i=0;i<60;++i)
        f[pos][i]+=f[to][i];
      sz[pos]+=sz[to];
    }
  }
}

void solve(int pos,int fa,int wei,bool tag){
  if(tag) ans=(ans+(sz[1]-f[1][wei])*((1ll<<wei)%mod)%mod)%mod;
  else ans=(ans+f[1][wei]*((1ll<<wei)%mod)%mod)%mod;
  for(int i=head[pos];i;i=edge[i].nxt){
    int &to=edge[i].to;
    if(to^fa){
      if(edge[i].val&(1ll<<wei))
        solve(to,pos,wei,tag^1);
      else solve(to,pos,wei,tag);
    }
  }
}

void check(int wei){
  solve(1,1,wei,0);
}

signed main(){
  // freopen("gen.txt","r",stdin);
  // freopen("");
  IOS
  //int T;

  cin>>n;
  for(int i=1;i<n;++i){
    int fo,to; ll val;
    cin>>fo>>to>>val;
    Add(fo,to,val);
    Add(to,fo,val);
  }

  dfs(1,1,0);
  for(int i=0;i<60;++i)
    check(i);
  cout<<ans*q_Pow(2,mod-2,mod)%mod<<'\n';
  
  return 0;
}

NO.2 ABC243E

看到 \(n\leqslant 300\) 就知道先来个 \(Floyd\) 。然后对于一条边,如果可以丢掉它,那当且仅当我们任何一条最短路都不会经过它,更进一步地说,就是存在另一条路,使得路径长度不长与这条边。思路就是这样。开始我想了求最短路的时候维护一下每条边是否会使用,但是没法排除等长的情况,会少统计...

const int N=305;

int n,m;
ll dis[N][N];
struct Edge{int fo,to,val;}edge[N*N];

signed main(){
  // freopen("gen.txt","r",stdin);
  // freopen("a.txt","w",stdout);
  IOS
  //int T;
  cin>>n>>m; memset(dis,0x3f3f,sizeof(dis));
  for(int i=1,fo,to,val;i<=m;++i){
    cin>>fo>>to>>val;
    edge[i]={fo,to,val};
    dis[fo][to]=dis[to][fo]=val;
  }

  F(1,i,1,n) F(1,j,1,n) F(1,k,1,n)
    dis[j][k]=Min(dis[j][k],dis[j][i]+dis[i][k]);

  int ans=0;
  F(1,i,1,m){
    int fo=edge[i].fo,to=edge[i].to,val=edge[i].val;
    for(int j=1;j<=n;++j)
      if(j!=fo&&j!=to&&dis[fo][to]>=dis[fo][j]+dis[j][to]){
        ++ans;
        break;
      }
  }
  cout<<ans<<'\n';

  return 0;
}

NO.3 ABC083D

这题真的很烧我的脑(

标签:AtCoder,题目,val,...,int,ans,dis,fo
From: https://www.cnblogs.com/mfc007/p/17643600.html

相关文章

  • Atcoder Beginner Contest 315 解题报告
    AtcoderBeginnerContest315ContestlinkHintsD尝试优化暴力。A-tcdr没啥好说的,模拟。代码实现voidSolve(){ while(charch=getchar()) { if(!isalpha(ch))return; if(ch!='a'&&ch!='e'&&ch!='i'&&ch!='o......
  • AtCoder Beginner Contest 315
    A模拟,代码。B模拟,代码。C我们发现美味度最高的食物必选,排序后枚举即可。代码。D模拟。代码。EDFS。代码。F我们发现\(2^C\)增长很快,因此不选的数量最多只有\(\log\)次,直接DP即可。代码。G我们枚举\(i\),那么也就是求出\(Bj+Ck=X-Ai(1\lej\leN,1\lek\l......
  • AtCoder 题目集1
    AtCoder题目集1这是一个AT个人刷题总结的开始,感觉确实应该做一做这种总结,如果只是不断的刷题,感觉貌似也没有什么意思,还不如时常适当的回望一下过去的好题。希望能一直做下去吧。update(22.12.14):AT赛后总结归为另外一栏,此处为过去AT题目的记录。总结了一些比较有趣或者有思......
  • AtCoder Beginner Contest 288 - C Don't be cycle 删除图中最少的边使得图中无环
    C-Don'tbecycle题意给定一个n个顶点,m条边的无向图,你需要删除图中的一些边使得图中不存在环问你需要删除的最少边数?思路考虑连通块的生成树一个由n个顶点组成的连通块最多只能有n-1条边,不然就会成环。那么对于本题,我们只需要找到每个连通块的顶点数,那么每个连......
  • 2023.8.19JD笔试题目
    第二题题目大意是给一个长度20的01字符串,1表示得了该种病0未得。给出m种药每种药喝完可以治疗一些症状也可以诱发一些新症状,由两个长度为20的01字符串表示。然后给出用药顺序,求用完所有药后还有多少种症状。分析:*每次吃药等同于位运算,额外获得的新症状用a|b求,治疗的症状用a&(^b......
  • # DP 题目总结
    DP题目总结1、LC1388.3n块披萨题意:3n的环形数组,每次取一个数后就删除前后相邻的两个数,问最后取得的总数最大是多少。分析:相当于不能取相邻数(打家劫舍问题),但这里是环形的,所以要拆成一个去掉第一个数的数组,一个去掉最后一个数的数组。算两次取最大值代码classSoluti......
  • Atcoder_[abc284E]Count Simple Paths题解
    题目链接这题就是很简单的图上深搜,我觉得放在E题太水了,代码里有详细注释。#include<bits/stdc++.h>usingnamespacestd;#defineintlonglongvector<int>v[200010];//邻接表intans;//答案boolvis[200010];//vis[i]记录i号点有没有被访问过voiddfs(intx)......
  • 【NSSCTF逆向】【2023题目】《VidarCamera》
    题目VidarCamera解法这是一道安卓逆向题目,放在模拟器里打开看看需要输入一个序列号啥的,扔jadx里吧。通过字符串搜索定位到关键代码这里应该就是一个变种TEA,更改了加密轮次,delta。不过是TEA加密,写脚本不太难,自己的太丑了,贴个别人的点击查看代码fromCrypto.Util.numbe......
  • 【NSSCTF逆向】【2023题目】《kunmusic》
    题目kunmusic解法这题还是非常有意思的。打开有很多button,可能是需要按button的次数来得到flag把。这是一个.net的程序,需要用dnspy来反编译他反编译这个dll找到这个入口点可以看到是引入了某片数据,然后进行异或104,进行一个解密。找到这个东西、把他保存下来,然后......
  • AtCoder Beginner Contest 311 - D(思维题)
    目录D-GridIceFloorABC简单题D思维题D-GridIceFloor题意给定一个\(n\timesm\)的矩阵,矩阵每个位置上的字符要么是'.'要么是'#',保证矩阵的最外围一圈都是'#'。玩家初始位于位置(2,2)。玩家可以进行移动,但是移动有条件:玩家首先选定一个移动方向,之后在这个方......