SNOI2019 选做
施工中。。。
d1t1 字符串
考虑两个字符串 \(s_i,s_j(i<j)\) ,实质是 \(s[i+1,\dots j]\) 和 \(s[i,\dots ,j-1]\) 的字符串字典序比较。我们可以对于每个 \(i\) 从后往前线性维护出 \(j>i,s_j\neq s_{j+1}\) 的最小的 \(j\) 和 \(s_j,s_{j+1}\) 大小关系。这样比较两个字符串大小我们就能很容易的判两段字符串是否相等和它们的大小关系。排序即可。复杂度 \(O(n\log n)\) 。
#include<cstdio>
#include<algorithm>
using namespace std;
const int N=1e6+5;
char s[N];
int comp[N],fst[N],id[N];
bool cmp(int x, int y)
{
if(x<y)
{
if(fst[x]>=y) return true;
else return comp[x];
}
else
{
if(fst[y]>=x) return false;
else return !comp[y];
}
}
int main()
{
int n;
scanf("%d%s",&n,s+1);
fst[n]=n;
for(int i=n-1;i;--i)
if(s[i]!=s[i+1]) fst[i]=i,comp[i]=(s[i+1]<s[i]);
else fst[i]=fst[i+1],comp[i]=comp[i+1];
for(int i=1;i<=n;++i) id[i]=i;
sort(id+1,id+1+n,cmp);
for(int i=1;i<=n;++i) printf("%d ",id[i]);
}
d1t2 数论
枚举 \(a_i\) ,考虑 \(kp+a_i \pmod q\rightarrow (k+1)p+a_i \pmod q\) 一定形成一个环。所以问题转化为给你若干个环,每个环上有若干个关键点,对于每个 \(a_i\) , 在对应环上面跑 \(\frac{T-a_i}{p}\) (上取整)步能走到多少个关键点。随便维护一下即可。
#include<cstdio>
#include<algorithm>
#include<vector>
using namespace std;
typedef long long ll;
namespace io {
const int SIZE=(1<<21)+1;
char ibuf[SIZE],*iS,*iT,c; int qr;
#define gc()(iS==iT?(iT=(iS=ibuf)+fread(ibuf,1,SIZE,stdin),(iS==iT?EOF:*iS++)):*iS++)
inline ll gi (){
ll x=0;
for(c=gc();c<'0'||c>'9';c=gc());
for(;c<='9'&&c>='0';c=gc()) x=(x<<1)+(x<<3)+(c&15); return x;
}
} using io::gi;
const int N=1e6+5;
int p,q,n,m,a[N],b[N],sum[N],size[N],mn[N],id,bel[N],xid[N];
vector<int> s[N];
ll t,ans;
int main()
{
p=gi(),q=gi(),n=gi(),m=gi(),t=gi();
if(p>q)
{
for(int i=1;i<=n;++i) ++b[gi()];
for(int i=1;i<=m;++i) a[i]=gi();
swap(n,m),swap(p,q);
}
else
{
for(int i=1;i<=n;++i) a[i]=gi();
for(int i=1;i<=m;++i) ++b[gi()];
}
for(int i=1;i<=n;++i)
{
if(bel[a[i]]) continue;
mn[++id]=1<<30;
for(int j=a[i];!bel[j];j=(j+p)%q)
{
bel[j]=id;
sum[id]+=b[j];
s[id].push_back(sum[id]);
++size[id],xid[j]=size[id];
mn[id]=min(mn[id],j);
}
for(int j=a[i],k=1,x=sum[id];k<=size[id];j=(j+p)%q,++k)
{
x+=b[j];
s[id].push_back(x);
}
}
for(int i=1;i<=n;++i)
{
const int d=bel[a[i]];
const ll g=(t-a[i]-1)/p+1;
const ll f=g/size[d],y=g%size[d];
const int id1=(xid[a[i]]==1?size[d]:xid[a[i]]-1);
ans+=f*sum[d]+s[d][id1+y-1]-s[d][id1-1];
}
printf("%lld",ans);
}
d1t3 通信
一眼网络流。暴力建图相信都会。
注意到权值和位置有关,考虑用分治优化建图。对于区间 \([l,r]\) ,我们考虑 \([mid+1,r]\) 内的点向 \([l,mid]\) 内的点连接。我们将 \([l,r]\) 内的点复制一份,按照位置排序后串成一条链。然后 \([mid+1,r]\) 的点由原图上的点连入, \([l,mid]\) 的点连出即可。这样点数和边数都是 \(O(n\log n)\) 级别的。
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
typedef long long ll;
const int N=200005,inf=1<<30;
int a[N],head[N],nxt[N],to[N],wei[N],cost[N],tot=1,n,w,s,t,now,q[N*3];
bool vis[N];
ll dis[N],ans;
void addedge(int u, int v, int w, int c)
{
nxt[++tot]=head[u], head[u]=tot, to[tot]=v, wei[tot]=w, cost[tot]=c;
nxt[++tot]=head[v], head[v]=tot, to[tot]=u, wei[tot]=0, cost[tot]=-c;
}
bool spfa()
{
memset(vis,false,sizeof(int)*(now+1));
memset(dis,0x3f,sizeof(ll)*(now+1));
int l=0,r=0;
q[0]=t,dis[t]=0;
while(l<=r)
{
int u=q[l++]; vis[u]=false;
for(int e=head[u];e;e=nxt[e])
if(wei[e^1]&&dis[to[e]]>dis[u]-cost[e])
{
dis[to[e]]=dis[u]-cost[e];
if(!vis[to[e]]) vis[to[e]]=true,q[++r]=to[e];
}
}
return dis[s]!=dis[0];
}
int dfs(int u, int mx)
{
vis[u]=true;
if(u==t) return mx;
int l=mx;
for(int e=head[u];l&&e;e=nxt[e])
if(!vis[to[e]]&&wei[e]>0&&dis[to[e]]==dis[u]-cost[e])
{
int f=dfs(to[e],min(l,wei[e]));
ans+=1ll*f*cost[e];
l-=f,wei[e]-=f,wei[e^1]+=f;
}
return mx-l;
}
int tmp[N];
void solve(int l, int r)
{
if(l==r) return ;
int mid=l+r>>1;
solve(l,mid),solve(mid+1,r);
int t=0;
for(int i=l;i<=r;++i) tmp[++t]=a[i];
sort(tmp+1,tmp+1+t);
for(int i=2;i<=t;++i)
{
addedge(now+i,now+i-1,inf,tmp[i]-tmp[i-1]);
addedge(now+i-1,now+i,inf,tmp[i]-tmp[i-1]);
}
for(int i=l;i<=mid;++i)
{
int x=lower_bound(tmp+1,tmp+t+1,a[i])-tmp;
addedge(now+x,i+n,1,0);
}
for(int i=mid+1;i<=r;++i)
{
int x=lower_bound(tmp+1,tmp+t+1,a[i])-tmp;
addedge(i,now+x,1,0);
}
now+=t;
}
int main()
{
scanf("%d%d",&n,&w);
s=2*n+1,t=now=s+1;
for(int i=1;i<=n;++i)
{
scanf("%d",&a[i]);
addedge(s,i,1,0);
addedge(i,t,1,w);
addedge(i+n,t,1,0);
}
solve(1,n);
while(spfa())
do {
memset(vis,false,sizeof(vis));
dfs(s,inf);
} while(vis[t]);
printf("%lld",ans);
}
SNOI2019 选做的更多相关文章
- [SDOI2016]部分题选做
听说SDOI蛮简单的,但是SD蛮强的.. 之所以是选做,是因为自己某些知识水平还不到位,而且目前联赛在即,不好花时间去学sa啊之类的.. bzoj4513储能表&bzoj4514数字配对 已写 ...
- 20175221 《Java程序设计》迭代和JDB(课下作业,选做):
20175221 <Java程序设计> 迭代和JDB(课下作业,选做): 任务详情 1 使用C(n,m)=C(n-1,m-1)+C(n-1,m)公式进行递归编程实现求组合数C(m,n)的功 ...
- MyOD(课下作业,选做)
MyOD(课下作业,选做) 代码要求 编写MyCP.java 实现类似Linux下cp XXX1 XXX2的功能,要求MyCP支持两个参数: java MyCP -tx XXX1.txt XXX2.b ...
- 迭代和JDB(课下作业,选做)
迭代和JDB(课下作业,选做) 题目要求 1 使用C(n,m)=C(n-1,m-1)+C(n-1,m)公式进行递归编程实现求组合数C(m,n)的功能 2 m,n 要通过命令行传入 3 提交测试运行截图 ...
- 20175312 2018-2019-2 《Java程序设计》第6周课下选做——类定义
20175312 2018-2019-2 <Java程序设计>第6周课下选做--类定义 设计思路 1.我觉得Book其实就是一个中转的作用,由测试类Bookself通过Book输入数据,然 ...
- 20175314薛勐 MyOD(课下作业,选做)
MyOD(课下作业,选做) 要求 编写MyOD.java 用java MyOD XXX实现Linux下od -tx -tc XXX的功能 思路 伪代码: 读取命令行输入的参数(文件名) 以16为每个字 ...
- 20155228 2017-11-19 实现mypwd(选做,加分)
20155228 2017-11-19 实现mypwd(选做,加分) 题目和要求 学习pwd命令 研究pwd实现需要的系统调用(man -k; grep),写出伪代码 实现mypwd 测试mypwd ...
- 2017-2018-2 20165312 课下选做 MySort
2017-2018-2 20165312 课下选做 MySort 题目描述 模拟实现Linux下Sort -t : -k 2的功能,参考 Sort的实现. import java.util.*; pu ...
- 「LOJ2000~2023」各省省选题选做
「LOJ2000~2023」各省省选题选做 「SDOI2017」数字表格 莫比乌斯反演. 「SDOI2017」树点涂色 咕咕咕. 「SDOI2017」序列计数 多项式快速幂. 我们将超过 \(p\) ...
随机推荐
- Spring boot 2.x 中使用redis
一.添加Maven 依赖 <dependency> <groupId>org.springframework.boot</groupId> <artifac ...
- C 语言入门第十二章---C语言文件操作
C语言具有操作文件的能力,比如打开文件.读取和追加数据.插入和删除数据.关闭文件.删除文件等. 在操作系统中,为了同意对各种硬件的操作,简化接口,不同的硬件设备也都被看成一个文件.对这些文件的操作,等 ...
- Ionic3记录之核心代码分析
app.module.ts app的根模块,一些插件的引用需要在这里声明,告诉APP如何组装应用: app.componet.ts app的根组件,主要用来APP启动时和启动后的操作;
- python学习第一课
第一课: 1.不要使用来路不明的软件 2.下载杀毒软件 3.不懂技术的人在技术人面前会显得愈发无知 4.python无所不能 需要掌握的知识: 1.python基本语法 2.文件处理 3.函数 4.模 ...
- Linux 修改/etc/profile 出错 导致所有命令都 command not found 的解决办法
执行命令 export PATH=/usr/bin:/usr/sbin:/bin:/sbin:/usr/X11R6/bin 然后再修改/etc/profile 再执行文件: source /etc/p ...
- 【PAT甲级】1007 Maximum Subsequence Sum (25 分)
题意: 给出一个整数K(K<=10000),输入K个整数.输出最大区间和,空格,区间起点的数值,空格,区间终点的数值.如果有相同的最大区间和,输出靠前的.如果K个数全部为负,最大区间和输出0,区 ...
- java垃圾回收学习
经过一个晚上的努力终于完成了一个文件替换指定字符串的程序,但是由于我要替换的全站程序html文件太多, 所以eclipse下边老是在一个目录结束后报出java.lang.OutOfMemoryErro ...
- Indexed (materialized) views in SQL Server,different with Oracle (materialized) views
Thanks to MS sql could have materialized views ,similar with oracle MVs, using indexed views. what i ...
- html常用整理
视频链接:https://www.bilibili.com/video/av5862916?from=search&seid=12139895566389560177 我的第一个html &l ...
- mysql定时删除当前时间前分钟的数据
mysql定时删除当前时间前分钟的数据 2013-01-31 0个评论 作者:上官车月 收藏 我要投稿 mysql定时删除当前时间前分钟的数据 Sql代码 www.2 ...