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 ...
随机推荐
- 从线上日志统计接口访问量QPS
这一阵子在面试,连续遇到好几家(大小厂都有)问我的项目线上qps的情况了,说实话,我作为一个大头兵,本来没关注过这个数据,只能含混地给个"大概.也许"的回答. 回来之后,我决定对业 ...
- 线程调用BeginInvoke
线程异步调用 Thread objThread = new Thread(new ThreadStart(delegate { Dispatch ...
- liunx常见指令
linux目录结构 bin:存储普通命令 sbin:存储超级命令 home:存储普通用户 root:存储超级用户 usr /usr/local:下存储数据或软件,通常软件都放在其中 tmp:临时目录 ...
- c++ undefined reference
记录一次c++编程时发现的问题 报错 undefined reference undefined reference to `Student::~Student()' 下面还有类似的好几行,翻译过来就 ...
- js判断苹果端,安卓端
<script type="text/javascript"> var browser = { versions : function() { var u = navi ...
- Jmeter系类(31) - JSR223(1) | 控件介绍
JSR233 介绍 JSR223控件执行JSR223脚本代码用于创建/更新所需的某些变量 JSR223可以使用其内置的变量,有助于精简脚本,提高开发测试的效率 由于JSR223脚本编译方式基本相同,J ...
- javascript/html 禁止图片缓存
更新图片, 如果图片的url没有改变, 刷新页面之后图片会使用缓存的图片 Solutions: * js改变图片链接 (添加get参数) // 假设当前这个图片的dom对象为img img.src + ...
- Jmeter集合点技术
集合点简介 好比小学时候做广播体操,先让大家集合,等到时间统一开始做体操. 创建集合点 同步定时器 同时签到 注意:作用域 参数设置 用户数 为0 具体数值,不能大于 超时时间 为0,没有超时时间 具 ...
- 定要过python二级 选择题第四套
1. 2. 3. 4. 5. 6. python用于人工智能 7. 8. 9. 10. 11. 12. 13. 14. 15. 16.
- Python接口自动化测试实战-----附源码
目录 1. 接口定义 2. 基本流程 3. 需求分析 4. 用例设计 5. 脚本开发 6. 结果分析 接口定义: 接口普遍有两种意思,一种是API(Application Program Interf ...