低仿机器人
(robo,1s,64M)

题解

大模拟

代码

#include <cstdio>
#include <cstring>
#include <iostream>
using namespace std; const int xGo[]={-,,,};
const int yGo[]={,-,,}; int n,m,map[][][];
int x,y,fOri,wOri,maxCilp,totCilp,cilp[],bigBullet,smallBullet,k,endIf,totTarget; void IN_Map_Robot();
void OutPut(int);
int Para(char str[]); void FortCom(char str[]);
void WheelCom(char str[]);
void EndCom(char str[]); int main()
{
freopen("robo.in","r",stdin);
freopen("robo.out","w",stdout);
int t;
scanf("%d",&t);
while(t--)
{
IN_Map_Robot();
while(k--)
{
char str[];
cin.getline(str,);
if(endIf) continue;
if(str[]=='F') FortCom(str);
if(str[]=='W') WheelCom(str);
if(str[]=='E') EndCom(str);
}
if(!endIf) OutPut();
}
fclose(stdin);
fclose(stdout);
return ;
} void IN_Map_Robot()
{
memset(map,,sizeof(map));
totCilp=,fOri=,wOri=,endIf=,totTarget=; scanf("%d%d",&n,&m);
for(int i=;i<n;++i)
for(int j=;j<m;++j)
scanf("%d ",&map[i][j][]);
scanf("%d %d %d %d %d %d\n",&x,&y,&maxCilp,&bigBullet,&smallBullet,&k);
} void FortCom(char str[])
{
if(str[]=='T')
{
int par=Para(str+);
if(par==) fOri=(fOri+)%;
else if(par==) fOri=(fOri+)%;
else { OutPut(); return ; }
}
if(str[]=='F')
{
int par=Para(str+);
if((par==&&smallBullet==)||(par==&&bigBullet==)) return;
if(par==&&totCilp<maxCilp) cilp[++totCilp]=par,smallBullet--;
else if(par==&&totCilp<maxCilp) cilp[++totCilp]=par,bigBullet--;
else { OutPut(); return ; }
}
if(str[]=='E')
{
if(totCilp==) return ;
int nx,ny;
for(int i=;;++i)
{
nx=x+xGo[fOri]*i,ny=y+yGo[fOri]*i;
if(nx<||nx>=n||ny<||ny>=m) break;
if(map[nx][ny][]==||map[nx][ny][]==) break;
}
totCilp--;
if(nx<||nx>=n||ny<||ny>=m) return ;
if(map[nx][ny][]==) return ;
if(cilp[totCilp+]||map[nx][ny][]) { map[nx][ny][]=; totTarget++; }
else map[nx][ny][]=;
}
} void WheelCom(char str[])
{
if(str[]=='T')
{
int par=Para(str+);
if(par==) wOri=(wOri+)%;
else if(par==) wOri=(wOri+)%;
else { OutPut(); return ; }
}
else
{
int par=Para(str+);
int nx=x+xGo[wOri]*par,ny=y+yGo[wOri]*par;
if(nx<||nx>=n||ny<||ny>=m) { OutPut(); return ; }
else
{
for(int i=;i<=par;++i)
{
nx=x+xGo[wOri]*i,ny=y+yGo[wOri]*i;
if(map[nx][ny][]) { OutPut(); return ; }
}
}
x=nx,y=ny;
}
} void EndCom(char str[])
{
OutPut();
} void OutPut(int type)
{
endIf=;
if(type) printf("Complete\n");
else printf("ERROR\n");
printf("%d %d\n",x,y);
printf("%d\n",totTarget);
printf("%d %d %d %d\n",fOri,wOri,bigBullet,smallBullet);
} int Para(char str[])
{
int i,re=;
for(i=;;++i)
{
if(str[i]=='.') return ;
if(str[i]=='\0') break;
}
i=;
do
{
re=re*+(str[i]-'');
i++;
}while(str[i]!='\0');
return re;
}

