目录

  • T1、直径(diameter)

    • 传送门
    • Code
  • T2、定价(price)
    • 传送门
    • Code
  • T3、排序(sort)
    • 传送门
    • Code

T1、直径(diameter)

传送门

Code

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

T2、定价(price)

传送门

Code

/*用set维护每行当前可以为1的位维护一个栈表示当前的1,位数最高的1放在栈底,每次可能弹出栈顶的若干个1,并加上一个1如何找到最高的不能继续为1的点?先计算出每一位的存活上限,用优先对列维护即可 均摊复杂度可行 什么?不写优先队列也能过,那就不写了算了 2019/2/14  19:30~20:23
*/
#include<bits/stdc++.h>
#define ll long long
#define max(a,b) ((a)>(b)?(a):(b))
#define min(a,b) ((a)<(b)?(a):(b))
#define Gho
namespace IO
{const int lim=(1<<20)+5;char buf[lim+5],*S,*T;inline char gc(){if(S==T){T=(S=buf)+fread(buf,1,lim,stdin);if(S==T)return EOF;}return *S++;}inline int read(){int x;char ch;bool f;for(f=0;(ch=gc())<'0'||ch>'9';f=ch=='-');for(x=ch^'0';(ch=gc())>='0'&&ch<='9';x=(x<<1)+(x<<3)+(ch^'0'));return f?-x:x;}
}
#ifdef Gho
using namespace IO;
#else
int read()
{int x=0,f=1;char ch=getchar();while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}while(ch>='0'&&ch<='9'){x=(x<<3)+(x<<1)+ch-'0';ch=getchar();}return x*f;
}
#endif
#define MN 1005
const int mod=1e9+7;
int n,m,q;
std::set<int> d[MN];
std::set<int>::iterator it;
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;}
int st[MN],top,sum[MN];
inline void add(int &x,int y){x+=y;if(x>=mod)x-=mod;}
inline void dec(int &x,int y){x+=mod-y;if(x>=mod)x-=mod;}
int solve()
{register int ret=0,i,j;top=0;st[0]=mod;for(i=1;i<=n;++i) {int fst=-1;for(j=1;j<=top&&d[i].find(st[j])!=d[i].end();++j);if(j<=top) fst=st[j],top=j-1; //注意,这里求最高位的复杂度是错误的,仅仅是偷懒罢了for(;;--top){it=d[i].lower_bound(fst+1);if(it==d[i].end()) return -1;if(*it>=st[top]) fst=st[top];else{st[++top]=*it;sum[top]=sum[top-1];add(sum[top],fpow(*it));break;}}add(ret,sum[top]);}add(ret,mod);return ret;
}
int main()
{freopen("price.in","r",stdin);freopen("price.out","w",stdout);n=read();m=read();q=read();while(q--){if(read()==1){int r=read(),c=m-read();if(d[r].find(c)!=d[r].end()) d[r].erase(c);else d[r].insert(c);}else printf("%d\n",solve());}return 0;
}

T3、排序(sort)

传送门

Code

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

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

转载于:https://www.cnblogs.com/PaperCloud/p/10380578.html

FOI冬令营 Day2相关推荐

  1. FOI冬令营 Day 3

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

  2. 【游记】GDKOI2023游寄

    GDKOI滚粗记. 说明:本文为游记,不是题解. Day −∞-\infty−∞ 两个都报了,没想到tg过了,CSP如此爆炸还能批上,怀疑报了名的都批了. 蒟蒻: 第一次出市比赛! 第一次住酒店比赛! ...

  3. 冬令营Web基础整理——Day2

    文章目录 重置.去电小数点.链接无下划线和变黑 字体大小.字体颜色 小练习1: 选择器 div 小练习2: div叠加 列表: 填充 小练习3: 作业1: 作业2: 重置.去电小数点.链接无下划线和变 ...

  4. 冬令营2015 酱油记

    Day0: 首先是报到,然后发现浙大寝室没网...又木有熟悉的学长可以借个账号,所以就去老师的宾馆蹭网络,做了道USACO的题,看了点论文就到晚饭时间了.晚上是开营仪式,各种发言什么的,还见到了传说中 ...

  5. Day2 - Python基础2作业【文件操作--购物车程序(用户操作及商户操作)】

    1 # ----user.txt---- 2 3 {'已购商品': '', '消费记录': '', '余额': 0} 4 5 6 # ----commodity.txt---- 7 8 iPhone, ...

  6. 【JAVA零基础入门系列】Day2 Java集成开发环境IDEA

    [JAVA零基础入门系列](已完结)导航目录 Day1 开发环境搭建 Day2 Java集成开发环境IDEA Day3 Java基本数据类型 Day4 变量与常量 Day5 Java中的运算符 Day ...

  7. 2016 KidCraft冬令营 一起来玩Scratch + MineCraft

    翻阅你身边的计算机图书,总会找到一本在书脊上出现 "图灵教育 "logo的图书.图灵教育作为国内具有影响力的科技图书出版品牌,引进出版了很多计算机畅销图书.在多年的出版工作中,我们 ...

  8. 2018冬令营模拟测试赛(十八)

    2018冬令营模拟测试赛(十八) [Problem A]Table 试题描述 输入 见"试题描述" 输出 见"试题描述" 输入示例 见"试题描述&qu ...

  9. Alpha冲刺Day2

    冲刺Day2 一.站立式会议计划 分组讨论研究:较好的掌握MYSQL的使用,以及Android Studio图形化界面设计的学习同步进行. 完成设计数据库架构,进阶版. 登录.注册界面的设计. 能从同 ...

最新文章

  1. Ubuntu搭建Spark运行环境
  2. nodejs-安装/helloworld/npm
  3. 用RadASM 开发窗口程序
  4. 借助码云快速安装 golang.org/x/lint/golint 和 golang.org/x/tools/ 等依赖
  5. 网络爬虫之java基础篇QueryRunner(Ⅲ)
  6. 测试工程方法:判定表驱动法
  7. Docker配置Dockerfile中关键ENTRYPOINT和CMD命令详解
  8. 磁共振立体定向仪行业调研报告 - 市场现状分析与发展前景预测(2021-2027年)
  9. 个人收藏的一些资料(一)Installshield制作友好的更新
  10. 计算机论文摘要200字模板,设计论文摘要万能模板_论文摘要万能模板_论文摘要200字模板...
  11. 文件压缩(哈夫曼树)
  12. 爬虫——获取联行行号
  13. C/C++生成随机数
  14. .9图片报错Execution failed for task ':app:mergeDebugResources'. Crunching Cruncher scrollbar_thumb.9.p
  15. 文件管理助手函数升级
  16. ⑮霍兰德EA*型如何选专业?高考志愿填报选专业
  17. 加法要遍历两遍所有元素,那就用减法,只遍历一遍即可(思想)
  18. javascript高级程序设计---模式设计
  19. linux 最大文件描述符fd
  20. ubuntu 安装touchpad-indicator方法 管理触控板

热门文章

  1. linux 路由协议,路由协议之RIP协议
  2. php 取得user_agent,php通过$_SERVER['HTTP_USER_AGENT']获取浏览器相关参数(转)
  3. ubuntu中mysql怎么退出命令_Ubuntu中mysql启动和关闭
  4. swift linux服务器,Swift on Linux —— Hello, world!
  5. 平安dms开发java_Spring DMS模板同步接收非持久用户消息丢失
  6. 安徽省农商行计算机类考试,2017安徽农商行备考:计算机的系统组成
  7. tensorflow中同时两个损失函数_深度度量学习中的损失函数
  8. leetcode刷题:数组中第K个最大的元素
  9. C++socket编程(七):7.1 http协议讲解,通过抓包和telnet分析
  10. matlab如何矩阵相除,Matlab中的矩阵除法有问题???