FOI冬令营 Day2
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!
FOI冬令营 Day2的更多相关文章
- 2016NOI冬令营day2
早上起来发现头不痛了(还是咳) : | 上午先讲自然语言处理!完全不考!完全不涉及!一开始挺有兴趣,后面就完全听不懂了 : | 后来又讲了几道IOI题目(自称只是op),然后就是 从信息熵到数据压缩 ...
- FOI 冬令营 Day6
目录 T1.堆(heap) 传送门 Code T2.密文(secret) 传送门 Code T3.树(tree) 传送门 Code 别问Day5到底去哪里了,咕咕咕 T1.堆(heap) 传送门 Co ...
- FOI冬令营 Day4
目录 T1.循环流(flow) 传送门 Code T2.整除分块(mex) 传送门 Code T3.森林(forest) 传送门 Code 咕咕咕 T1.循环流(flow) 传送门 Code /* 特 ...
- FOI冬令营 Day 3
目录 T1.签到题(sort) 传送门 Code T2.送分题(queue) 传送门 Code T3.简单题(game) 传送门 Code 咕咕咕 T1.签到题(sort) 传送门 原题:LOJ 27 ...
- FOI冬令营 Day1
目录 T1.全连(fc) 传送门 Code T2.原样输出(copy) 传送门 Code T3.不同的缩写(diff) 传送门 Code 打算把省冬的题目放上来,主要是防止自己偷懒不订正 T1. ...
- 9.22 NOIP模拟题
吉林省信息学奥赛 2017 冬令营 ...
- 19年PDYZ冬令营游记
我和卓越的那些事 ——2019年平度一中卓越计划冬令营 题前记: 正月十三那天,刚看完<流浪地球>,便接到了一个电话,老妈告诉我竟然一中组织了一个冬令营,并且起了一个很好的名字“卓越计 ...
- JSOI2018冬令营游记&总结(迁移自洛谷博客)
游记 一开始在冬令营还没开始的时候,十分期待,殊不知每天都有一场浩劫在等着我. Day0 10:50出发,看见lbn同学发了一条说说,也随便发了一个. 然后在车上一直在睡觉,现在感觉挺后悔的,其实可以 ...
- 【从零开始学BPM,Day2】默认表单开发
[课程主题]主题:5天,一起从零开始学习BPM[课程形式]1.为期5天的短任务学习2.每天观看一个视频,视频学习时间自由安排. [第二天课程] Step 1 软件下载:H3 BPM10.0全开放免费下 ...
随机推荐
- Authentication failed for "http://xxxxxx"
1.配置用户信息 git config --global user.name [username] git config --global user.email [email] 2.查询用户信息 ...
- syslog 日志
syslog日志是系统日志的一种,可以存放在本地也可以发送到syslog日志服务器, 但是syslog日志由于的格式不统一,在日常工作中审计syslog日志是一种很麻烦的 事情.不过在2001出现了一 ...
- vue组件上动态添加和删除属性
1.vue组件上动态添加和删除属性 // 添加 this.$set(this.obj, 'propName', val) // 删除 this.$delete(this.obj, 'propName' ...
- Thinkphp中的assign() 和 display()
说到 $this->assign() 与 $this->display()想必用过TP框架的都不陌生,那么今天我们就来说说他们的作用及其他用法. 先说 $this->assign( ...
- 【日语】【ZZ】日语人称小结
[ZZ]日语人称小结 日语中有关人称的词很多,也有不少朋友问 现整理了一下,希望能对那些不太清楚的朋友有点帮助 如果您认为在下有写错的地方,或者您有什么高见,请不吝赐教 第一人称 “我” 1.私 わた ...
- DBShop后台RCE之曲线救国
本文最早发布在朋友的公众号 黑客信徒 中,文章是自己写的 不存在抄袭 特此申明 --------------------- 前言 DBShop是一款基于ZendFramework2框架的电子商务系统 ...
- Leaflet 调用百度瓦片地图服务
在使用 leaflet 调用第三方瓦片地图服务的项目,主要谷歌地图.高德地图.百度地图和 OSM 地图,与其他三种地图对比,百度地图的瓦片组织方式是不同的.百度从中心点经纬度(0,0)度开始计算瓦片, ...
- IDEA 中常用快捷键
1.搜索文件(整个项目) ctrl+shift+n 2.最近打开文件 ctrl+e 3.实现接口中方法 ctrl+i 4.跳到上一行 ctrl+alt+enter 5.删除当前行 ctrl+y 6.重 ...
- dstat 监控工具
dstat 监控工具 Linux 自带的监控工具.界面相当友好,可以替代其他的监控工具. 安装 yum install -y dstat 命令使用 dstat -h # 帮助 dstat -tpcdr ...
- 团队高效率协作开发的秘密武器-APIDOC
团队高效率协作开发的秘密武器 1.前言 在团队协作开发中,不知道各位有没有遇到这样的问题: l 新人接手了项目代码,因没有项目文档,只能靠追踪路由,寻读代码分析业务逻辑 l 前端同学写好了页面,苦等后 ...