迷路的刺豚

DFS  搜出,路径,同样长度但是膨胀程度不一样

状压DP+BFS

f[s][i]------(+dis[i][j])------->f[s|(1<<j)][j]

代码

#include <bits/stdc++.h>

using namespace std;

const int N=,M=,K=;
const int dx[]={,,,-};
const int dy[]={,-,,};
const char* st[]={"R","L","D","U"}; int Path[(N+M)<<],n,m,S;
int mp[N][M]; void Read_Map() {
scanf("%d%d%d",&n,&m,&S);
for (int i=;i<n;++i)
for (int j=;j<m;++j) scanf("%d",&mp[i][j]);//mp=0为可行,否则为障碍
} queue<pair<int,int> >Q;
int Path_[K+][K+][(N+M)<<],dist[K+][K+],szt[K+][K+];
int dis[K][<<K],sum[K][<<K];
pair<int,int> pre[K][<<K]; void Put_Path(int *Path,int &len,int begin,int end) {
for (int i=;i<dist[begin][end];++i)
Path[len++]=Path_[begin][end][i];
} bool CoordValid(int x,int y) {
return x>= && x<n && y>= && y<m;
} bool CoordValid(int x,int y,int size) {
for (int i=-size;i<=size;++i)
for (int j=-size;j<=size;++j)
if (!CoordValid(x+i,y+j) || mp[x+i][y+j]==) return ;
return ;
} int Size(int x,int y) {
for (int i=S;i>=;--i) if (CoordValid(x,y,i)) return i;
return -;
} int pree[N][M],diss[N][M],sz[N][M];
void FindPath(int *ax,int *ay,int count) {
for (int i=;i<count;++i) {
Q.push(make_pair(ax[i],ay[i]));
memset(pree,,sizeof(pree));
memset(diss,0x7f,sizeof(diss));
memset(sz,,sizeof(sz));
diss[ax[i]][ay[i]]=;
while (!Q.empty()) {
pair<int,int> u=Q.front(); Q.pop();
for (int i=;i<;++i) {
int tx=u.first+dx[i],ty=u.second+dy[i],s=Size(tx,ty);
if (s!=- && (diss[tx][ty]>diss[u.first][u.second]+ || (diss[tx][ty]==diss[u.first][u.second]+ && sz[u.first][u.second]+s>sz[tx][ty]))) {
diss[tx][ty]=diss[u.first][u.second]+;
pree[tx][ty]=i;
sz[tx][ty]=sz[u.first][u.second]+s;
Q.push(make_pair(tx,ty));
}
}
}
for (int j=;j<count;++j) {
dist[i][j]=diss[ax[j]][ay[j]];
szt[i][j]=sz[ax[j]][ay[j]];
// int len=0,nowx=ax[j],nowy=ay[j];
// while (nowx!=ax[i] || nowy!=ay[i]) {
// Path_[i][j][len++]=pree[nowx][nowy];
// int px=nowx-dx[pree[nowx][nowy]],py=nowy-dy[pree[nowx][nowy]];
// nowx=px; nowy=py;
// }
// reverse(Path_[i][j],Path_[i][j]+len);
}
}
} void Planning(int now_x,int now_y,int *aim_x,int *aim_y,int count_aim,int *Path,int &len) {
aim_x[count_aim]=now_x; aim_y[count_aim]=now_y;
FindPath(aim_x,aim_y,count_aim+);
int Mx=<<count_aim;
for (int i=;i<=count_aim;++i)
for (int j=;j<Mx;++j)
pre[i][j]=make_pair(-,-),dis[i][j]=<<;
for (int i=;i<count_aim;++i) dis[i][(Mx-)^(<<i)]=,sum[i][(Mx-)^(<<i)]=;
for (int i=;i<count_aim;++i)
for (int j=Mx-;j>=;--j)
for (int k=;k<count_aim;++k) if (i!=k && !((j>>k)&) && (dis[i][j]>dis[k][j^(<<i)]+dist[i][k] || ( dis[i][j]==dis[k][j^(<<i)]+dist[i][k] && sum[i][j]<sum[k][j^(<<i)]+szt[i][k] ) )) {
dis[i][j]=dis[k][j^(<<i)]+dist[i][k];
sum[i][j]=sum[k][j^(<<i)]+szt[i][k];
pre[i][j]=make_pair(k,j^(<<i));
} int mn=,v=; len=;
for (int i=;i<count_aim;++i) if (dis[i][v]+dist[count_aim][i]<dis[mn][v]+dist[count_aim][mn] || (dis[i][v]+dist[count_aim][i]==dis[mn][v]+dist[count_aim][mn] && sum[i][v]+szt[count_aim][i]>sum[mn][v]+szt[count_aim][mn])) mn=i;
printf("%d %d\n",dis[mn][v]+dist[count_aim][mn],sum[mn][v]+Size(now_x,now_y)+szt[count_aim][mn]);
/*
for (int i=1;i<count_aim;++i) if (dis[i][v]+dist[count_aim][i]<dis[mn][v]+dist[count_aim][mn]) mn=i;
Put_Path(Path,len,count_aim,mn);
while (pre[mn][v].first!=-1) {
pair<int,int> u=pre[mn][v];
Put_Path(Path,len,mn,u.first);
mn=u.first; v=u.second;
}
*/
} int main() {
freopen("expand.in","r",stdin);
freopen("expand.out","w",stdout);
Read_Map();
int now_x,now_y,aim_x[K],aim_y[K],count_aim;
scanf("%d%d%d",&now_x,&now_y,&count_aim);
for (int i=;i<count_aim;++i) scanf("%d%d",&aim_x[i],&aim_y[i]);
int len=;
Planning(now_x,now_y,aim_x,aim_y,count_aim,Path,len);
// for (int i=0;i<len;++i)
// printf("%s",st[Path[i]]);
putchar('\n');
fclose(stdin);
fclose(stdout);
return ;
} /*
input:
4 6 3
1 1 1 0 0 0
0 0 0 0 0 0
0 0 0 0 0 0
0 0 0 0 0 0
0 4 1
3 0 output:
7 5
*/

