今天 很不爽 昨天晚上没有睡好觉 大约2点才睡着吧 反正翻来覆去睡不着 不知道为什么可能可行流 或者可行费用流并没有深刻理解 。我不会写 让我心情非常的焦躁。

大凶 顺理成章的被3位强者吊着锤(妈呀我想吊锤他们啊。。

第一题 哇 这不是求两点之间的最短路径么 ? 圆方树直接上啊 。。好像正解不需要但是多了也不多。

然后成功挂掉了 可能心情很烦躁 然后没有多想直接样例过了 丢了没管

犯得 错误是 没有输出0 直接输出换行了 然后 应该输出0再输出换行的 真菜题都没读清。

还有一点是 输出0了没输出换行 真菜这都不知道哎 结果挂掉一堆分数 要不 应该 能得到一个自己满意的成绩 第一题挂彩了。

//#include<bits/stdc++.h>
#include<iomanip>
#include<iostream>
#include<cstdio>
#include<cstring>
#include<string>
#include<queue>
#include<deque>
#include<cmath>
#include<ctime>
#include<cstdlib>
#include<stack>
#include<algorithm>
#include<vector>
#include<cctype>
#include<utility>
#include<set>
#include<bitset>
#include<map>
#define INF 1000000000
#define ll long long
#define min(x,y) ((x)>(y)?(y):(x))
#define max(x,y) ((x)>(y)?(x):(y))
#define RI register ll
#define db double
#define EPS 1e-8
using namespace std;
char buf[<<],*fs,*ft;
inline char getc()
{
return (fs==ft&&(ft=(fs=buf)+fread(buf,,<<,stdin),fs==ft))?:*fs++;
}
inline int read()
{
int x=,f=;char ch=getc();
while(ch<''||ch>''){if(ch=='-')f=-;ch=getc();}
while(ch>=''&&ch<=''){x=x*+ch-'';ch=getc();}
return x*f;
}
const int MAXN=<<,maxn=MAXN<<;
//m<=2n 且双向边 加上方边 空间8倍
int T;
int n,m,num,cnt,top,len,len1,t,h,flag;
int s[maxn],q[maxn],vis[maxn],pre[maxn];
int lin[maxn],ver[maxn],nex[maxn];
int dfn[maxn],low[maxn];
int lin1[maxn],ver1[maxn],nex1[maxn];
inline void add(int x,int y)
{
ver[++len]=y;
nex[len]=lin[x];
lin[x]=len;
}
inline void add1(int x,int y)
{
ver1[++len1]=y;
nex1[len1]=lin1[x];
lin1[x]=len1;
}
inline void tarjan(int x)
{
dfn[x]=low[x]=++num;
s[++top]=x;
for(int i=lin[x];i;i=nex[i])
{
int tn=ver[i];
if(!dfn[tn])
{
tarjan(tn);
low[x]=min(low[x],low[tn]);
if(low[tn]==dfn[x])
{
++cnt;
for(int y=;y!=tn;--top)
{
y=s[top];
add1(cnt,y);
add1(y,cnt);
}
add1(x,cnt);
add1(cnt,x);
}
}
else low[x]=min(low[x],dfn[tn]);
}
}
inline void bfs()
{
t=h=;
memset(vis,,sizeof(vis));
q[++t]=n;s[t]=;
while(h++<t)
{
int x=q[h];vis[x]=;
if(x==)return;
for(int i=lin1[x];i;i=nex1[i])
{
int tn=ver1[i];
if(vis[tn])continue;
pre[tn]=x;q[++t]=tn;
s[t]=s[h]+(tn<=n?:);
}
}
}
int main()
{
//freopen("1.in","r",stdin);
freopen("home.in","r",stdin);
freopen("home.out","w",stdout);
T=read();
while(T--)
{
len=len1=top=num=cnt=flag=;
memset(lin1,,sizeof(lin1));
memset(lin,,sizeof(lin));
memset(dfn,,sizeof(dfn));
n=read();m=read();cnt=n;
for(int i=;i<=m;++i)
{
int x,y;
x=read();y=read();
if(x==y)continue;
add(x,y);add(y,x);
if(x==&&y==n)flag=;
if(y==&&x==n)flag=;
}
tarjan();
if(!dfn[n]||flag){printf("%d\n",);puts("");continue;}
bfs();--s[h];
//cout<<h<<' '<<s[h]<<endl;
printf("%d\n",s[h]);
if(!s[h]){puts("");continue;}
memset(vis,,sizeof(vis));
int x=pre[];
while(x!=n)
{
vis[x]=;
x=pre[x];
}
int last=;
for(int i=;i<n;++i)
if(vis[i])
{
if(last)printf("%d ",last);
last=i;
}
printf("%d\n",last);
}
return ;
}

第二题植物大战僵尸可还行 题目比较 复杂把模型拿出来就比较简单了 注意判环即可。没挂还好。这个不对劲的人终于获得了欣慰。

//#include<bits/stdc++.h>
#include<iomanip>
#include<iostream>
#include<cstdio>
#include<cstring>
#include<string>
#include<queue>
#include<deque>
#include<cmath>
#include<ctime>
#include<cstdlib>
#include<stack>
#include<algorithm>
#include<vector>
#include<cctype>
#include<utility>
#include<set>
#include<bitset>
#include<map>
#define INF 1000000000
#define ll long long
#define min(x,y) ((x)>(y)?(y):(x))
#define max(x,y) ((x)>(y)?(x):(y))
#define RI register ll
#define db double
using namespace std;
char buf[<<],*fs,*ft;
inline char getc()
{
return (fs==ft&&(ft=(fs=buf)+fread(buf,,<<,stdin),fs==ft))?:*fs++;
}
inline int read()
{
int x=,f=;char ch=getc();
while(ch<''||ch>''){if(ch=='-')f=-;ch=getc();}
while(ch>=''&&ch<=''){x=x*+ch-'';ch=getc();}
return x*f;
}
//空间只有64MB
const int MAXN=,maxn=MAXN*MAXN*MAXN*MAXN;
int n,m,cnt,len,t,h,S,T,len1=,sum,maxflow;
int pos[MAXN][MAXN];
int a[MAXN*MAXN],vis[MAXN*MAXN];
int ru[MAXN*MAXN],q[MAXN*MAXN];
int lt[MAXN*MAXN],vt[maxn],nt[maxn];
int lin[MAXN*MAXN],ver[maxn<<],nex[maxn<<],e[maxn<<];
inline void add(int x,int y)
{
vt[++len]=y;nt[len]=lt[x];lt[x]=len;
}
inline void add(int x,int y,int z)
{
ver[++len1]=y;nex[len1]=lin[x];lin[x]=len1;e[len1]=z;
ver[++len1]=x;nex[len1]=lin[y];lin[y]=len1;e[len1]=;
}
inline void topsort()
{
t=h=;
for(int i=;i<=cnt;++i)if(ru[i]==)q[++t]=i;
while(h++<t)
{
int x=q[h];
for(int i=lt[x];i;i=nt[i])
{
int tn=vt[i];
--ru[tn];
add(tn,x,INF);
if(!ru[tn])q[++t]=tn;
}
}
for(int i=;i<=cnt;++i)
{
if(ru[i])continue;
if(a[i]<)add(i,T,-a[i]);
else add(S,i,a[i]),sum+=a[i];
}
}
inline int bfs()
{
memset(vis,,sizeof(vis));
t=h=;q[++t]=S;vis[S]=;
while(h++<t)
{
int x=q[h];
for(int i=lin[x];i;i=nex[i])
{
int tn=ver[i];
if(!e[i]||vis[tn])continue;
vis[tn]=vis[x]+;
q[++t]=tn;
if(tn==T)return ;
}
}
return ;
}
inline int dinic(int x,int flow)
{
if(x==T)return flow;
int rest=flow,k;
for(int i=lin[x];i&&rest;i=nex[i])
{
int tn=ver[i];
if(vis[tn]==vis[x]+&&e[i])
{
k=dinic(tn,min(e[i],rest));
if(!k){vis[tn]=;continue;}
e[i]-=k;e[i^]+=k;rest-=k;
}
}
return flow-rest;
}
int main()
{
//freopen("1.in","r",stdin);
freopen("B.in","r",stdin);
freopen("B.out","w",stdout);
n=read();m=read();
for(int i=;i<=n;++i)
for(int j=;j<=m;++j)pos[i][j]=++cnt;
for(int i=;i<=n;++i)
{
for(int j=;j<=m;++j)
{
a[pos[i][j]]=read();
if(j>)
{
add(pos[i][j],pos[i][j-]);
++ru[pos[i][j-]];
}
int w=read();
for(int k=;k<=w;++k)
{
int x,y;
x=read()+;y=read()+;
++ru[pos[x][y]];
add(pos[i][j],pos[x][y]);
}
}
}
S=cnt+;T=S+;
topsort();
int flow=;
while(bfs())while((flow=dinic(S,INF)))maxflow+=flow;
printf("%d\n",max(,sum-maxflow));
return ;
}

第三题 区间操作 感觉是一流对多流? 好像不太行 仔细发现还是可以差分的变成单点操作 。

发现是一张二分图 我是差分后想到了二分一个值 区间最小值 然后维护整个区间都>=二分这个值即可。

然后乱建边 最后发现好像是个单峰函数 事实上这已经是我的败笔了因为单峰函数一出现三分随之而来 且非常不好写 应该停下 但是我仍然刚了1h 然后最后无奈拿到30分的辛苦分。我服了。

因为根本不需要知道那个最小值是多少 因为第一个值好像没什么卵用。只要后面的数比这个数大就好了二分或者三分这个值意义并不大。

下面说中午我稍微思考了一下想到的正解 真的比较简单 。对于一个差分过后数列来说我想到的是每一个位置上的数字如果小于0的话一定是不和法的我们期望的是将这个序列上的所有数字都>=0这样就好了,

观察+操作 发现l+1 (r+1)-1 这样 r如果是正数 其实就是负数向正数要1 显然正数和负数形成了二分图 具体做法就是这样。显然对于一个负数是拥有下界 全部连向源点下界成功被转换了。

再跑费用流即可。

//#include<bits/stdc++.h>
#include<iomanip>
#include<iostream>
#include<cstdio>
#include<cstring>
#include<string>
#include<queue>
#include<deque>
#include<cmath>
#include<ctime>
#include<cstdlib>
#include<stack>
#include<algorithm>
#include<vector>
#include<cctype>
#include<utility>
#include<set>
#include<bitset>
#include<map>
#define INF 1000000000
#define ll long long
#define min(x,y) ((x)>(y)?(y):(x))
#define max(x,y) ((x)>(y)?(x):(y))
#define RI register ll
#define db double
#define EPS 1e-8
using namespace std;
char buf[<<],*fs,*ft;
inline char getc()
{
return (fs==ft&&(ft=(fs=buf)+fread(buf,,<<,stdin),fs==ft))?:*fs++;
}
inline ll read()
{
ll x=,f=;char ch=getc();
while(ch<''||ch>''){if(ch=='-')f=-;ch=getc();}
while(ch>=''&&ch<=''){x=x*+ch-'';ch=getc();}
return x*f;
}
const ll MAXN=,maxn=MAXN*MAXN<<;
ll n,m,minn=INF,maxx,S,T,T1,len=,h,t1,p;
ll a[MAXN],b[MAXN];
ll pre[MAXN],in[MAXN],vis[MAXN],q[maxn<<],dis[maxn];
ll lin[MAXN],ver[maxn<<],nex[maxn<<],e[maxn<<],e1[maxn<<];
struct wy
{
ll op,l,c;
}t[MAXN];
inline void add(ll x,ll y,ll z,ll z1)
{
ver[++len]=y;nex[len]=lin[x];lin[x]=len;e[len]=z;e1[len]=z1;
ver[++len]=x;nex[len]=lin[y];lin[y]=len;e[len]=;e1[len]=-z1;
}
inline ll spfa()
{
for(ll i=;i<=T;++i)dis[i]=INF;
h=t1=;
dis[S]=;vis[S]=;in[S]=INF;q[++t1]=S;
while(h++<t1)
{
ll x=q[h];vis[x]=;
for(ll i=lin[x];i;i=nex[i])
{
ll tn=ver[i];
if(!e[i])continue;
if(dis[tn]>dis[x]+e1[i])
{
dis[tn]=dis[x]+e1[i];
in[tn]=min(in[x],e[i]);
pre[tn]=i;
if(!vis[tn])q[++t1]=tn,vis[tn]=;
}
}
}
return dis[T]!=INF;
}
inline ll EK()
{
ll maxflow=,sum=;
while(spfa())
{
ll x=T,i=pre[x];
sum+=dis[x]*in[T];
maxflow+=in[T];
while(x!=S)
{
e[i]-=in[T];
e[i^]+=in[T];
x=ver[i^];i=pre[x];
}
}
if(maxflow!=p)return -;
return sum;
}
int main()
{
//freopen("1.in","r",stdin);
freopen("seq.in","r",stdin);
freopen("seq.out","w",stdout);
n=read();m=read();T1=n+;S=T1+;T=S+;
for(ll i=;i<=n;++i)a[i]=read();
for(ll i=;i<=m;++i)
{
char op;ll x,y;
op=getc();
while(op==' '||op=='\n')op=getc();
x=read();y=read();
t[i]=(wy){op=='-'?:,x,y};
}
if(n==){printf("%d\n",);return ;}
for(ll i=;i<=n;++i)b[i]=a[i]-a[i-];
b[T1]=INF;
for(ll i=;i<=n+;++i)
{
if(b[i]>)add(i,T,b[i],);
else add(S,i,-b[i],),p+=-b[i];
}
add(,T,INF,);
for(ll i=;i<=n;++i)
for(ll j=;j<=m;++j)
{
if(t[j].op)
{
ll l=i,r=i+t[j].l;
if(r>T1)continue;
add(l,r,INF,t[j].c);
}
else
{
ll l=i,r=l+t[j].l;
if(r>T1)continue;
add(r,l,INF,t[j].c);
}
}
printf("%lld\n",EK());
return ;
}

GG 总有一天我将会AK的 (突然WN附体嘻嘻。

2019 7 8 HL 模拟赛的更多相关文章

  1. 『2019/4/9 TGDay2模拟赛 反思与总结』

    2019/4/9 TGDay2模拟赛 今天是\(TG\)模拟赛的第二天了,试题难度也是相应地增加了一些,老师也说过,这就是提高组的难度了.刚开始学难的内容,一道正解也没想出来,不过基本的思路也都是对了 ...

  2. 『2019/4/8 TGDay1模拟赛 反思与总结』

    2019/4/8 TGDay1模拟赛 这次是和高一的学长学姐们一起参加的\(TG\)模拟考,虽然说是\(Day1\),但是难度还是很大的,感觉比\(18\)年的\(Day1\)难多了. 还是看一下试题 ...

  3. 2019.7.26 NOIP 模拟赛

    这次模拟赛真的,,卡常赛. The solution of T1: std是打表,,考场上sb想自己改进匈牙利然后wei了(好像匈牙利是错的. 大力剪枝搜索.代码不放了. 这是什么神仙D1T1,爆蛋T ...

  4. 2019.03.19 ZJOI2019模拟赛 解题报告

    得分: \(100+10+45=155\)(\(T1\)又是水题,\(T2\)写暴力,\(T3\)大力\(STL\)乱搞) \(T1\):哈夫曼树 首先,根据题目中给出的式子,可以发现,我们要求的其实 ...

  5. 2019.03.13 ZJOI2019模拟赛 解题报告

    得分: \(55+12+10=77\)(\(T1\)误认为有可二分性,\(T2\)不小心把\(n\)开了\(char\),\(T3\)直接\(puts("0")\)水\(10\)分 ...

  6. 2019.03.14 ZJOI2019模拟赛 解题报告

    得分: \(100+100+0=200\)(\(T1\)在最后\(2\)分钟写了出来,\(T2\)在最后\(10\)分钟写了出来,反而\(T3\)写了\(4\)个小时爆\(0\)) \(T1\):风王 ...

  7. 2019.03.15 ZJOI2019模拟赛 解题报告

    得分: \(20+45+15=80\)(三题暴力全写挂...) \(T1\):Lyk Love painting 首先,不难想到二分答案然后\(DP\)验证. 设当前需验证的答案为\(x\),则一个暴 ...

  8. 2019.03.16 ZJOI2019模拟赛 解题报告

    得分: \(100+27+20=147\)(\(T1\)巨水,\(T2,T3\)只能写暴力分) \(T1\):深邃 比较套路的一眼题,显然是一个二分+贪心,感觉就是\(NOIP2018Day1T3\) ...

  9. 【2019.8.15 慈溪模拟赛 T1】插头(plugin)(二分+贪心)

    二分 首先,可以发现,最后的答案显然满足可二分性,因此我们可以二分答案. 然后,我们只要贪心,就可以验证了. 贪心 不难发现,肯定会优先选择能提供更多插座的排插,且在确定充电器个数的情况下,肯定选择能 ...

随机推荐

  1. 前端性能优化_css加载会造成哪些阻塞现象?

    css的加载是不会阻塞DOM的解析,但是会阻塞DOM的渲染,会阻塞link后面js语句的执行.这是由于浏览器为了防止html页面的重复渲染而降低性能,所以浏览器只会在加载的时候去解析dom树,然后等在 ...

  2. CSS-界面滚动时不显示滚动条

    设置滚动条的样式: div::-webkit-scrollbar { width: ; }   关于::-webkit-scrollbar ::-webkit-scrollbar CSS伪类选择器影响 ...

  3. sql语句-CASE WHEN用法详解

    当我们需要从数据源上 直接判断数据显示代表的含义的时候 ,就可以在SQL语句中使用 Case When这个函数了. Case具有两种格式.简单Case函数和Case搜索函数. 第一种 格式 : 简单C ...

  4. Redis 6.0 redis-cluster-proxy 说明

    背景 Redis3.0版本之后开始支持了Redis Cluster,Redis也开始有了分布式缓存的概念.关于Redis Cluster的相关说明,可以看之前的几篇文章:Redis Cluster 原 ...

  5. ::before 和 :after 中双冒号和单冒号有什么区别?

    在 CSS 中伪类一直用 : 表示,如 :hover, :active 等 伪元素在CSS1中已存在,当时语法是用 : 表示,如 :before 和 :after 后来在CSS3中修订,伪元素用 :: ...

  6. Mysql基础(七):数据库总结

    目录 MySQL数据库06 /数据库总结 1. 数据库/DBMS 2. 数据库分类 3. 修改密码 4. 库操作 5. 表操作 6. 存储引擎 7. 事务 8. 约束 9. 数据类型 10. 单表语句 ...

  7. java 基本语法(十二) 数组(五)Arrays工具类的使用

    1.理解:① 定义在java.util包下.② Arrays:提供了很多操作数组的方法. 2.使用: //1.boolean equals(int[] a,int[] b):判断两个数组是否相等. i ...

  8. ASP.NET Core策略授权和 ABP 授权

    目录 ASP.NET Core 中的策略授权 策略 定义一个 Controller 设定权限 定义策略 存储用户信息 标记访问权限 认证:Token 凭据 颁发登录凭据 自定义授权 IAuthoriz ...

  9. Java8——方法引用

    方法引用就是通过类名或方法名引用已经存在的方法来简化lambda表达式.那么什么时候需要用方法引用呢?如果lamdba体中的内容已经有方法实现了,我们就可以使用方法引用. 一.方法引用的三种语法格式 ...

  10. OSCP Learning Notes - WebApp Exploitation(5)

    Remote File Inclusion[RFI] Prepare: Download the DVWA from the following website and deploy it on yo ...