T1、直径(diameter)

传送门

Code

  1. //2019/2/13 50pts
  2. #include<bits/stdc++.h>
  3. #define ll long long
  4. #define max(a,b) ((a)>(b)?(a):(b))
  5. #define min(a,b) ((a)<(b)?(a):(b))
  6. inline int read()
  7. {
  8. int x=0,f=1;char ch=getchar();
  9. while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
  10. while(ch>='0'&&ch<='9'){x=(x<<3)+(x<<1)+ch-'0';ch=getchar();}
  11. return x*f;
  12. }
  13. int k;
  14. namespace solve1
  15. {
  16. inline void work()
  17. {
  18. printf("%d\n",k+2);register int i;
  19. puts("1 2 3");
  20. for(i=1;i<=k;++i) printf("1 %d 2\n",i+2);
  21. return;
  22. }
  23. }
  24. namespace solve2
  25. {
  26. inline void work()
  27. {
  28. register int i;
  29. for(i=1;i<=k&&i*(i-1)/2!=k;++i);
  30. int n=i;
  31. printf("%d\n",n+1);
  32. for(i=1;i<=n;++i) printf("1 %d 1\n",i+1);
  33. }
  34. }
  35. int main()
  36. {
  37. freopen("diameter.in","r",stdin);
  38. freopen("diameter.out","w",stdout);
  39. k=read();
  40. if(k<=2000) solve1::work();
  41. else if((ll)(sqrt(k*8ll+1ll))*(ll)(sqrt(k*8ll+1ll))==k*8ll+1ll) solve2::work();
  42. //else solve3::work();
  43. return 0;
  44. }
  1. /*
  2. 构造一个节点拉出3条链,除了与该节点相邻的边(都为233)以外,其余都为0
  3. 三条链长度分别为a、b、c,那么k=ab+ac+bc=(a+c)(b+c)-c^2
  4. 从小到大枚举c,将k+c^2分解质因数,直到找到这样合适的(a,b,c)即可。
  5. 由于sqrt(500w)≈2236<5000/2=2500,所以有很高概率存在这样合适的解,事实上跑一遍所有k发现确实如此。
  6. 2019/2/13 21:54~22:20
  7. */
  8. #include<bits/stdc++.h>
  9. #define ll long long
  10. using namespace std;
  11. inline int read()
  12. {
  13. int x=0,f=1;char ch=getchar();
  14. while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
  15. while(ch>='0'&&ch<='9'){x=(x<<3)+(x<<1)+ch-'0';ch=getchar();}
  16. return x*f;
  17. }
  18. int main()
  19. {
  20. freopen("diameter.in", "r", stdin);
  21. freopen("diameter.out", "w", stdout);
  22. int k=read();register int a,b,c;
  23. for(a=1;a<=4999;++a)for(b=1;a+b<=4999&&a*b<=k;++b)
  24. if((k-a*b)%(a+b)==0&&a+b+(c=(k-a*b)/(a+b))<=4999)
  25. {
  26. printf("%d\n",a+b+c+1);puts("1 2 233");puts("1 3 233");if(c) puts("1 4 233");
  27. int cnt=4+(c>0);
  28. for(;--a>0;) printf("2 %d 0\n",cnt++);
  29. for(;--b>0;) printf("3 %d 0\n",cnt++);
  30. for(;--c>0;) printf("4 %d 0\n",cnt++);
  31. return 0;
  32. }
  33. }

T2、定价(price)

传送门