生日(birthday.cpp/1s/256M)

样例输入:


样例输出

Yes
Yes
Yes
Yes
No

题解

(图右半边是折半搜索)

解释一哈:

因为区间内的每个小盆友都可以有选或者不选两种情况,所以一共有2len

所以该区间的子集种类数:有2len 种

子集和的范围:0~v*len

2len 种子集本应该是与v*len一一映射的

但是当2len > v*len 时,

集合的取值一定会有重复的,所以此时一定有解

解得 len>=14

∴len<14时要折半搜索

因为之前处理过 len<=7 的情况

那么有重复的怎么办???

其实不影响

比如序列     1   1   3   2

所选集合有重叠,但是他们相等,那么去掉重复的之后也是相等的

代码

# include <iostream>
# include <cstdio>
# include <cstring>
# include <cstdlib>
using namespace std;
const int V = 1e3 + ;
const int N = 1e5 + ;
int read()
{
int ans = ,f = ;
char i = getchar();
while(i < '' || i > ''){if(i == '-')f = -;i = getchar();}
while(i >= '' && i <= ''){ans = ans * + i - '';i = getchar();}
return ans * f;
}
int n,m,v,mid,ol,x,y,d;
int data[V][],a[N],stack[N],cnt;
int sum[N << ],lazy[N << ];
bool flag[N];
void down(int rt){
lazy[rt << ] += lazy[rt];
lazy[rt << | ] += lazy[rt];
lazy[rt] = ;
}
void push(int &ans,int &r){
int j = ;
while(j >= ){
if(r >= ( << j)){
ans = data[ans][j];
r -= ( << j);
if(r == )return;
}
j--;
}
}
void updata(int L,int R,int l,int r,int rt){
if(L <= l && r <= R){
lazy[rt]++;
return;
}
if(lazy[rt])down(rt);
int mid = (l + r) >> ;
if(L <= mid)updata(L,R,l,mid,rt << );
if(R > mid)updata(L,R,mid + ,r,rt << | );
return;
}
void Query(int L,int l,int r,int rt){
if(l == r){
push(a[L],lazy[rt]);
return;
}
if(lazy[rt])down(rt);
int mid = (l + r) >> ;
if(L <= mid)Query(L,l,mid,rt << );
else Query(L,mid + ,r,rt << | );
return;
}
void init(){
for(int i = ;i < v;i++){
data[i][] = (i * i % v) * i % v;
}
for(int j = ;j <= ;j++){
for(int i = ;i < v;i++){
data[i][j] = data[data[i][j - ]][j - ];
}
}
}
void dfsl(int u,int dis,bool k){
if(ol)return;
if(u == mid + ){
if(k){
if(!dis){
ol = true;
}else if(dis >= && !flag[dis]){flag[dis] = true;stack[++cnt] = dis;}
}
return;
}
dfsl(u + ,dis,k);
dfsl(u + ,dis + a[u] + ,true);
dfsl(u + ,dis - a[u] - ,true);
return;
}
void dfsr(int u,int dis,bool k){
if(ol)return;
if(u == y + ){
if(k){
if(!dis){
ol = true;
}else if(dis >= && flag[dis]){
ol = true;
}
}
return;
}
dfsr(u + ,dis,k);
dfsr(u + ,dis + a[u] + ,true);
dfsr(u + ,dis - a[u] - ,true);
return;
}
int main(){
freopen("birthday.in","r",stdin);
freopen("birthday.out","w",stdout);
n = read(),m = read(),v = read();
for(int i = ;i <= n;i++)a[i] = read();
init();
for(int i = ;i <= m;i++){
d = read(),x = read(),y = read();
if(d == ){
updata(x,y,,n,);
}else {
if(y - x >= ){
puts("Yes");
}else {
for(int j = x;j <= y;j++){
Query(j,,n,);
}
mid = (x + y) >> ;
ol = false;cnt = ;
dfsl(x,,false);
dfsr(mid + ,,false);
for(int i = ;i <= cnt;i++){
flag[stack[i]] = false;
}
if(ol)puts("Yes");else puts("No");
}
}
}
fclose(stdin);
fclose(stdout);
return ;
}

