\(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. 修改statefulset 有些不允许直接修改

    1.比如修改一个storageClassName: hostpath   会报错 意思是除了 'replicas', 'template',  'updateStrategy'   其他部分都是不可以 ...

  2. 浅谈 Xamarin Community Toolkit 的未来发展

    .NET MAUI会在今年晚些时候发布,我们也很高兴和大家一起分享我们对Xamarin Community Toolkit的计划! 这包括 .NET MAUI Community Toolkit.Xa ...

  3. Anaconda配置国内镜像源

    1. 为conda配置(清华)镜像源 使用conda进行安装时,访问的是国外的网络,所以下载和安装包时会特别慢.我们需要更换到国内镜像源地址,这里我更换到国内的清华大学地址.(永久添加镜像) Wind ...

  4. 洛谷P1582——倒水(进制,数学)

    https://www.luogu.org/problem/show?pid=1582 题目描述 一天,CC买了N个容量可以认为是无限大的瓶子,开始时每个瓶子里有1升水.接着~~CC发现瓶子实在太多了 ...

  5. 免费iApp后台-云接口

    免费稳定,UI易懂简洁,功能强大 应用名称:云接口 应用版本:1.5.9 应用大小:3.55 MB 适用平台:Android(安卓) 应用用处:详情请下载软件 软件安全无毒 更新内容: 1.支付宝当面 ...

  6. 一起学习PHP中断言函数的使用

    原来一直以为断言相关的函数是 PHPUnit 这些单元测试组件提供的,在阅读手册后才发现,这个 assert() 断言函数是 PHP 本身就自带的一个函数.也就是说,我们在代码中进行简单的测试的时候是 ...

  7. sonar-scanner命令参数分析

    C:\Users\huang>sonar-scanner -h INFO: INFO: usage: sonar-scanner [options] INFO: INFO: Options: I ...

  8. pandas学习小记

    pandas操作整理 导入数据: pd.read_csv(filename):从CSV文件导入数据 pd.read_table(filename):从限定分隔符的文本文件导入数据 pd.read_ex ...

  9. wordpress 搭建

    wordpress 搭建: 公司要使用自建地图.选用了国外的Mapplic .但是Mapplic不支持直接编辑地图,需要用json的格式定义.但是wordpress版本的就有这个鬼东西,所以搞了一个这 ...

  10. 『PyTorch』矩阵乘法总结

    1. 二维矩阵乘法 torch.mm() torch.mm(mat1, mat2, out=None),其中mat1(\(n\times m\)),mat2(\(m\times d\)),输出out的 ...