只有部分题解

练习赛

T2

自然还是要简单考虑了

0~n-1的排列,考虑相对的大小

我们先考虑对于前三个:a,b,c

询问a,b,询问b,c,再询问a,b,c

发现,如果三个知道两个,那么第三个可以唯一确定

所以分情况讨论一下:

1.a>b,不妨钦定a=n-1,然后得到a,b,c的值,再询问(c,d),(b,c,d)。。。就可以得到所有的值

2.a<b,不妨钦定a=0,然后得到a,b,c的值,再询问(c,d),(b,c,d)。。。就可以得到所有的值

这里,由于a的值是钦定的,可能得到某个值是负数或者是大于n-1的,那么可以整体上下平移,得到最后的序列

最后的序列中,只要满足0在n-1左边,并且是一个0~n-1的排列,那么就是答案(显然只有一个)

T3

可以说是经典的冒泡排序问题!

自然要抓住本质

我们考虑对于一个ai,它归位的次数就是它前面比它大的数的个数f[i]

证明:前面比它大的数,一次最多沉底一个,然而对于自己往后沉,在后面的bi前比bi小的数那里会考虑到的

所以就是max(f[i])

修改怎么办?

树套树!

两个logn成功T飞

发现,如果i<j并且ai>aj,那么f[i]一定小于f[j],这样的i是没有用的

把刚才的定义变一下:

然后动态开点权值线段树维护即可(离线离散化也可以不动态开点)

T4

更优用bfs O(n^2)判断(反正提交答案)

Day1

T1

首先,首字母只有一次

询问AB,如果长度>=1,就是A或者B,再问一次。否则是X或者Y,再问一次。——2次

后面怎么办?

这个长度不超过4n有点意思

首先一定要满足前缀是S,所以确定的前i-1位必须都有

看来要复制4份,不妨首字母是A

暴力枚举下一个:[A....BX][A....BY][A.....BB][A....X]

由于首字母只有一次,得到的一定是四个子串的最大匹配长度

如果多了2,就是B;多了1,就是X;不变,就是Y

1次确定一位。

最后一个,需要2次确定,尝试X,再尝试Y。

总共:2+(n-2)+2=n+2次

T2

贴课件:

(这个暂时不懂怎么找那H+W个矩形)

联通块的转化,然后利用点数-边数最少是1,所以维护最小值和最小值个数即可

联通块的转化很神仙啊

启示我们,对于一些不好处理的东西,我们提取特征值记录

这里还利用了最小是1,而1恰好是合法的这一个trick

具体实现的话:

每次把原来的贡献减掉,新来的再加上

[IOI2018] seats 排座位

T3

kruscal重构树石锤了

把边权看成min(idx,idy)(最大生成树)或者max(idx,idy)(最小生成树)

就是判断两个kruscal重构树对应的子树,有没有交点即可

考虑把每个端点看成二维平面上的一个点,横坐标是第一个重构树的位置编号,纵坐标是第二个重构树位置的编号

有无交点,就是统计(l1,l2,r1,r2)这个矩形中有没有点

二维数点问题

离线扫描线+树状数组解决

扫描线 · 二维数点问题及其应用

(ps:强制在线的话可以用主席树)

代码:

[IOI2018] werewolf 狼人

