「雅礼集训 2017 Day2」解题报告
「雅礼集训 2017 Day2」水箱
我怎么知道这种题目都能构造树形结构。
根据高度构造一棵树,在树上倍增找到最大的小于约束条件高度的隔板,开一个 \(vector\) 记录一下,然后对于每个 \(vector\) 按照高度排序一下,树形 \(dp\) 即可
\(Code\ Below:\)
#include <bits/stdc++.h>
#define pii pair<int,int>
#define mp make_pair
#define F first
#define S second
using namespace std;
const int maxn=200000+10;
int n,m,h[maxn],f[maxn],cnt[maxn],d[maxn],dp[maxn],ch[maxn][2],fa[maxn][18],num;
pii a[maxn];
vector<pii> g[maxn];
inline int read(){
register int x=0,f=1;char ch=getchar();
while(!isdigit(ch)){if(ch=='-')f=-1;ch=getchar();}
while(isdigit(ch)){x=(x<<3)+(x<<1)+ch-'0';ch=getchar();}
return (f==1)?x:-x;
}
int find(int x){
return (x==f[x])?x:f[x]=find(f[x]);
}
int main()
{
int T;
scanf("%d",&T);
while(T--){
memset(h,0,sizeof(h));
memset(ch,0,sizeof(ch));
memset(cnt,0,sizeof(cnt));
memset(d,0,sizeof(d));
memset(dp,0,sizeof(dp));
n=read(),m=read();
for(int i=1;i<=n;i++) f[i]=i;
for(int i=1;i<n;i++) h[i]=a[i].F=read(),a[i].S=i;
sort(a+1,a+n);
int x,y,t;num=n;
for(int i=1;i<n;i++){
x=find(a[i].S),y=find(a[i].S+1);
h[++num]=a[i].F;fa[num][0]=0;ch[num][0]=x;ch[num][1]=y;
f[x]=f[y]=f[num]=fa[x][0]=fa[y][0]=num;
}
for(int j=1;j<18;j++)
for(int i=1;i<=num;i++) fa[i][j]=fa[fa[i][j-1]][j-1];
for(int i=1;i<=num;i++) g[i].clear();
for(int i=1;i<=m;i++){
x=read(),y=read(),t=read();
for(int j=17;j>=0;j--)
if(fa[x][j]&&h[fa[x][j]]<=y) x=fa[x][j];
g[x].push_back(mp(y,t));cnt[x]+=(!t);
}
for(int i=1;i<=num;i++) sort(g[i].begin(),g[i].end());
int val;
for(int i=1;i<=num;i++){
dp[i]=val=d[ch[i][0]]+d[ch[i][1]]+cnt[i];
for(int j=0,k;j<g[i].size();j=k){
for(k=j;g[i][k].F==g[i][j].F&&k<g[i].size();k++) val+=(g[i][k].S?1:-1);
dp[i]=max(dp[i],val);
}
d[i]=val;dp[i]=max(dp[i],dp[ch[i][0]]+dp[ch[i][1]]+cnt[i]);
}
printf("%d\n",dp[num]);
}
return 0;
}
「雅礼集训 2017 Day2」棋盘游戏
同 \([JSOI2009]\) 游戏。
这么难的二分图匹配+博弈怎么才蓝呢???
\(Code\ Below:\)
#include <bits/stdc++.h>
#define id(x,y) (((x)-1)*m+(y))
using namespace std;
const int maxn=100000+10;
int n,m,a[110][110],ans[maxn],match[maxn],vis[maxn],tim,sta[maxn],top;
int head[maxn],to[maxn],nxt[maxn],tot;
int nx[4]={0,0,1,-1},ny[4]={1,-1,0,0};
char s[maxn];
inline void add(int x,int y){
to[++tot]=y;
nxt[tot]=head[x];
head[x]=tot;
}
int dfs1(int x){
for(int i=head[x],y;i;i=nxt[i]){
y=to[i];
if(vis[y]==tim) continue;
vis[y]=tim;
if(!match[y]||dfs1(match[y])){
match[y]=x;
return 1;
}
}
return 0;
}
void dfs2(int x){
ans[x]=1;
for(int i=head[x],y;i;i=nxt[i]){
y=to[i];
if(match[y]&&!ans[match[y]]) dfs2(match[y]);
}
}
int main()
{
scanf("%d%d",&n,&m);
for(int i=1;i<=n;i++){
scanf("%s",s+1);
for(int j=1;j<=m;j++)
if(s[j]=='.') a[i][j]=1;
}
int x,y;
for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++)
if(a[i][j])
for(int k=0;k<4;k++){
x=i+nx[k];y=j+ny[k];
if(x<1||x>n||y<1||y>m) continue;
if(a[x][y]) add(id(i,j),id(x,y)+n*m),add(id(x,y)+n*m,id(i,j));
}
for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++)
if(a[i][j]){
tim++;
if(!dfs1(id(i,j))) sta[++top]=id(i,j);
}
if(!top) puts("0");
else {
for(int i=1;i<=top;i++) dfs2(sta[i]);
top=0;
for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++)
if(ans[id(i,j)]) sta[++top]=id(i,j);
printf("%d\n",top);
for(int i=1;i<=top;i++) printf("%d %d\n",(sta[i]-1)/m+1,(sta[i]-1)%m+1);
}
return 0;
}
「雅礼集训 2017 Day2」线段游戏
李超线段树模板题。
\(Code\ Below:\)
#include <bits/stdc++.h>
#define lson (rt<<1)
#define rson (rt<<1|1)
using namespace std;
const int maxn=1000000+10;
const int lim=1000000;
const double inf=1e8;
int n,m,now[maxn<<3],cnt;
double k[maxn<<3],b[maxn<<3];
inline int read(){
register int x=0,f=1;char ch=getchar();
while(!isdigit(ch)){if(ch=='-')f=-1;ch=getchar();}
while(isdigit(ch)){x=(x<<3)+(x<<1)+ch-'0';ch=getchar();}
return (f==1)?x:-x;
}
double f(int now,int x){
if(!now) return -inf;
return k[now]*x+b[now];
}
void modify(int l,int r,int x,int rt){
int mid=(l+r)>>1;
if(f(now[rt],mid)<f(x,mid)) swap(now[rt],x);
if(l == r) return ;
if(k[now[rt]]>k[x]) modify(l,mid,x,lson);
else modify(mid+1,r,x,rson);
}
void update(int L,int R,int x,int l,int r,int rt){
if(L <= l && r <= R){
modify(l,r,x,rt);
return ;
}
int mid=(l+r)>>1;
if(L <= mid) update(L,R,x,l,mid,lson);
if(R > mid) update(L,R,x,mid+1,r,rson);
}
double query(int x,int l,int r,int rt){
if(l == r) return f(now[rt],x);
int mid=(l+r)>>1;
if(x <= mid) return max(f(now[rt],x),query(x,l,mid,lson));
return max(f(now[rt],x),query(x,mid+1,r,rson));
}
int main()
{
n=read(),m=read();
int op,x0,x1,y1,x2,y2;double ans;
for(int i=1;i<=n;i++){
x1=read(),y1=read(),x2=read(),y2=read();
if(y1>y2) swap(y1,y2),swap(x1,x2);
k[++cnt]=(x1==x2)?0:1.0*(y2-y1)/(x2-x1);
b[cnt]=y2-k[cnt]*x2;
if(x1>x2) swap(x1,x2);
if(x1<=lim&&x2>=1) update(max(1,x1),min(lim,x2),cnt,1,lim,1);
}
for(int i=1;i<=m;i++){
op=read();
if(op==0){
x1=read(),y1=read(),x2=read(),y2=read();
if(y1>y2) swap(y1,y2),swap(x1,x2);
k[++cnt]=(x1==x2)?0:1.0*(y2-y1)/(x2-x1);
b[cnt]=(double)y2-k[cnt]*x2;
if(x1>x2) swap(x1,x2);
if(x1<=lim&&x2>=1) update(max(1,x1),min(lim,x2),cnt,1,lim,1);
}
else {
x0=read();
ans=query(x0,1,lim,1);
if(ans==-inf) puts("0");
else printf("%.2lf\n",ans);
}
}
return 0;
}
「雅礼集训 2017 Day2」解题报告的更多相关文章
- 「雅礼集训 2017 Day1」 解题报告
「雅礼集训 2017 Day1」市场 挺神仙的一题.涉及区间加.区间除.区间最小值和区间和.虽然标算就是暴力,但是复杂度是有保证的. 我们知道如果线段树上的一个结点,\(max=min\) 或者 \( ...
- #6034. 「雅礼集训 2017 Day2」线段游戏 李超树
#6034. 「雅礼集训 2017 Day2」线段游戏 内存限制:256 MiB时间限制:1000 ms标准输入输出 题目类型:传统评测方式:Special Judge 上传者: 匿名 提交提交记录统 ...
- 【loj6034】「雅礼集训 2017 Day2」线段游戏
#6034. 「雅礼集训 2017 Day2」线段游戏 内存限制:256 MiB 时间限制:1000 ms 标准输入输出 题目类型:传统 评测方式:Special Judge 上传者: 匿名 题目描述 ...
- loj#6033. 「雅礼集训 2017 Day2」棋盘游戏(二分图博弈)
题意 链接 Sol 第一次做在二分图上博弈的题..感觉思路真是清奇.. 首先将图黑白染色. 对于某个点,若它一定在最大匹配上,那么Bob必胜.因为Bob可以一直沿着匹配边都,Alice只能走非匹配边. ...
- loj#6032. 「雅礼集训 2017 Day2」水箱(并查集 贪心 扫描线)
题意 链接 Sol 神仙题+神仙做法%%%%%%%% 我再来复述一遍.. 首先按照\(y\)坐标排序,然后维护一个扫描线从低处往高处考虑. 一个连通块的内状态使用两个变量即可维护\(ans\)表示联通 ...
- [LOJ#6033]. 「雅礼集训 2017 Day2」棋盘游戏[二分图博弈、匈牙利算法]
题意 题目链接 分析 二分图博弈经典模型,首先将棋盘二分图染色. 考虑在某个最大匹配中: 如果存在完美匹配则先手必败,因为先手选定的任何一个起点都在完美匹配中,而后手则只需要走这个点的匹配点,然后先手 ...
- LOJ#6032. 「雅礼集训 2017 Day2」水箱
传送门 首先可以有一个平方复杂度的 \(DP\) 设 \(f_{i,j}\) 表示前面 \(i\) 个小格,高度为 \(j\) 的最大答案 令 \(h_i\) 表示隔板 \(i\) 的高度 当 \(j ...
- 「雅礼集训 2017 Day2」水箱
题目链接 题意分析 我们用\(f[i][j]\)表示当前到达第\(i\)个位置水位高度为\(j\)的答案 如果那么\(h[i]\)为\(i\)和\(i+1\)之间的支柱高度 那么如果\(j≤h[i]\ ...
- loj #6032. 「雅礼集训 2017 Day2」水箱 线段树优化DP转移
$ \color{#0066ff}{ 题目描述 }$ 给出一个长度为 \(n\) 宽度为 \(1\) ,高度无限的水箱,有 \(n-1\) 个挡板将其分为 \(n\) 个 \(1 - 1\) 的小格, ...
随机推荐
- spring学习 六 spring与mybatis整合
在mybatis学习中有两种配置文件 :全局配置文件,映射配置文件.mybatis和spring整合,其实就是把mybatis中的全局配置文件的配置内容都变成一个spring容器的一个bean,让sp ...
- linux_修改ip(重启后永久生效)
vi /etc/sysconfig/network-scripts/ifcfg-eth0 DEVICE=eth0 TYPE=Ethernet UUID=a20869f2-4095-4e5d-9b0c- ...
- python第一类对象,闭包,迭代器
一.第一类对象 第一类对象 -> 函数名 -> 变量名 1.特征: 函数对象可以像变量一样进行赋值 还可以作为列表的元素进行使用 还可以作为返回值返回 还可 ...
- logcat命令详解【二】
eclipse 自带的 LogCat 工具太垃圾了, 开始用 adb logcat 在终端查看日志; 1. 解析 adb logcat 的帮助信息 在命令行中输入 adb logcat --help ...
- Latex插图操作
1.竖排插入两张图 \begin{figure}[h] //放在当前位置 \centering \subfigure[A given traffic flow set]{ \includegraphi ...
- IntelliJ IDEA 2017版 SpringBoot测试类编写
SpringBoot的测试类编写Demo 源码见 https://github.com/liushaoye/baseone.git
- 实习番外篇:解决C语言使用Makefile无法实现更好的持续集成问题
工作中遇见的一个问题,提供项目源代码的情况下,希望对项目进行持续集成,达到一个C项目增量编译的效果.原本第一天是想通过模拟Makefile执行步骤来实现整个过程的,但是事实上发现整个Makefile显 ...
- 学以致用一 安装centos7.2虚拟机
5说来惭愧,也是很久没来博客园了.距离上次写的已经快一年,只能说时间过的真的很快. 而如果这一年一直在坚持认真学习的话,收获肯定很多.然而我确又浪费了很多光阴,不得不恨这人生苦短. 在这一年里,小孩还 ...
- 【1】ASP.NET异步(1)
图标说明了异步的基础认识. 1.如果没有Ajax,提交之后整个页会刷新(左图).右图所示的虚线范围区域加入了ajax技术,提交之后只更新了虚线区域的内容,这样看比较直白. <form>①& ...
- 顺序表[A+B->A]
题目:表A 1 3 5,表B 2 4 6,都呈非递减排序,现将两个表合并成一个表,也呈非递减排序,存放在A中(或者B中),言外之意是不能开辟新表!拿出B中数据,沿着A的后面一直往前比较,如果小于就 ...