Code

  1. /*
  2. 用set维护每行当前可以为1的位
  3. 维护一个栈表示当前的1,位数最高的1放在栈底,每次可能弹出栈顶的若干个1,并加上一个1
  4. 如何找到最高的不能继续为1的点?先计算出每一位的存活上限,用优先对列维护即可
  5. 均摊复杂度可行
  6. 什么?不写优先队列也能过,那就不写了算了
  7. 2019/2/14 19:30~20:23
  8. */
  9. #include<bits/stdc++.h>
  10. #define ll long long
  11. #define max(a,b) ((a)>(b)?(a):(b))
  12. #define min(a,b) ((a)<(b)?(a):(b))
  13. #define Gho
  14. namespace IO
  15. {
  16. const int lim=(1<<20)+5;
  17. char buf[lim+5],*S,*T;
  18. inline char gc(){if(S==T){T=(S=buf)+fread(buf,1,lim,stdin);if(S==T)return EOF;}return *S++;}
  19. inline int read()
  20. {
  21. int x;char ch;bool f;
  22. for(f=0;(ch=gc())<'0'||ch>'9';f=ch=='-');
  23. for(x=ch^'0';(ch=gc())>='0'&&ch<='9';x=(x<<1)+(x<<3)+(ch^'0'));
  24. return f?-x:x;
  25. }
  26. }
  27. #ifdef Gho
  28. using namespace IO;
  29. #else
  30. int read()
  31. {
  32. int x=0,f=1;char ch=getchar();
  33. while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
  34. while(ch>='0'&&ch<='9'){x=(x<<3)+(x<<1)+ch-'0';ch=getchar();}
  35. return x*f;
  36. }
  37. #endif
  38. #define MN 1005
  39. const int mod=1e9+7;
  40. int n,m,q;
  41. std::set<int> d[MN];
  42. std::set<int>::iterator it;
  43. int fpow(int M){int r=1,x=2;for(;M;M>>=1,x=1ll*x*x%mod)if(M&1)r=1ll*x*r%mod;return r;}
  44. int st[MN],top,sum[MN];
  45. inline void add(int &x,int y){x+=y;if(x>=mod)x-=mod;}
  46. inline void dec(int &x,int y){x+=mod-y;if(x>=mod)x-=mod;}
  47. int solve()
  48. {
  49. register int ret=0,i,j;top=0;st[0]=mod;
  50. for(i=1;i<=n;++i)
  51. {
  52. int fst=-1;
  53. for(j=1;j<=top&&d[i].find(st[j])!=d[i].end();++j);
  54. if(j<=top) fst=st[j],top=j-1;
  55. //注意,这里求最高位的复杂度是错误的,仅仅是偷懒罢了
  56. for(;;--top)
  57. {
  58. it=d[i].lower_bound(fst+1);
  59. if(it==d[i].end()) return -1;
  60. if(*it>=st[top]) fst=st[top];
  61. else{st[++top]=*it;sum[top]=sum[top-1];add(sum[top],fpow(*it));break;}
  62. }
  63. add(ret,sum[top]);
  64. }
  65. add(ret,mod);return ret;
  66. }
  67. int main()
  68. {
  69. freopen("price.in","r",stdin);
  70. freopen("price.out","w",stdout);
  71. n=read();m=read();q=read();
  72. while(q--)
  73. {
  74. if(read()==1)
  75. {
  76. int r=read(),c=m-read();
  77. if(d[r].find(c)!=d[r].end()) d[r].erase(c);
  78. else d[r].insert(c);
  79. }
  80. else printf("%d\n",solve());
  81. }
  82. return 0;
  83. }

T3、排序(sort)

传送门