#include<bits/stdc++.h>
#define reg register int
#define il inline
#define numb (ch^'0')
using namespace std;
typedef long long ll;
il void rd(int &x){
char ch;x=;bool fl=false;
while(!isdigit(ch=getchar()))(ch=='-')&&(fl=true);
for(x=numb;isdigit(ch=getchar());x=x*+numb);
(fl==true)&&(x=-x);
}
namespace Miracle{
const int M=+;
const int N=+;
const int inf=0x3f3f3f3f;
int n,m,Q;
struct edge{
int x,y;
int val;
}b[M];
bool cmp0(edge a,edge b){
return a.val<b.val;
}
bool cmp1(edge a,edge b){
return a.val>b.val;
}
int fafa[*N]; struct kruskal{
struct node{
int nxt,to;
}e[*N];
int hd[*N],cnt;
int fin(int x){
return fafa[x]==x?x:fafa[x]=fin(fafa[x]);
}
void add(int x,int y){
e[++cnt].nxt=hd[x];
e[cnt].to=y;
hd[x]=cnt;
}
int tot;
void build(int typ){
for(reg i=;i<=n;++i){
if(typ) val[i]=inf;
else val[i]=-inf;
}
tot=n;
for(reg i=;i<=m;++i){
int k1=fin(b[i].x),k2=fin(b[i].y);
// cout<<" edge "<<b[i].x<<" "<<b[i].y<<" :: "<<k1<<" "<<k2<<endl;
if(k1!=k2){
++tot;
fafa[tot]=tot;
fafa[k1]=tot;
fafa[k2]=tot;
val[tot]=b[i].val;
add(tot,k1);
add(tot,k2);
}
}
}
int l[N],r[N];
int val[N];
int fa[N][];
int df;
void dfs(int x){
// cout<<" xx "<<x<<endl;
int son=;
r[x]=-inf;l[x]=inf;
for(reg i=hd[x];i;i=e[i].nxt){
int y=e[i].to;
++son;
dfs(y);
fa[y][]=x;
r[x]=max(r[x],r[y]);
l[x]=min(l[x],l[y]);
}
if(!son){
l[x]=r[x]=++df;
}
}
void pre(){
dfs(tot);
for(reg j=;j<=;++j){
for(reg i=;i<=tot;++i){
fa[i][j]=fa[fa[i][j-]][j-];
}
}
}
int fin(int x,int lim,int typ){//beizeng go val
int p=x;
if(!typ){//go <=lim
for(reg j=;j>=;--j){
if(fa[p][j]){
if(val[fa[p][j]]<=lim) p=fa[p][j];
}
}
return p;
}else{//go >=lim
for(reg j=;j>=;--j){
if(fa[p][j]){
if(val[fa[p][j]]>=lim) p=fa[p][j];
}
}
return p;
}
}
}kt[];//0:min tree;1:max tree; int num;
struct po{
int x,y;
bool friend operator <(po a,po b){
return a.x<b.x;
}
}p[N];
int ans[N]; int tot;
struct que{
int id,x,typ,y1,y2;
bool friend operator <(que a,que b){
return a.x<b.x;
}
}q[N*]; struct binarytree{
int f[N];
void upda(int x){
for(;x<=n;x+=x&(-x)) f[x]++;
}
int query(int x){
int ret=;
for(;x;x-=x&(-x)) ret+=f[x];
return ret;
}
}t;
int main(){
rd(n);rd(m);rd(Q);
for(reg i=;i<=m;++i){
rd(b[i].x);rd(b[i].y); ++b[i].x;++b[i].y;//warning!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! b[i].val=max(b[i].x,b[i].y);
}
sort(b+,b+m+,cmp0);
for(reg i=;i<=*n;++i){
fafa[i]=i;
}
kt[].build(); kt[].pre();
// cout<<" after build small "<<endl;
for(reg i=;i<=m;++i){
b[i].val=min(b[i].x,b[i].y);
}
sort(b+,b+m+,cmp1);
for(reg i=;i<=*n;++i){
fafa[i]=i;
}
kt[].build();
kt[].pre(); int st,nd,L,R;
for(reg i=;i<=Q;++i){
rd(st);rd(nd);rd(L);rd(R);
++L;++R;
++st;++nd;//warning!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! int ptr=kt[].fin(st,L,);
q[++tot].id=i;
q[tot].y1=kt[].l[ptr];
q[tot].y2=kt[].r[ptr]; q[++tot].id=i;
q[tot].y1=kt[].l[ptr];
q[tot].y2=kt[].r[ptr]; ptr=kt[].fin(nd,R,);
q[tot-].x=kt[].l[ptr]-;
q[tot].x=kt[].r[ptr]; q[tot-].typ=-;
q[tot].typ=;
}
sort(q+,q+tot+); for(reg i=;i<=n;++i){
p[i].x=kt[].l[i];
p[i].y=kt[].l[i];
}
sort(p+,p+n+); int ptp=,ptq=;
for(reg i=;i<=n;++i){
while(ptp<=n&&p[ptp].x<i) ++ptp;
if(p[ptp].x==i){
while(ptp<=n&&p[ptp].x==i){
t.upda(p[ptp].y);
++ptp;
}
} while(ptq<=tot&&q[ptq].x<i) ++ptq;
if(q[ptq].x==i){
while(ptq<=tot&&q[ptq].x==i){
ans[q[ptq].id]+=q[ptq].typ*(t.query(q[ptq].y2)-t.query(q[ptq].y1-));
++ptq;
}
}
} for(reg i=;i<=Q;++i){
puts(ans[i]?"":"");
}
return ;
} }
signed main(){
Miracle::main();
return ;
} /*
Author: *Miracle*
Date: 2019/2/10 15:50:00
*/

