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的更多相关文章

  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. 【转载】Intellij IDEA神器居然还有这些小技巧

    概述Intellij IDEA真是越用越觉得它强大,它总是在我们写代码的时候,不时给我们来个小惊喜.出于对Intellij IDEA的喜爱,我决定写一个与其相关的专栏或者系列,把一些好用的Intell ...

  2. 【转载】在windows上部署使用Redis

    下载Redis 在Redis的官网下载页上有各种各样的版本,我这次是在windows上部署的,要去GitHub上下载.目前的是2.8.12版的,直接解压,在\bin\release 目录下有个压缩包, ...

  3. 2019年全国高校sql数据库

    2019年全国高校名单sql数据库信息: 根据教育部发布的文件整理形成可用.sql文件,导入数据库即可使用. 包括全国高等学校共计2956所,其中:普通高等学校2688所(含独立学院257所),成人高 ...

  4. WebHost.CreateDefaultBuilder

    返回WebHostBuilder: 1.用Kestrel做为web服务器,并根据配置提供器内容对其配置. 2.当前目录作为content根目录. 3.从appsettings.json,环境变量,ar ...

  5. java 爬虫:开源java爬虫 swing工具 Imgraber

    1实现点: 1.返回给定URL网页内,所有图像url list 2.返回给定URL网页内,自动生成图像文件路径.txt 文件 3.返回给定URL网页内,下载txt文件指定的图片url,并将所有图像保存 ...

  6. snort_inline

    snort_inline Link   http://snort-inline.sourceforge.net/oldhome.html What is snort_inline? snort_inl ...

  7. 数据结构与算法(周测3-Huffman树)

    判断题 1.Given a Huffman tree for N (≥2) characters, all with different weights. The weight of any non- ...

  8. 关于INT_MIN

    来自为知笔记(Wiz)

  9. django 发帖时碰到的图片上传

    所用编辑器 [wangEditor.js] 图片上传接口 '/edit/image/' 返回内容  参照 https://www.kancloud.cn/wangfupeng/wangeditor3/ ...

  10. spark 机器学习 ALS原理(一)

    1.线性回归模型线性回归是统计学中最常用的算法,当你想表示两个变量间的数学关系时,就可以用线性回归.当你使用它时,你首先假设输出变量(相应变量.因变量.标签)和预测变量(自变量.解释变量.特征)之间存 ...