Code

  1. //2019/2/13
  2. //10pts
  3. #include<bits/stdc++.h>
  4. #define ll long long
  5. #define max(a,b) ((a)>(b)?(a):(b))
  6. #define min(a,b) ((a)<(b)?(a):(b))
  7. inline int read()
  8. {
  9. int x=0,f=1;char ch=getchar();
  10. while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
  11. while(ch>='0'&&ch<='9'){x=(x<<3)+(x<<1)+ch-'0';ch=getchar();}
  12. return x*f;
  13. }
  14. #define MN 1000005
  15. int n,a[MN];
  16. ll cnt;
  17. namespace solve1
  18. {
  19. inline void work()
  20. {
  21. int ct=0;
  22. for(int i=1;i<=n;++i)
  23. for(int j=i+1;j<=n&&ct<cnt;++j,++ct)
  24. if(a[j]<a[i]) std::swap(a[i],a[j]);
  25. for(int i=1;i<=n;++i) printf("%d ",a[i]);puts("");
  26. }
  27. }
  28. namespace solve2
  29. {
  30. inline void work()
  31. {
  32. int i,j,k;
  33. for(i=1;i<n,cnt>(n-i);cnt-=(n-i),++i);
  34. for(j=1;j<i;++j) printf("%d ",j);
  35. printf("%d ",n-cnt);
  36. for(j=n;j>n-cnt;--j) printf("%d ",j);
  37. for(j=n-cnt-1;j>=i;--j) printf("%d ",j);
  38. }
  39. }
  40. int main()
  41. {
  42. freopen("sort.in","r",stdin);
  43. freopen("sort.out","w",stdout);
  44. n=read();cnt=read();
  45. register int i,j=1;
  46. for(int i=1;i<=n;++i) a[i]=read(),j=(a[i]!=n+1-i)?0:1;
  47. if(cnt<=1e7)
  48. {
  49. solve1::work();
  50. return 0;
  51. }
  52. if(j)
  53. {
  54. solve2::work();
  55. return 0;
  56. }
  57. return 0;
  58. }
  1. /*
  2. 我们先处理出完整的k轮,剩下的暴力更新即可。
  3. 考虑如何求出前k轮后的a数组,首先前k个数肯定已经排号了序(1~k)
  4. 然后,我们第i轮是从i这个数,往前找一个递增的子序列(满足a_i=min(a_1,...,a_{i+1})),把它循环右移一位
  5. 每个数最后必定会停留在最后一次被选中时的下一个数上。
  6. 通过冥想可以发现,代码的实现方式恰好能得出最后的位置
  7. 比较优秀的思考:
  8. 考虑一个01序列,经过k轮操作后,把最前面的至多k个0移至开头
  9. 对于序列a,一开始只有1~k对应的位置为0,其它都是1 (如 53421 k=2 的情况:11100)
  10. 而经过k轮后,变为00111,前两个0分别对应原序列中的1,2
  11. 我们枚举k+1~n,每次把当前数变成0,比如:我们把3变成0,为10100
  12. 经过k轮后,它会变成00110,对比00111,我们发现,3最终会停留在下标5上(这个位置由1变成了0)
  13. 我们要做的,其实是维护前k个0的位置,并把当前数放在第k+1个0的位置上
  14. 依次把下标加入pq,每次弹出最大的那一个即可。
  15. 2019/2/13
  16. 题解写于 2019/2/14
  17. */
  18. #include<bits/stdc++.h>
  19. #define ll long long
  20. using namespace std;
  21. inline ll read()
  22. {
  23. ll x=0,f=1;char ch=getchar();
  24. while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
  25. while(ch>='0'&&ch<='9'){x=(x<<3)+(x<<1)+ch-'0';ch=getchar();}
  26. return x*f;
  27. }
  28. const int MN=1000005;
  29. int n,a[MN],pos[MN];ll cnt;
  30. std::priority_queue<int>q;
  31. int main()
  32. {
  33. freopen("sort.in","r",stdin);
  34. freopen("sort.out","w",stdout);
  35. n=read();cnt=read();register int i,j;
  36. for(i=1;i<=n;++i) a[i]=read(),pos[a[i]]=i;
  37. for(i=1;i<=n&&cnt>n-i;cnt-=n-i,a[i]=i,++i);
  38. for(j=1;j<i;++j) q.push(pos[j]);
  39. if(i>1) for(j=i;j<=n;++j) if(q.top()>pos[j]) a[q.top()]=j,q.pop(),q.push(pos[j]);
  40. for(j=i+1;j<=i+cnt;++j) if(a[j]<a[i]) std::swap(a[j],a[i]);
  41. for(i=1;i<=n;++i) printf("%d ",a[i]);
  42. return 0;
  43. }

Blog来自PaperCloud,未经允许,请勿转载,TKS!