提高组刷题班 DAY 1 上午的更多相关文章

  1. 提高组刷题营 DAY 2

    1.滞空(jump/1s/64M) #include<bits/stdc++.h> using namespace std; typedef long long LL; ; inline ...

  2. 提高组刷题营 DAY 1 下午

    DFS 深度优先搜索 通过搜索得到一棵树形图 策略:只要能发现没走过的点,就走到它.有多个点可走就随便挑一个,如果无路可走就回退,再看有没有没走过的点可走. 在图上寻找路径[少数可用最短路解决]:最短 ...

  3. NOIP2010提高组真题部分整理(没有关押罪犯)

    目录 \(NOIP2010\)提高组真题部分整理 \(T1\)机器翻译: 题目背景: 题目描述: 输入输出格式: 输入输出样例: 说明: 题解: 代码: \(T2\)乌龟棋 题目背景: 题目描述: 输 ...

  4. NOIP2014提高组第二题联合权值

    还是先看题吧: 试题描述  无向连通图 G 有 n 个点,n-1 条边.点从 1 到 n 依次编号,编号为 i 的点的权值为 Wi ,每条边的长度均为 1.图上两点(u, v)的距离定义为 u 点到 ...

  5. 【套题】qbxt国庆刷题班D1

    Day1 事实上D1的题目还是比较简单的= =然而D1T2爆炸了就十分尴尬--错失一波键盘 看题 T1 传送门 Description 现在你手里有一个计算器,上面显示了一个数\(S\),这个计算器十 ...

  6. 【枚举】Vijos P1496 火柴棒等式 (NOIP2008提高组第二题)

    题目链接: https://vijos.org/p/1496 题目大意: 给你n(n<24)根火柴棍,你可以拼出多少个形如“A+B=C”的等式?("+"和"=&qu ...

  7. 【套题】qbxt国庆刷题班D2

    D2 今天的题感觉还是好妙的 T1 传送门 Description 现在有一张\(n\)个节点\(m\)条边的无向连通图\(G=(V,E)\),满足这张图中不存在长度大于等于3的环且图中没有重边和自环 ...

  8. 11.5NOIP2018提高组模拟题

    书信(letter) Description 有 n 个小朋友, 编号为 1 到 n, 他们每人写了一封信, 放到了一个信箱里, 接下来每个人从中抽取一封书信. 显然, 这样一共有 n!种拿到书信的情 ...

  9. NOIP2018提高组模拟题(四)

    能量(energy) Description ​ 有一块能量田,它的形状是 n*m的矩形,每一个格子上都有一个能量值 a[x][y] (可正可负).一块矩形田的能量定义为它的每个格子的能量值之和. ​ ...

