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 ...
随机推荐
- 3.15学习总结(Python爬取网站数据并存入数据库)
在官网上下载了Python和PyCharm,并在网上简单的学习了爬虫的相关知识. 结对开发的第一阶段要求: 网上爬取最新疫情数据,并存入到MySql数据库中 在可视化显示数据详细信息 项目代码: im ...
- POJ题目 1003Hangover(叠放纸牌)
POJ 1003 叠放纸牌 描述 您可以将多张纸牌悬在桌子上多远?如果您有一张卡,则可以创建一个最大长度为卡长的一半.(我们假设这些卡片必须垂直于桌子.)使用两张卡片,您可以使最上面的卡片悬垂在底部的 ...
- Spring Cloud Hystrix 学习(二)熔断与降级
今天来看下Hystrix的熔断与降级. 首先什么是降级?当请求超时.资源不足等情况发生时进行服务降级处理,不调用真实服务逻辑,而是使用快速失败(fallback)方式直接返回一个托底数据,保证服务链条 ...
- vue跳转路由
1. router-link 1. 不带参数 <router-link :to="{name:'home'}"> <router-link :to=" ...
- PHP获取当前网址路径
$_SERVER['REQUEST_SCHEME'] . '://' . $_SERVER['HTTP_HOST'].$_SERVER['REQUEST_URI'] // 获取来源 function ...
- Shell系列(21)- 字符截取命令printf
作用 printf是标准格式输出命令,控制输出格式,不会自动加入换行符.awk会用到该条命令 命令 printf '输出类型输出格式' 输出内容 #''双引号不能少,输出类型和输出格式之间没有空格 输 ...
- Gitee自动化部署python脚本
一.前期准备 1.1 安装环境 1.安装python3 2.打开命令行安装selenium pip install selenium 二.python代码 2.1 源码 #!/usr/bin/pyth ...
- 【Vue】淘气三千问之 data为什么是函数而不是对象?这河狸吗
朋友,当你提出以上问题的时候建议你先去复习下原型链的知识 但是我好人做到底直接就讲了吧,我们先看一下下面的这段代码: function Component () { this.data = this. ...
- Kettle学习笔记(二)— 基本操作
目录 Kettle学习笔记(一)- 环境部署及运行 Kettle学习笔记(二)- 基本操作 kettle学习笔记(三)- 定时任务的脚本执行 Kettle学习笔记(四)- 总结 打开Kettle 打开 ...
- Docker-Java限制cpu和内存及浅析源码解决docker磁盘挂载失效问题
需求 之前工作流的运行都是用的docker-java提供的api拉起的docker容器直接跑服务,但是最新线上的新业务资源消耗较大,单个容器如果不加控制,CPU和内存都会拉满,导致服务器莫名宕机事故的 ...