FOI冬令营 Day2的更多相关文章

  1. 2016NOI冬令营day2

    早上起来发现头不痛了(还是咳) : | 上午先讲自然语言处理!完全不考!完全不涉及!一开始挺有兴趣,后面就完全听不懂了 : | 后来又讲了几道IOI题目(自称只是op),然后就是  从信息熵到数据压缩 ...

  2. FOI 冬令营 Day6

    目录 T1.堆(heap) 传送门 Code T2.密文(secret) 传送门 Code T3.树(tree) 传送门 Code 别问Day5到底去哪里了,咕咕咕 T1.堆(heap) 传送门 Co ...

  3. FOI冬令营 Day4

    目录 T1.循环流(flow) 传送门 Code T2.整除分块(mex) 传送门 Code T3.森林(forest) 传送门 Code 咕咕咕 T1.循环流(flow) 传送门 Code /* 特 ...

  4. FOI冬令营 Day 3

    目录 T1.签到题(sort) 传送门 Code T2.送分题(queue) 传送门 Code T3.简单题(game) 传送门 Code 咕咕咕 T1.签到题(sort) 传送门 原题:LOJ 27 ...

  5. FOI冬令营 Day1

    目录 T1.全连(fc) 传送门 Code  T2.原样输出(copy) 传送门 Code  T3.不同的缩写(diff) 传送门 Code  打算把省冬的题目放上来,主要是防止自己偷懒不订正 T1. ...

  6. 9.22 NOIP模拟题

    吉林省信息学奥赛 2017 冬令营                                                                                    ...

  7. 19年PDYZ冬令营游记

    我和卓越的那些事 ——2019年平度一中卓越计划冬令营   题前记: 正月十三那天,刚看完<流浪地球>,便接到了一个电话,老妈告诉我竟然一中组织了一个冬令营,并且起了一个很好的名字“卓越计 ...

  8. JSOI2018冬令营游记&总结(迁移自洛谷博客)

    游记 一开始在冬令营还没开始的时候,十分期待,殊不知每天都有一场浩劫在等着我. Day0 10:50出发,看见lbn同学发了一条说说,也随便发了一个. 然后在车上一直在睡觉,现在感觉挺后悔的,其实可以 ...

  9. 【从零开始学BPM,Day2】默认表单开发

    [课程主题]主题:5天,一起从零开始学习BPM[课程形式]1.为期5天的短任务学习2.每天观看一个视频,视频学习时间自由安排. [第二天课程] Step 1 软件下载:H3 BPM10.0全开放免费下 ...

随机推荐

  1. ajax中的事件

    blur : 当光标移开时(点击)触发 change : 当光标移开并且文本框中的内容和上一次不一致时(点击)触发

  2. 1-JavaScript变量

    对于JS的变量这个环节,其实主要要了解一下JS数据类型的存储方法 JS有两种不同的数据类型:基本类型(原始类型),引用类型(对象类型). 1.栈 (stack) 和 堆 (heap) 栈 (stack ...

  3. Questasim10.6c下载安装教程

    questasim作为modelsim的高级版,用着速度还是比modelsim爽很多,基本上所有操作指令都是和modelsim兼容的. 不同版本的vivado兼容的modelsim版本是不一样的,如果 ...

  4. 【已解决】bootstrap table 参数后台获取不到

    查看请求,可以看到有部分字段是可以的. 改成以下这种即可,原因是由于字段为null,没把错误抛出来,为null的字段就不会放到请求的参数中.

  5. linux管道和重定向

    管道 管道应该是等左边的程序执行完,才使用左边的程序的输出执行右边的程序. 但是在测试的时候,如果左边的程序无限循环且不等待的输出,那么左边的程序执行时右边的程序也会执行,个人感觉这是linux的机制 ...

  6. Python 获取环境变量的几种方式

    第一种 import os os.environ.get('key_name') 第二种 import os os.getenv('key_name') 第三种 import os os.getenv ...

  7. vi编辑器简介

    vi编辑器是Linux和Unix上最基本的文本编辑器,工作在字符模式下.由于不需要图形界面,vi是效率很高的文本编辑器.尽管在Linux上也有很多图形界面的编辑器可用,但vi在系统和服务器管理中的功能 ...

  8. ubuntu18 搭建ftp服务器,以及文件目录权限问题

    有时候呢我们有一台本地的台式机或者云服务器,我们想要搭个ftp服务器好让我们在内网/外网中方便的传输.保存文件,这样别的任何电脑啊,设备啊,只要访问这个ftp的地址,就可以进行文件传输啦!由于我现在台 ...

  9. python算法与数据结构-常用查找算法一(37)

    一.什么是查找 查找(Searching)就是根据给定的某个值,在查找表中确定一个其关键字等于给定值的数据元素(或记录). 查找表(Search Table):由同一类型的数据元素(或记录)构成的集合 ...

  10. 1127 模型层orm表操作

    目录 昨日回顾 模型层 1.配置测试脚本 1.1 应用下tests文件 1.2 新建任意名称文件 2. 数据的增删改查 2.1 创建数据 2.2 修改数据 2.3 删除数据 2.4查询数据 十三门徒 ...