随机推荐

  1. vue项目中图片预览旋转功能

    最近项目中需要在图片预览时,可以旋转图片预览,在网上找了下,发现有一款功能强大的图片组件:viewerjs. git-hup: https://github.com/fengyuanchen/view ...

  2. 7.JSP技术

    JSP和Servlet一样,都是用于开发动态web资源的技术 JSP的两个特性:1.写JSP代码就像是在写HTML代码,但JSP技术允许在页面中编写java代码(理解为一种特殊的HTML) 2.JSP ...

  3. nginx 设置静态下载界面

    首先,官方设置链接:https://docs.nginx.com/nginx/admin-guide/web-server/serving-static-content/ 下面贴一个配置文件: cha ...

  4. LoadRunner(2)

    一.性能测试的基本概念 1.并发和在线的区别:并发的压力是一种瞬时压力,一般针对同一类型业务:在线的压力是一段时间的压力,没有并发那么集中. 规律:一般20用户并发产生的压力相当于200用户在线的压力 ...

  5. okhttp任务调度核心类dispatcher解析

    在之前已经对okhttp的同步和异步请求的流程进行了详细的分析,其中任务调度是由dispatcher来实现的,非常重要,所以这次专门来对它进行一个了解,带着问题去进行探究: Q1:okhttp如何实现 ...

  6. luogu4422 [COCI2017-2018#1] Deda[线段树二分]

    讨论帖:线段树二分的题..我还考场切过..白学 这题我一年前的模拟赛考场还切过,现在就不会了..好菜啊. 显然直接线段树拆成$\log n$个区间,然后每个区间在进行线段树二分即可. UPD:复杂度分 ...

  7. 【Linux】解决用vi修改文件,保存文件时,提示“readonly option is set”

    当在终端执行sudo命令时,系统提示“hadoop is not in the sudoers file”: 其实就是没有权限进行sudo,解决方法如下(这里假设用户名是cuser): 1.切换到超级 ...

  8. C# 委托、lambda表达式和事件 (7) 持续更新

    引用方法 在C++,函数指针只不过是一个指向内存位置的指针,它不是类型安全的. C# 委托 定义了返回类型和参数的类型.委托类包含对方法的引用,还可以包含多个方法引用. 定义委托 public del ...

  9. ERROR 1130 (HY000): Host '127.0.0.1' is not allowed to connect to this MySQL server

    [root@zstedu mysql]# mysql --protocol=tcp -h 127.0.0.1 -uroot -pEnter password: ERROR 1130 (HY000): ...

  10. swoole 协程channel乱测

    channel和数组差不多,可以被用作队列,属性capacity是设置容量,isEmpty() isFull() 用来判断队列是空还是满,push()加入队列 pop()弹出队列 interface ...