21.7.31 test
\(NOIP\) 测试
好久没有这种感觉能阿克的冲动了!但还是挂了分
T1 WOJ2608(模拟,拓扑排序)
签到题,直接模拟,有点像拓扑排序。
要给点打标记不然可能被某次操作中弹出多次该点导致WA \(\color{red}{100\rightarrow50}\)
code:
#include<bits/stdc++.h>
using namespace std;
#define int long long
inline int read(){
int p=0,f=1;
char c=getchar();
while(c>'9'||c<'0'){if(c=='0')f=-1;c=getchar();}
while(c>='0'&&c<='9'){p=p*10+c-'0';c=getchar();}
return p*f;
}
const int N=1000005;
const int G=250005;
int n,g;
struct edge{
int v,next;
}e[N+G];
int head[N+G],en;
int in[N+G];
int sum[N+G];
void insert(int u,int v){
e[++en].v=v;
e[en].next=head[u];
head[u]=en;
}
int ans=1;
queue<int> q;
int vis[N+G];
signed main(){
//freopen("a.in","r",stdin);
//freopen("a.out","w",stdout);
n=read(),g=read();
for(int i=1;i<=g;i++){
int t=read();
for(int j=1;j<=t;j++){
int u=read();
insert(u,n+i);
in[n+i]++;
sum[n+i]^=u;
}
}
for(int i=head[1];i;i=e[i].next)
in[e[i].v]--,sum[e[i].v]^=1;
for(int i=1;i<=g;i++)
if(in[n+i]==1)q.push(n+i);
while(!q.empty()){
int now=q.front();q.pop();
int u=sum[now];ans++;
for(int i=head[u];i;i=e[i].next){
in[e[i].v]--,sum[e[i].v]^=u;
if(in[e[i].v]==1&&!vis[sum[e[i].v]]){
vis[sum[e[i].v]]=1;
q.push(e[i].v);
}
}
}
cout<<ans;
return 0;
}
T2 WOJ2970(背包dp)
一眼以为只有两类动物反手打了个exgcd
两个点之间声音的大小差距只有-1或某个非负数。注意到``每个点发出的声音音量<=10^5`,所以可以\(O(m*1e5)\) 预处理出每种音量最小的动物数,然后 \(O(n)\) 走一遍就行力。\(\color{green}{100}\)
code:
#include<bits/stdc++.h>
using namespace std;
#define int long long
#define in read()
inline int read(){
int p=0,f=1;
char c=getchar();
while(c>'9'||c<'0'){if(c=='0')f=-1;c=getchar();}
while(c>='0'&&c<='9'){p=p*10+c-'0';c=getchar();}
return p*f;
}
const int V=1e5+5;
int n,m;
int v[25],l[105];
int p[V];
inline void makep(){
memset(p,127,sizeof(p));
p[0]=0;
for(int i=1;i<=100000;i++){
for(int j=1;j<=m;j++){
if(i-v[j]<0)break;
p[i]=min(p[i],p[i-v[j]]+1);
}
}
}
int ans;
signed main(){
freopen("b.in","r",stdin);
freopen("b.out","w",stdout);
n=read(),m=read();
for(int i=1;i<=m;i++)
v[i]=read();
for(int i=1;i<=n;i++)
l[i]=read();
sort(v+1,v+1+m);
makep();
if(p[l[1]]==p[V-1]){
cout<<-1;return 0;
}
ans+=p[l[1]];
for(int i=2;i<=n;i++){
int temp=max(0LL,l[i-1]-1);
if(temp==l[i])continue;
if(p[l[i]-temp]==p[V-1]){
cout<<-1;return 0;
}
ans+=p[l[i]-temp];
}
cout<<ans;
return 0;
}
T3 WOJ3766(分层图,最短路)
注意到边权非负,考虑 dijkstra 跑最短路,加上一个剩余复活机会的状态k,取到k<0时continue,其他的和 dijkstra 差不多。手写了一个结构体方便用优先队列。思想其实和分层图类似,或者说我间接写出了分层图的一种实现
另外,此题有20分zz数据,走到n节点时刚好死亡是会记入答案的。\(\color{red}{100\rightarrow80}\)
code:
#include<bits/stdc++.h>
using namespace std;
#define int long long
#define in read()
inline int read(){
int p=0,f=1;
char c=getchar();
while(c>'9'||c<'0'){if(c=='0')f=-1;c=getchar();}
while(c>='0'&&c<='9'){p=p*10+c-'0';c=getchar();}
return p*f;
}
int n,m,k;
const int N=805;
const int M=4005;
const int K=15;
struct edge{
int v,w,next;
}e[2*M];
int head[N],en;
void insert(int u,int v,int w){
e[++en].v=v;
e[en].w=w;
e[en].next=head[u];
head[u]=en;
}
void add(int u,int v,int w){
insert(u,v,w);
insert(v,u,w);
}
int cas[N];
int vis[N][K];
struct nod{
int dis,u,k;
};
bool operator<(const nod &a,const nod &b){
return a.dis<b.dis;
}
priority_queue<nod>q;
int dijkstra(){
nod temp;
temp.dis=0LL;
temp.u=1;
temp.k=k-cas[1];
q.push(temp);
while(!q.empty()){
int tw=-q.top().dis,u=q.top().u,tk=q.top().k;q.pop();
//cout<<tw<<" "<<u<<" "<<tk<<endl;
if(u==n)return tw;
if(tk<0||vis[u][tk])continue;
vis[u][tk]=1;
for(int i=head[u];i;i=e[i].next){
int v=e[i].v,w=e[i].w;
temp.dis=-(tw+w);
temp.u=v;
temp.k=tk-cas[v];
q.push(temp);
}
}
return -1;
}
signed main(){
//freopen("c.in","r",stdin);
//freopen("c.out","w",stdout);
n=in,m=in,k=in;
for(int i=1;i<=n;i++)
cas[i]=in;
for(int i=1;i<=m;i++){
int u=in,v=in,w=in;
add(u,v,w);
}
cout<<dijkstra();
return 0;
}
T4 WOJ4639(区间dp)
题解的状压dp我是真没听懂
注意到M很小,所以刚开始想的是一行一行转移,但想了几种策略都被自行hack了,所以放弃一行一行做。考虑到将原图分割再合并答案,于是我们设 \(dp(x,y,p,q)\) 为原图中 \((x,y)\) 为左上角,\((p,q)\) 为右下角的部分的最少分割所需矩形。
按横向切割,\(dp(x,y,p,q)=\min(dp(x,y,k,q)+dp(k+1,y,p,q))\),\(x\leq k<p\)
按纵向切割,\(dp(x,y,p,q)=\min(dp(x,y,p,k)+dp(x,k+1,p,q))\),\(y\leq k<q\)
边界条件为该部分原图内全是1返回1或者全是0返回0,这部分可以写个二维前缀和方便判断。
状态数是\(n^2m^2\),用了记搜之后时间复杂度应该也是 \(O(n^2m^2)\).
个人认为记忆化搜索就是反向的dp,所以这题就是区间dp \(\color{green}{100}\)
code:
#include<bits/stdc++.h>
using namespace std;
#define int long long
#define in read()
inline int read(){
int p=0,f=1;
char c=getchar();
while(c>'9'||c<'0'){if(c=='0')f=-1;c=getchar();}
while(c>='0'&&c<='9'){p=p*10+c-'0';c=getchar();}
return p*f;
}
int n,m;
int a[105][10];
int sum[105][10];
int getsum(int x,int y,int p,int q){
return sum[p][q]-sum[p][y-1]-sum[x-1][q]+sum[x-1][y-1];
}
int ans[105][10][105][10];
int dfs(int x,int y,int p,int q){
if(ans[x][y][p][q])return ans[x][y][p][q];
if(getsum(x,y,p,q)==(p-x+1)*(q-y+1))return ans[x][y][p][q]=1;
if(getsum(x,y,p,q)==0)return 0;
int res=0x7fffffffffffffff;
for(int i=x;i<p;i++)
res=min(res,dfs(x,y,i,q)+dfs(i+1,y,p,q));
for(int i=y;i<q;i++)
res=min(res,dfs(x,y,p,i)+dfs(x,i+1,p,q));
return ans[x][y][p][q]=res;
}
signed main(){
freopen("d.in","r",stdin);
freopen("d.out","w",stdout);
n=in,m=in;
for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++){
a[i][j]=in;
sum[i][j]=sum[i-1][j]+sum[i][j-1]-sum[i-1][j-1]+a[i][j];
}
cout<<dfs(1,1,n,m);
return 0;
}
题目还是比较简单。
窝被 dty 单调队列力。
21.7.31 test的更多相关文章
- MySQL开启binlog无法启动ct 10 21:27:31 postfix/pickup[4801]: warning: 6BD991A0039: message has been queue
1 详细异常 ct 10 21:27:31 postfix/pickup[4801]: warning: 6BD991A0039: message has been queue Oct 10 21:2 ...
- Cheatsheet: 2013 07.21 ~ 07.31
Mobile Android vs. iOS: Comparing the Development Process of the GQueues Mobile Apps Android Studio ...
- Asp.NetCore源码学习[2-1]:配置[Configuration]
Asp.NetCore源码学习[2-1]:配置[Configuration] 在Asp. NetCore中,配置系统支持不同的配置源(文件.环境变量等),虽然有多种的配置源,但是最终提供给系统使用的只 ...
- linux基础:第三关课前考试题整理
1.如何取得/etc/hosts 文件的权限对应的数字内容,如-rw-r--r-- 为 644, 要求使用命令取得644 这样的数字. [root@server ~]# stat /etc/hosts ...
- 【CentOS】LAMP
文章需要整合,学习需要归纳,博主把一连四篇的LAMP合并成为一片长篇的大部头,并梳理了一下他们的关系,希望对各位有所帮助 最近一次更新:2016年12月21日21:38:31 本文为博主JerryCh ...
- SQL Server编程入门
SQL编程要比Java编程.C#编程简单许多,下面我们直接讲干货21:04:31 使用变量 局部变量 在T-SQL中,局部变量的名称必须以标记@作为前缀.T-SQL的局部变量其实和Java中的局部变量 ...
- Linux 计划任务
实例: 每5分钟定时访问一个url # crontab -e #*/5 * * * * /usr/bin/curl http://aa.com:8080/tools/sitemap.php >& ...
- ISO8583报文协议
最开始时,金融系统只有IBM这些大的公司来提供设备,象各种主机与终端等.在各个计算机设备之间,需要交换数据.我们知道数据是通过网络来传送的,而在网络上传送的数据都是基于0或1这样的二进制数据,如果没有 ...
- linux定时任务的设置 crontab 配置指南
为当前用户创建cron服务 1. 键入 crontab -e 编辑crontab服务文件 例如 文件内容如下: */2 * * * * /bin/sh /home/admin/jiaoben/bu ...
随机推荐
- Mybatis公司开发常用!
Mybatis核心 本文重点:注解开发,mybatis多表操作,动态SQL(WHERE,SET,IF,SQL-ID减少复用) 代码地址--https://gitee.com/zhangjzm/my-b ...
- RocketMQ详解(三)启动运行原理
专题目录 RocketMQ详解(一)原理概览 RocketMQ详解(二)安装使用详解 RocketMQ详解(三)启动运行原理 RocketMQ详解(四)核心设计原理 RocketMQ详解(五)总结提高 ...
- 机器学习——Adaboost
1 Adaboost 的提出 1990年,Schapire最先构造出一种多项式级的算法,即最初的Boost算法; 1993年,Drunker和Schapire第一次将神经网络作为弱学习器,应用Boos ...
- Docker安装flink及避坑指南
Docker安装flink 导航 无处不在的大数据 安装flink 拉取flink镜像 编写docker-compose.yml 生成启动 查看安装效果 常见坑及解决方案 问题1 问题2 参考 本 ...
- js复制功能代码
js复制代码: http://www.clipboardjs.cn/
- Jmeter线程组设置
添加线程组:右键测试计划->添加->Threads->线程组 左侧树形标签栏中,显示标签信息. 选中线程组,右侧内容栏中显示线程组的相关信息. 名称:可以给线程组设置一个个性化的命名 ...
- Win10删除电脑3D对象等7个文件夹
把下面几个注册表项依次删除掉 "图片"文件夹:[-HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Expl ...
- Gaussion
# Kernel density estimation import numpy as np import matplotlib.pyplot as plt from scipy.stats impo ...
- 如何借助 JuiceFS 为 AI 模型训练提速 7 倍
背景 海量且优质的数据集是一个好的 AI 模型的基石之一,如何存储.管理这些数据集,以及在模型训练时提升 I/O 效率一直都是 AI 平台工程师和算法科学家特别关注的事情.不论是单机训练还是分布式训练 ...
- 解决 Delegate IDE build/run actions to Maven 编译两次的问题
起因:我的电脑炸了,吸取教训,以后重要的东西千万不要存在C盘,特别是我们 IT 行业的,代码和文档都是一点一点积累的经验.突然没了,总感觉少了点啥,平时我的代码都是放在D盘,但是很多文档放在C盘,导致 ...