2017国庆 清北学堂 北京综合强化班 Day1
期望得分:60+ +0=60+
实际得分:30+56+0=86
时间规划极端不合理,T2忘了叉积计算,用解析几何算,还有的情况很难处理,浪费太多时间,最后gg
导致T3只剩50分钟,20分钟写完代码,没调出来
设sum[i][j] 表示字母j出现次数的前缀和
那么题目要求我们 最大化sum[r][x]-sum[l-1][x]-(sum[r][y]-sum[l-1][y])
如果枚举r,再枚举y,时间复杂度为O(n*26),是可以承受的
但此时还有l-1未知,能否O(1)找到l-1呢?
我们发现式子可以化为 :sum[r][x]-sum[r][y]-(sum[l-1][x]-sum[l-1][y])
这样减号两边形式相同
那就可以用前缀和来维护
所以设mi[i][j] 表示 当前 sum[i]-sum[j] 的最小值
在枚举r之前,l肯定已经计算过,所以sum的第一维可以不再mi中体现
那么ans=max(sum[r][x]-sum[r][y]-mi[x][y],sum[r][y]-sum[l][x]-mi[y][x])
小细节:
zhx的std中,
另外记录了当前每个字符的上一个出现的位置last[i],更新mi[i][j]的位置pos[i][j]
在更新答案的时候,是sum[r][x]-sum[r][y]-mi[x][y]-(pos[x][y]==last[i])
原因是因为 题目中要求 用来计算答案的 字母必须在所选区间出现过
std 每次在用sum更新mi时,不能保证用的这个字符出现过
还不明白的话 ,把std 的那句判等去掉,跑一遍数据:hhfffff
所以 我们仅需要在更新mi的时候,判断sum[]是否为真
便可以把这个特殊判断和last,pos 数组 去掉
#include<cstdio>
#include<cstring>
#include<algorithm> using namespace std; #define N 1000001 int sum[N],mi[][];
char s[N]; int main()
{
freopen("a.in","r",stdin);
freopen("a.out","w",stdout);
int n;
scanf("%d",&n); scanf("%s",s+);
int ans=;
memset(mi,,sizeof());
for(int i=;i<=n;i++)
{
int now=s[i]-'a';
sum[now]++;
for(int j=;j<;j++)
if(sum[j]) ans=max(ans,max(sum[now]-sum[j]-mi[now][j],sum[j]-sum[now]-mi[j][now]));
for(int j=;j<;j++)
{
if(sum[j] && sum[j]-sum[now]<mi[j][now]) mi[j][now]=sum[j]-sum[now];
if(sum[j] && sum[now]-sum[j]<mi[now][j]) mi[now][j]=sum[now]-sum[j];
}
}
printf("%d",ans);
}
gg了。。。。。。
反射那块是怎么求的?
最后的交点怎么求的?
#include<cmath>
#include<cstdio>
#include<iostream>
#include<algorithm> using namespace std; const double eps=1e-; struct Point
{
double x,y;
Point() { };
Point(double a,double b) { x=a; y=b; }
void init() { scanf("%lf%lf",&x,&y); }
}v,p,w1,w2,m1,m2; Point operator + (Point A,Point B) { return Point(A.x+B.x,A.y+B.y); }
Point operator - (Point A,Point B) { return Point(A.x-B.x,A.y-B.y); }
Point operator * (Point A,double a) { return Point(A.x*a,A.y*a); } int dcmp(double a) { if(fabs(a)<eps) return ; return a> ? : -; } double Cross(Point A,Point B) { return A.x*B.y-A.y*B.x; } double Dot(Point A,Point B) { return A.x*B.x+A.y*B.y; } bool cross(Point P1,Point P2,Point P3,Point P4)
{
if(dcmp(Cross(P2-P1,P3-P1))*dcmp(Cross(P2-P1,P4-P1))==) return false;
if(dcmp(Cross(P4-P3,P1-P3))*dcmp(Cross(P4-P3,P2-P3))==) return false;
if(dcmp(fmax(P1.x,P2.x)-fmin(P3.x,P4.x))==-) return false;
if(dcmp(fmax(P1.y,P2.y)-fmin(P3.y,P4.y))==-) return false;
if(dcmp(fmax(P3.x,P4.x)-fmin(P1.x,P2.x))==-) return false;
if(dcmp(fmax(P3.y,P4.y)-fmin(P1.y,P2.y))==-) return false;
return true;
} Point GetLineProjection(Point P,Point A,Point B)
{
Point v=B-A;
return A+v*(Dot(v,P-A)/Dot(v,v));
} Point getcross(Point P1,Point P2,Point P3,Point P4)
{
double a=P2.y-P1.y;
double b=P1.x-P2.x;
double c=-P1.x*P2.y+P1.y*P2.x;
double d=P4.y-P3.y;
double e=P3.x-P4.x;
double f=-P3.x*P4.y+P3.y*P4.x;
double x=(b*f-c*e)/(a*e-b*d);
double y=(a*f-c*d)/(b*d-a*e);
return Point(x,y);
} bool check()
{
if(!cross(v,p,w1,w2))
{
if(!cross(v,p,m1,m2)) return true;
if(dcmp(Cross(m1-v,m2-v))== && dcmp(Cross(m1-p,m2-p))==) return true;
}
if(dcmp(Cross(m2-m1,v-m1))*dcmp(Cross(m2-m1,p-m1))==)
{
Point foot=GetLineProjection(p,m1,m2);
foot=foot*2.0-p;
if(cross(v,foot,m1,m2))
{
foot=getcross(v,foot,m1,m2);
if(!cross(v,foot,w1,w2) && !cross(p,foot,w1,w2)) return true;
}
return false;
}
return false;
} int main()
{
freopen("b.in","r",stdin);
freopen("b.out","w",stdout);
v.init(); p.init();
w1.init(); w2.init();
m1.init(); m2.init();
if(check()) puts("YES");
else printf("NO");
return ;
}
bfs,结构体内char数组3*3*6表示状态,map判重
#include<map>
#include<queue>
#include<cstring>
#include<cstdio>
#include<iostream> using namespace std; struct node
{
char s[][][];
}cur,nxt; queue<node>q;
map<string,int>mp; string t; int sum[],cnt; bool v[][][]; bool vis()
{
t.clear();
for(int i=;i<;i++)
for(int j=;j<;j++)
t+=nxt.s[i][j];
return mp.count(t);
} void dfs(int i,int j,int k,char c)
{
cnt++;
v[i][j][k]=true;
if(!k)
{
if(nxt.s[i][j][]==c && !v[i][j][]) dfs(i,j,,c);
if(nxt.s[i][j][]==c && !v[i][j][]) dfs(i,j,,c);
if(i && nxt.s[i-][j][]==c && !v[i-][j][]) dfs(i-,j,,c);
}
else if(k==)
{
if(nxt.s[i][j][]==c && !v[i][j][]) dfs(i,j,,c);
if(nxt.s[i][j][]==c && !v[i][j][]) dfs(i,j,,c);
if(i!= && nxt.s[i+][j][]==c && !v[i+][j][]) dfs(i+,j,,c);
}
else if(k==)
{
if(nxt.s[i][j][]==c && !v[i][j][]) dfs(i,j,,c);
if(nxt.s[i][j][]==c && !v[i][j][]) dfs(i,j,,c);
if(j!= && nxt.s[i][j-][]==c && !v[i][j-][]) dfs(i,j-,,c);
}
else
{
if(nxt.s[i][j][]==c && !v[i][j][]) dfs(i,j,,c);
if(nxt.s[i][j][]==c && !v[i][j][]) dfs(i,j,,c);
if(j!= && nxt.s[i][j+][]==c && !v[i][j+][]) dfs(i,j+,,c);
}
} bool judge()
{
memset(v,false,sizeof(v));
bool ok=false;
for(int i=;i< && !ok;i++)
for(int j=;j< && !ok;j++)
for(int k=;k< && !ok;k++)
if(nxt.s[i][j][k]=='R')
{
cnt=;
dfs(i,j,k,'R');
if(cnt!=sum[]) return false;
ok=true;
}
ok=false;
for(int i=;i< && !ok;i++)
for(int j=;j< && !ok;j++)
for(int k=;k< && !ok;k++)
if(nxt.s[i][j][k]=='G')
{
cnt=;
dfs(i,j,k,'G');
if(cnt!=sum[]) return false;
ok=true;
}
ok=false;
for(int i=;i< && !ok;i++)
for(int j=;j< && !ok;j++)
for(int k=;k< && !ok;k++)
if(nxt.s[i][j][k]=='B')
{
cnt=;
dfs(i,j,k,'B');
if(cnt!=sum[]) return false;
ok=true;
}
ok=false;
for(int i=;i< && !ok;i++)
for(int j=;j< && !ok;j++)
for(int k=;k< && !ok;k++)
if(nxt.s[i][j][k]=='O')
{
cnt=;
dfs(i,j,k,'O');
if(cnt!=sum[]) return false;
ok=true;
}
return true;
} int main()
{
freopen("c.in","r",stdin);
freopen("c.out","w",stdout);
for(int i=;i<;i++)
for(int j=;j<;j++)
{
scanf("%s",cur.s[i][j]);
for(int k=;k<;k++) t+=cur.s[i][j][k];
for(int k=;k<;k++)
switch(cur.s[i][j][k])
{
case 'R':sum[]++; break;
case 'G':sum[]++; break;
case 'B':sum[]++; break;
case 'O':sum[]++; break;
}
}
q.push(cur);
mp[t]=;
bool ok; string a,b; while(!q.empty())
{
cur=q.front(); q.pop();
a.clear(); for(int i=;i<;i++)
for(int j=;j<;j++)
a+=cur.s[i][j];
// left
for(int i=;i<;i++)
{
ok=true;
for(int j=;j< && ok;j++) if(cur.s[i][j][]=='') ok=false;
if(!ok) continue;
nxt=cur;
swap(nxt.s[i][],nxt.s[i][]);
swap(nxt.s[i][],nxt.s[i][]);
if(vis()) continue;
if(judge()) { printf("%d",mp[a]); return ; }
b.clear();
for(int i=;i<;i++)
for(int j=;j<;j++)
b+=nxt.s[i][j];
mp[b]=mp[a]+;
q.push(nxt);
}
// right
for(int i=;i<;i++)
{
ok=true;
for(int j=;j< && ok;j++) if(cur.s[i][j][]=='') ok=false;
if(!ok) continue;
nxt=cur;
swap(nxt.s[i][],nxt.s[i][]);
swap(nxt.s[i][],nxt.s[i][]);
if(vis()) continue;
if(judge()) { printf("%d",mp[a]); return ; }
b.clear();
for(int i=;i<;i++)
for(int j=;j<;j++)
b+=nxt.s[i][j];
mp[b]=mp[a]+;
q.push(nxt);
}
// up
for(int j=;j<;j++)
{
ok=true;
for(int i=;i< && ok;i++) if(cur.s[i][j][]=='') ok=false;
if(!ok) continue;
nxt=cur;
swap(nxt.s[][j],nxt.s[][j]);
swap(nxt.s[][j],nxt.s[][j]);
if(vis()) continue;
if(judge()) { printf("%d",mp[a]); return ; }
b.clear();
for(int i=;i<;i++)
for(int j=;j<;j++)
b+=nxt.s[i][j];
mp[b]=mp[a]+;
q.push(nxt);
}
// down
for(int j=;j<;j++)
{
ok=true;
for(int i=;i< && ok;i++)
if(cur.s[i][j][]=='') ok=false;
if(!ok) continue;
nxt=cur;
swap(nxt.s[][j],nxt.s[][j]);
swap(nxt.s[][j],nxt.s[][j]);
if(vis()) continue;
if(judge()) { printf("%d",mp[a]); return ; }
b.clear();
for(int i=;i<;i++)
for(int j=;j<;j++)
b+=nxt.s[i][j];
mp[b]=mp[a]+;
q.push(nxt);
}
}
}
2017国庆 清北学堂 北京综合强化班 Day1的更多相关文章
- 洛谷P1080 [NOIP2012提高组D1T2]国王游戏 [2017年5月计划 清北学堂51精英班Day1]
P1080 国王游戏 题目描述 恰逢 H 国国庆,国王邀请 n 位大臣来玩一个有奖游戏.首先,他让每个大臣在左.右 手上面分别写下一个整数,国王自己也在左.右手上各写一个整数.然后,让这 n 位大臣排 ...
- 2017 五一 清北学堂 Day1模拟考试结题报告
预计分数:100+50+50 实际分数:5+50+100 =.= 多重背包 (backpack.cpp/c/pas) (1s/256M) 题目描述 提供一个背包,它最多能负载重量为W的物品. 现在给出 ...
- 洛谷P1650 赛马[2017年5月计划 清北学堂51精英班Day1]
P1650 赛马 题目描述 我国历史上有个著名的故事: 那是在2300年以前.齐国的大将军田忌喜欢赛马.他经常和齐王赛马.他和齐王都有三匹马:常规马,上级马,超级马.一共赛三局,每局的胜者可以从负者这 ...
- 洛谷P2258 子矩阵[2017年5月计划 清北学堂51精英班Day1]
题目描述 给出如下定义: 子矩阵:从一个矩阵当中选取某些行和某些列交叉位置所组成的新矩阵(保持行与列的相对顺序)被称为原矩阵的一个子矩阵. 例如,下面左图中选取第2.4行和第2.4.5列交叉位置的元素 ...
- 洛谷P2327 [SCOI2005]扫雷 [2017年5月计划 清北学堂51精英班Day1]
P2327 [SCOI2005]扫雷 题目描述 输入输出格式 输入格式: 第一行为N,第二行有N个数,依次为第二列的格子中的数.(1<= N <= 10000) 输出格式: 一个数,即第一 ...
- 2016.10.29 清北学堂NOIP冲刺班Day1 AM 考试总结
成绩:满分300,我得了200, 1:90//前两个题目都是模拟,没用到什么其他算法,第一题有可能少考虑了一点细节 2:100 3:10//感觉是个DP,但是毫无思路,只打了个普通背包,10分而已. ...
- 2017.10.1 国庆清北 D1T1 zhx的字符串题
题目背景 2017国庆清北D1T1 题目描述 你是能看到第一题的 friends 呢. ——hja 何大爷对字符串十分有研究,于是天天出字符串题虐杀 zhx.何大爷今天为 字符串定义了新的权值计算方法 ...
- 清北学堂2017NOIP冬令营入学测试P4745 B’s problem(b)
清北学堂2017NOIP冬令营入学测试 P4745 B's problem(b) 时间: 1000ms / 空间: 655360KiB / Java类名: Main 背景 冬令营入学测试 描述 题目描 ...
- 清北学堂2017NOIP冬令营入学测试 P4744 A’s problem(a)
清北学堂2017NOIP冬令营入学测试 P4744 A's problem(a) 时间: 1000ms / 空间: 655360KiB / Java类名: Main 背景 冬令营入学测试题,每三天结算 ...
随机推荐
- Scrum立会报告+燃尽图(十月二十九日总第二十次)
此作业要求参见:https://edu.cnblogs.com/campus/nenu/2018fall/homework/2288 项目地址:https://git.coding.net/zhang ...
- 在MySQL中如何使用覆盖索引优化limit分页查询
背景 今年3月份时候,线上发生一次大事故.公司主要后端服务器发生宕机,所有接口超时.宕机半小时后,又自动恢复正常.但是过了2小时,又再次发生宕机. 通过接口日志,发现MySQL数据库无法响应服务器.在 ...
- spring 整合 struts2 + Hibernate application配置文件(基于注解)
下面是 application.xml 文件. <?xml version="1.0" encoding="UTF-8"?> <beans x ...
- 零拷贝Zero-Copy(NIO)
介绍 Java 的zero copy多在网络应用程序中使用.Java的libaries在linux和unix中支持zero copy,关键的api是java.nio.channel.FileChann ...
- 第154天:canvas基础(一)
一.canvas简介 <canvas> 是 HTML5 新增的,一个可以使用脚本(通常为JavaScript)在其中绘制图像的 HTML 元素.它可以用来制作照片集或者制作简单(也不是 ...
- 洛谷P2894[USACO08FEB]酒店Hotel(线段树)
问题描述 奶牛们最近的旅游计划,是到苏必利尔湖畔,享受那里的湖光山色,以及明媚的阳光.作为整个旅游的策划者和负责人,贝茜选择在湖边的一家著名的旅馆住宿.这个巨大的旅馆一共有N (1 <= N & ...
- 矩阵快速幂模板(pascal)
洛谷P3390 题目背景 矩阵快速幂 题目描述 给定n*n的矩阵A,求A^k 输入输出格式 输入格式: 第一行,n,k 第2至n+1行,每行n个数,第i+1行第j个数表示矩阵第i行第j列的元素 输出格 ...
- HDU1232——畅通工程
#include<stdio.h> ]; int find(int x) //查找根节点 { int r=x; while (pre[r]!=r) //返回根节点 r r=pre[r]; ...
- ORM框架SQLAlchemy使用学习
参考源:http://blog.csdn.net/fgf00/article/details/52949973 一.ORM介绍 如果写程序用pymysql和程序交互,那是不是要写原生sql语句.如果进 ...
- QT uic rcc moc 命令行使用
QT uic rcc moc 命令行使用 PS C:\Users\lsgx> uic.exe --help Usage: C:\Qt\Qt5.5.1\5.5\msvc2012\bin\uic.e ...