IOI2018题解的更多相关文章

  1. [IOI2018] seats 排座位

    [IOI2018] seats 排座位 IOI2018题解 压缩状态思想很不错的 每次把原来的贡献减掉,新来的再加上 最多涉及10个点 注意: 1.去重 2.下标从0开始 3.线段树初始的最小值个数都 ...

  2. [IOI2018] werewolf 狼人

    [IOI2018] werewolf 狼人 IOI2018题解 (其实原题强制在线,要用主席树) 代码: 注意: 1.下标从0~n-1 2.kruskal重构树开始有n个节点,tot从n开始,++to ...

  3. 题解 洛谷 P4899 【[IOI2018] werewolf 狼人】

    先考虑狼形,其只能走编号小于\(R\)的点.若将每条边赋边权为其两端点编号的较大值,然后按最小生成树的顺序构建\(Kruskal\)重构树. 那么从原图的一个点\(x\)在树上倍增,到达满足要求且深度 ...

  4. 简单数据结构题(from 钟子谦——IOI2018集训队自选题)

    简单数据结构题(from 钟子谦--IOI2018集训队自选题) 试题描述 给一棵 \(n\) 个点的树,点权开始为 \(0\) ,有 \(q\) 次操作,每次操作是选择一个点,把周围一圈点点权 \( ...

  5. 【WC2019笔记】IOI2018 / ACM题目选讲

    哇!济南的 rqy 大佬讲课!就是 $luogu$ 上有名的那位! 上面这句话写错了,请大家无视 XylophoneIOI2018 练习赛 T2题意:交互提有一个 $0\sim n-1$ 的排列,保证 ...

  6. 2016 华南师大ACM校赛 SCNUCPC 非官方题解

    我要举报本次校赛出题人的消极出题!!! 官方题解请戳:http://3.scnuacm2015.sinaapp.com/?p=89(其实就是一堆代码没有题解) A. 树链剖分数据结构板题 题目大意:我 ...

  7. noip2016十连测题解

    以下代码为了阅读方便,省去以下头文件: #include <iostream> #include <stdio.h> #include <math.h> #incl ...

  8. BZOJ-2561-最小生成树 题解(最小割)

    2561: 最小生成树(题解) Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 1628  Solved: 786 传送门:http://www.lyd ...

  9. Codeforces Round #353 (Div. 2) ABCDE 题解 python

    Problems     # Name     A Infinite Sequence standard input/output 1 s, 256 MB    x3509 B Restoring P ...

随机推荐

  1. iterms 快捷键

    标签 新建标签:command + t 关闭标签:command + w 切换标签:command + 数字 command + 左右方向键 切换全屏:command + enter 查找:comma ...

  2. Luogu P2055 [ZJOI2009]假期的宿舍

    一道网络有关的问题,还是一句话 网络流重在建模! 这里主要讲两种算法. 1.二分图匹配: 分析题意,我们可以知道题目要求是让所有留在学校的人都能有床睡 而 所有留在学校的人=本校不回家的人+外校的人: ...

  3. 阿里云centos系统中配置mysql,并远程连接到本地的navicat

    1.直接使用yum命令下载mysql5.6来进行安装是不能成功的,安装过程会有问题,这里我们需要使用rpm命令来先进下载.下载路径为:http://dev.mysql.com/get/mysql-co ...

  4. CS50.1

    1,GUI,graphical user interface,图形用户界面 2.VB,visual basic,微软开发的一种程序语言 3,BIT,binary digit 比特 4,byte 5,8 ...

  5. [JOI2017春季合宿]Port Facility[set、二分图]

    题意 你有两个栈,有 \(n\) 个货物,每个货物有一个进栈时间和出栈时间(所有时间的并集是1~2n),问有多少种不同的入栈方案. \(n\le 10^6\) 分析 把每个货物的存在看成区间,相交的区 ...

  6. 【ORACLE】oracle数据库用户密码复杂度配置

    -- 设置密码复杂度 SQL> @ /u01/app/oracle/product/11.2.0/db_1/rdbms/admin/utlpwdmg.sql -- 测试 SQL> alte ...

  7. 一次VB汇编中看-溢出计算

    图文记录 一.观察程序特点和运行逻辑 带弹窗 是VB开发的 需要用户名和注册码 有弹框 具备了很简单的特点…… 错误弹框,如图 二.定位 弹窗内容入手,搜索关键字定位到关键跳,nop掉或者je改jne ...

  8. ecCodes 学习 利用ecCodes fortran90 api对GRIB文件进行读写

    参考 https://www.ecmwf.int/assets/elearning/eccodes/eccodes2/story_html5.htmlhttps://confluence.ecmwf. ...

  9. python之GIL理解

    GIL(Global Interpreter Lock) 全局解释器锁 python3中是假的多线程,它不是真正的并行,是利用了cpu上下文的切换而已.同一时间只能有一个线程使用共享数据,其它线程处于 ...

  10. python 爬虫学习之路

    2016-6-18 --今天实现了第一个用urllib2实现的爬虫程序. --过程中发现 req = urllib2.Request(url,headers = headers) 总是报错: 主要原因 ...