\(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的更多相关文章

  1. 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 ...

  2. Cheatsheet: 2013 07.21 ~ 07.31

    Mobile Android vs. iOS: Comparing the Development Process of the GQueues Mobile Apps Android Studio ...

  3. Asp.NetCore源码学习[2-1]:配置[Configuration]

    Asp.NetCore源码学习[2-1]:配置[Configuration] 在Asp. NetCore中,配置系统支持不同的配置源(文件.环境变量等),虽然有多种的配置源,但是最终提供给系统使用的只 ...

  4. linux基础:第三关课前考试题整理

    1.如何取得/etc/hosts 文件的权限对应的数字内容,如-rw-r--r-- 为 644, 要求使用命令取得644 这样的数字. [root@server ~]# stat /etc/hosts ...

  5. 【CentOS】LAMP

    文章需要整合,学习需要归纳,博主把一连四篇的LAMP合并成为一片长篇的大部头,并梳理了一下他们的关系,希望对各位有所帮助 最近一次更新:2016年12月21日21:38:31 本文为博主JerryCh ...

  6. SQL Server编程入门

    SQL编程要比Java编程.C#编程简单许多,下面我们直接讲干货21:04:31 使用变量 局部变量 在T-SQL中,局部变量的名称必须以标记@作为前缀.T-SQL的局部变量其实和Java中的局部变量 ...

  7. Linux 计划任务

    实例: 每5分钟定时访问一个url # crontab -e #*/5 * * * * /usr/bin/curl http://aa.com:8080/tools/sitemap.php >& ...

  8. ISO8583报文协议

    最开始时,金融系统只有IBM这些大的公司来提供设备,象各种主机与终端等.在各个计算机设备之间,需要交换数据.我们知道数据是通过网络来传送的,而在网络上传送的数据都是基于0或1这样的二进制数据,如果没有 ...

  9. linux定时任务的设置 crontab 配置指南

    为当前用户创建cron服务 1.  键入 crontab  -e 编辑crontab服务文件 例如 文件内容如下: */2 * * * * /bin/sh /home/admin/jiaoben/bu ...

随机推荐

  1. 215 day01_Object类、常用API

    day01[Object类.常用API] 主要内容 Object类 Date类 DateFormat类 Calendar类 System类 StringBuilder类 包装类 教学目标 -[ ] 能 ...

  2. C++快速读入

    使用C++的标准cin进行读入速度比较慢,尤其是在大数据的情况下,所以我们需要使用一种方法,按照字符读入,最后再"组装"成整数.由于字符读入比数字要快,所以这样做可以提高读入速度. ...

  3. TP5 windows中执行定时任务

    1 首先先写个自定义命令文件 比如 Test 2 在网站根目录下建立文件 crond.bat ,内容:(把你在cmd上操作流程写一遍) D: cd workspace\wamp\tp5 D:\PHPW ...

  4. TP5关联模型出现疑问,待解决

    一对一: hasOne('关联模型名','外键名','主键名',['模型别名定义'],'join类型'); 说明:其他模型一对一都可以按照手册说明写,但上面代码只能这么写才能执行正确答案, 如果是 / ...

  5. Nginx系列(9)- Nginx常用命令

    Linux # 命令需要在Nginx的sbin目录下执行 cd /usr/local/nginx/sbin/ ./nginx #启动./nginx -s stop #停止 ./nginx -s qui ...

  6. Jmeter集合点技术

    集合点简介 好比小学时候做广播体操,先让大家集合,等到时间统一开始做体操. 创建集合点 同步定时器 同时签到 注意:作用域 参数设置 用户数 为0 具体数值,不能大于 超时时间 为0,没有超时时间 具 ...

  7. three.js 元素跟随物体效果

    需求: 1.实现元素跟随指定物体位置进行位置变化 实现方案: 1--- Sprite 精灵 2  --- cavans 画图后创建模型贴图 3 --- CSS2DRenderer渲染方式 4 --- ...

  8. 鸿蒙内核源码分析(信号生产篇) | 信号安装和发送过程是怎样的? | 百篇博客分析OpenHarmony源码 | v48.03

    百篇博客系列篇.本篇为: v48.xx 鸿蒙内核源码分析(信号生产篇) | 年过半百,依然活力十足 | 51.c.h .o 进程管理相关篇为: v02.xx 鸿蒙内核源码分析(进程管理篇) | 谁在管 ...

  9. MyBatis封装对象内的List出现的问题

    本篇文章问题1:wife的复数形式是wives,不是wifes,英语不好请见谅. 对象举例: class User { private String username; private List< ...

  10. 跳表--怎么让一个有序链表能够进行"二分"查找?

    对于一个有序数组,如果要查找其中的一个数,我们可以使用二分查找(Binary Search)算法,将它的时间复杂度降低为O(logn).那查找一个有序链表,有没有办法将其时间复杂度也降低为O(logn ...